假设以下 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"
,然而当你开始打字时,你会发现你真的不在锚里面。哇!?
这种行为背后有什么潜在的理由吗?有什么理由假设它不是 WebKit 错误?
感谢您的 0.02 美元。