caretPositionFromPoint

caretPositionFromPoint

我正在对my "jump-to-anchor" add-on进行更新,这是Firefox的一项附加功能,使您可以右键单击文档中的某个位置,以(希望)获得距点击点最近的锚点。

提交附件之后,我意识到我可以通过找到实际单击的文本节点并从那里查找(而不是当前单击元素的第一个子节点)来改进算法。但是,在我的测试中(相对于我刚要阅读的页面http://tools.ietf.org/html/rfc5323#section-2.3.2),通过document.caretPositionFromPoint抓取的文本节点比预期的要高。

var x = 0, y = 0;
window.addEventListener('click', function (e) {
    if (e.button === 2) { // Avoid grabbing for the actual selection // Doesn't seem to execute on the final context menu click anyways
        x = e.pageX;
        y = e.pageY;
    }
});
self.on('click', function () { // , data
    // I added the next two lines just in case the user clicked off screen
    x = x > window.mozInnerScreenX ? window.mozInnerScreenX : (x < 0 ? 0 : x);
    y = y > window.mozInnerScreenY ? window.mozInnerScreenY : (y < 0 ? 0 : y);
    var caretPosition = document.caretPositionFromPoint(x, y);
    var node = caretPosition.offsetNode;

    // Doesn't grab the right node.nodeValue here always--seems to grab too high up

    // (Then search the node for an anchor, or recursively check the deepest child of the previous element sibling on up and keep looking for previous element siblings.)
});


听起来像个虫子?

更新:

重现步骤:


https://github.com/brettz9/jump-to-anchor/tree/document.caretPositionFromPoint安装XPI(或与SDK一起使用cfx xpi从源安装)
转到http://tools.ietf.org/html/rfc5323#section-2.3.2
尝试在第2.3.3节(请注意:2.3.3)中单击鼠标右键,可以看到它经常一直到达“#page-10”锚点而不是“#section-2.3.3”锚点。


(在Github的当前代码中,我已注释掉e.button === 2检查,但结果是相同的。)

最佳答案

原来,有关MDN的文档是完全错误的。 .caretPositionFromPoint期望you pass coordinates relative to the current viewport

因此,您必须使用e.clientX / e.clientY

此外,.mozInnerScreenX / Y并没有执行您可能期望的操作。如果要检查window.innerWidth.innerHeight是视口内的有效坐标,请使用x / y

所以这是我尝试过的方法,似乎起作用了(摘录):

var x = 0, y = 0;
window.addEventListener('click', function (e) {
        x = e.clientX;
        y = e.clientY;
});
self.on('click', function () { // , data
    x = Math.max(0, Math.min(innerWidth, x));
    y = Math.max(0, Math.min(innerHeight, y));
    var caretPosition = document.caretPositionFromPoint(x, y);
    var node = caretPosition.offsetNode;
    // ...
});

关于javascript - document.caretPositionFromPoint抓得太高,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24360624/

10-09 12:35