就像我可以从document.elementFromPoint
或document.getElementFromPoint
中获取一个元素一样,如果该点位于文本节点,是否有可能以某种方式获取文本节点?我想如果至少我可以获得文本节点的位置和大小,那么我可以找出它们中包含哪个点。但是DOM节点没有位置属性。是否可以这样做?
这是一个适用于所有当前浏览器的实现: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;
};
对于Firefox,您应该使用document.caretPositionFromPoint
这是一个greap演示:https://developer.mozilla.org/en-US/docs/Web/API/document.caretPositionFromPoint
对于Chrome和Edge,请尝试使用document.caretRangeFromPoint(x,y)
您可以使用element.nodeName
查看它是否为文本节点,然后使用element.nodeValue
作为其值。
考虑到这份文件(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()
完成你想要的东西是不可能的,因为文本片段没有收到点击事件,我认为根本不可能。