从点获取DOM文本节点?

时间:2012-11-28 03:10:30

标签: javascript dom

就像我可以从document.elementFromPointdocument.getElementFromPoint的某个点获取元素一样,如果该点位于文本节点,是否可以以某种方式获取文本节点?我想如果至少我可以获得文本节点的位置和大小,那么我可以找出它们中包含哪个点。但是DOM节点没有位置属性。是否可以这样做?

4 个答案:

答案 0 :(得分:16)

这是一个适用于所有当前浏览器的实现: https://github.com/nuxodin/q1/blob/master/q1.dom.js

document.betaNodeFromPoint = function(x, y){
    var el = document.elementFromPoint(x, y);
    var nodes = el.childNodes;
    for ( var i = 0, n; n = nodes[i++];) {
        if (n.nodeType === 3) {
            var r = document.createRange();
            r.selectNode(n);
            var rects = r.getClientRects();
            for ( var j = 0, rect; rect = rects[j++];) {
                if (x > rect.left && x < rect.right && y > rect.top && y < rect.bottom) {
                    return n;
                }
            }
        }
    }
    return el;
};

答案 1 :(得分:1)

对于Firefox,您应该使用document.caretPositionFromPoint

这是一个傻瓜演示:https://developer.mozilla.org/en-US/docs/Web/API/document.caretPositionFromPoint

对于Chrome和Edge,请尝试document.caretRangeFromPoint(x,y)

答案 2 :(得分:0)

您可以使用element.nodeName查看它是否为文本节点,然后使用element.nodeValue作为其值。

答案 3 :(得分:0)

考虑此文件(fiddle):

<html>
<body>
    some text here 
    <p id="para1">lalala</p> 
    bla bla
</body>
</html>​

这段代码:

$(document).on('click', function(evt) {
    var elem = document.elementFromPoint(evt.clientX, evt.clientY);
    console.log(elem);
});

当您点击<p>标记内的任意位置时,会记录标记元素本身。但是,单击周围文本时,将返回<body>,因为文本片段不被视为元素。

<强>结论

使用elementFromPoint()无法完成您想要的任务,因为文本片段不会收到点击事件,我认为根本不可能。