【发布时间】:2013-09-03 13:25:13
【问题描述】:
假设以下 DOM 树:
<div id="edit" contenteditable="true">
this content <a id="link" href="http://www.google.com/">contains</a> a link
</div>
然后在锚点之后创建一个范围:
var r = document.createRange();
var link = document.getElementById('link');
r.setStartAfter(link);
r.setEndAfter(link);
正如所料,它的commonAncestorContainer是id为edit的元素:
console.log(r.commonAncestorContainer); /* => <div id="edit" contenteditable="true">…</div> */
将选择设置为这个范围:
var s = window.getSelection();
s.removeAllRanges();
s.addRange(r);
现在查询当前选择范围的窗口并检查其commonAncestorContainer:
var r2 = s.getRangeAt(0);
console.log(r2.commonAncestorContainer);
你会发现在 Firefox 中结果和预期的一样; id 为edit 的相同元素。
在 WebKit 浏览器中,选择范围的祖先容器突然变成了锚点内的文本节点; "contains",然而当你开始打字时,你会发现你真的不在锚里面。 WTF!?
这种行为背后有什么潜在的理由吗?有什么理由认为它不是 WebKit 错误??
感谢您的 $.02。
【问题讨论】:
-
哦,所以您是说该属性正在为您将要编辑的元素返回不正确的元素?
-
我是说 WebKit 返回的范围与我们刚刚分配给它的范围、Firefox 的行为以及浏览器对用户的行为方式不一致。
-
我明白你现在在说什么,我一直在这里查看 Range 文档:dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#concept-range,我想你可能发现了一个可能需要报告的错误。
-
@ars265:这不是错误。
-
@TimDown,不是吗?如果 Range 对象最初包含节点,为什么它不保留继承的端点,或者文档中的以下内容对此进行了描述:
The content that one would think of as being within the range consists of all contained nodes, plus possibly some of the contents of the start node and end node if those are Text or Comment nodes.并且由于 begin 和 endpoint 不是文本节点,因此它们被删除了?
标签: javascript dom webkit range selection