次の 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 のバグではないと仮定する理由はありますか??
$.02 ありがとうございます。