Déterminez quels éléments DOM la sélection de texte actuelle contient

Je veux savoir quels éléments DOM sont présents dans le texte actuellement sélectionné par l'utilisateur dans le navigateur.

Document.getSelection () nous obtiendrait le texte actuellement sélectionné. Mais comment déterminer les éléments DOM contenus dans cette sélection de texte?

window.getSelection() vous donne un objet de sélection . Utilisez selection.rangeCount et selection.getRangeAt() pour obtenir un objet Range représentant la sélection souhaitée.

Maintenant, vous pouvez obtenir le premier et le dernier noeud dans la sélection de range.startContainer / startOffset et range.endContainer / endOffset . Vous pouvez alors monter et descendre l'arbre pour ramasser tous les éléments entre ces deux positions, par exemple. En utilisant la fonction getElementsBetweenTree() partir de cette réponse .

Malheureusement, le modèle TextRange d'IE est totalement différent du standard W3 et HTML5, et en général, bien pire. Il n'abandonne pas les positions de début et de fin presque aussi facilement et pas de manière fiable. Tout ce que vous obtenez est parentElement pour vous dire l'ancêtre commun, et à partir de là, vous êtes limité à deviner où la gamme est basée sur la création d'une nouvelle gamme et en appelant moveToElementText , puis compareEndPoints avec la plage de sélection. Et si vous devez connaître la sélection de texte exacte, vous moveStart alors en fonction de moveStart / moveEnd la gamme et la comparaison, ce qui n'est pas du tout amusant.