DOM:确定anchorNode或focusNode是否在左侧

时间:2012-05-22 21:54:37

标签: javascript dom

这种方法......

window.getSelection().anchorNode

...告诉我们选择文本STARTS的位置。

这种方法......

window.getSelection().focusNode

...告诉我们在哪里选择文字ENDS。

由于文字可以选择从左向右或从右向左拖动,因此不会推断anchorNode位于focusNode的左侧。

可以使用哪种DOM / JavaScript方法来确定哪个引用节点位于文本选择的左侧?

澄清:这是为了修复startContainer()方法(window.getSelection().getRangeAt(0).startContainer)的错误,因此这是一个无效的建议。

2 个答案:

答案 0 :(得分:6)

您通常会在anchorNodefocusNode上使用Node.compareDocumentPosition(),“左”是DOCUMENT_POSITION_PRECEDING的道德等值(除非您当然有RTL文本)。我假设您实际上想知道哪个先于文档而不是屏幕上的位置。这样的事情会起作用:

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");

答案 1 :(得分:2)

我用于此的方法使用以下事实:将DOM范围的结尾设置为文档中的早于该范围的开头将折叠该范围:

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;
}