使用
JavaScript,我想从像素位置创建一个折叠的范围,以便在此位置标识的范围之后,在文档流中插入新节点.
这可以通过Internet Exporer(moveToPoint(x,y)方法)中的TextRange对象来完成.
我如何在FireFox& WebKit的?
我可以从document.elementFromPoint(x,y)的位置获取容器元素.但是,当位置恰好位于文本节点内时,如何获取有关构建范围所需的文本偏移量的更多信息?
解决方法
以下是我对旧浏览器的caretRangeFromPoint的实现:
@H_404_12@if (!document.caretRangeFromPoint) {
document.caretRangeFromPoint = function(x,y) {
var log = "";
function inRect(x,y,rect) {
return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;
}
function inObject(x,object) {
var rects = object.getClientRects();
for (var i = rects.length; i--;)
if (inRect(x,rects[i]))
return true;
return false;
}
function getTextNodes(node,x,y) {
if (!inObject(x,node))
return [];
var result = [];
node = node.firstChild;
while (node) {
if (node.nodeType == 3)
result.push(node);
if (node.nodeType == 1)
result = result.concat(getTextNodes(node,y));
node = node.nextSibling;
}
return result;
}
var element = document.elementFromPoint(x,y);
var nodes = getTextNodes(element,y);
if (!nodes.length)
return null;
var node = nodes[0];
var range = document.createRange();
range.setStart(node,0);
range.setEnd(node,1);
for (var i = nodes.length; i--;) {
var node = nodes[i],text = node.nodeValue;
range = document.createRange();
range.setStart(node,0);
range.setEnd(node,text.length);
if (!inObject(x,range))
continue;
for (var j = text.length; j--;) {
if (text.charCodeAt(j) <= 32)
continue;
range = document.createRange();
range.setStart(node,j);
range.setEnd(node,j + 1);
if (inObject(x,range)) {
range.setEnd(node,j);
return range;
}
}
}
return range;
};
}