Comment puis-je obtenir L'élément DOM qui contient la sélection courante?

Vous pouvez sélectionner une partie d'une page web avec la souris.

je sais que je peux obtenir le texte actuellement sélectionné mais comment puis-je obtenir L'élément DOM qui contient le début ou la fin de la sélection courante?

32
demandé sur Aaron Digulla 2009-08-26 18:47:39

2 réponses

Dans IE, utilisez document.sélection.createRange ().parentElement () et dans les navigateurs réels utilisent window.getSelection ().getRangeAt (0).startContainer.parentNode. Quelque chose comme ceci:

function getSelectedNode()
{
    if (document.selection)
        return document.selection.createRange().parentElement();
    else
    {
        var selection = window.getSelection();
        if (selection.rangeCount > 0)
            return selection.getRangeAt(0).startContainer.parentNode;
    }
}
26
répondu InvisibleBacon 2009-08-26 14:57:19

La suite sera de retour le conteneur l'élément de la limite de début ou de fin de la sélection courante, en utilisant le booléen isStart pour spécifier si vous voulez la limite de début ou de fin. Il fonctionnera dans la plupart des navigateurs grand public. Ajouter des tests de fonctionnalité pour plus de Robustesse.

function getSelectionBoundaryElement(isStart) {
    var range, sel, container;
    if (document.selection) {
        range = document.selection.createRange();
        range.collapse(isStart);
        return range.parentElement();
    } else {
        sel = window.getSelection();
        if (sel.getRangeAt) {
            if (sel.rangeCount > 0) {
                range = sel.getRangeAt(0);
            }
        } else {
            // Old WebKit
            range = document.createRange();
            range.setStart(sel.anchorNode, sel.anchorOffset);
            range.setEnd(sel.focusNode, sel.focusOffset);

            // Handle the case when the selection was selected backwards (from the end to the start in the document)
            if (range.collapsed !== sel.isCollapsed) {
                range.setStart(sel.focusNode, sel.focusOffset);
                range.setEnd(sel.anchorNode, sel.anchorOffset);
            }
       }

        if (range) {
           container = range[isStart ? "startContainer" : "endContainer"];

           // Check if the container is a text node and return its parent if so
           return container.nodeType === 3 ? container.parentNode : container;
        }   
    }
}
54
répondu Tim Down 2013-07-17 10:17:07