Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DOM: determine if the anchorNode or focusNode is on the left side

Tags:

javascript

dom

This method...

window.getSelection().anchorNode

...tells us where the selection of text STARTS.

This method...

window.getSelection().focusNode

...tells us where the selection of text ENDS.

Since text can be selecting dragging left-to-right or right-to-left this does not INFER that the anchorNode is to the left of the focusNode.

What DOM/JavaScript method can be used to determine which referenced node is on the LEFT side of the text selection?

Clarification: this is to fix the bug for the startContainer() method (window.getSelection().getRangeAt(0).startContainer) and thus that is an invalid suggestion.

like image 613
John Avatar asked Nov 08 '25 14:11

John


2 Answers

You would usually use Node.compareDocumentPosition() on anchorNode and focusNode, "left" is the moral equivalent of DOCUMENT_POSITION_PRECEDING (unless you have an RTL text of course). I assume that you actually want to know which comes first in the document and not the position on screen. Something like this will work:

let selection = window.getSelection();
let position = selection.anchorNode.compareDocumentPosition(selection.focusNode);
if (position & Node.DOCUMENT_POSITION_FOLLOWING)
  alert("Left-to-right selection");
else if (position & Node.DOCUMENT_POSITION_PRECEDING)
  alert("Right-to-left selection");
else
  alert("Only one node selected");
like image 123
Wladimir Palant Avatar answered Nov 10 '25 23:11

Wladimir Palant


A method I've used for this uses the fact that setting the end of a DOM Range to be at an earlier point in the document than the start of the range will collapse the range:

function isSelectionBackwards() {
    var backwards = false;
    if (window.getSelection) {
        var sel = window.getSelection();
        if (!sel.isCollapsed) {
            var range = document.createRange();
            range.setStart(sel.anchorNode, sel.anchorOffset);
            range.setEnd(sel.focusNode, sel.focusOffset);
            backwards = range.collapsed;
            range.detach();
        }
    }
    return backwards;
}
like image 43
Tim Down Avatar answered Nov 10 '25 23:11

Tim Down



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!