0

Element与えられた周囲の sを見つける最もクリーンな方法は何だろうかMutationRecord?

MutationRecord.nextSibling、プロパティが.previousSiblingありますが、テキスト ノードが含まれている可能性があり、通常の要素ノードを取得する必要があります。

実際の例はこちら: http://jsfiddle.net/tomalec/ceku2/

使ってみた

mutation.addedNodes[0].previousElementSibling;
mutation.addedNodes[mutation.addedNodes.length - 1].nextElementSibling);

http://jsfiddle.net/tomalec/Q2HFY/2/

ただし、少し危険に見えます。削除されたものにはまったく機能しません。

mutation.removedNodes[0].previousElementSibling; //null
mutation.removedNodes[mutation.removedNodes.length - 1].nextElementSibling); //null

http://jsfiddle.net/tomalec/Q2HFY/3/

4

1 に答える 1

1

それは間違いなく危険です。MutationRecord はバッチ処理されるため、DOM の現在の状態では、ミューテーションの周囲のノードを特定することが困難になる場合があります。たとえば、MutationObserver に送信された 2 つの MutationRecords がある場合、2 番目の MutationRecord は最初の MutationRecord の周囲のノードを削除した可能性があります。つまり、単純なDOM インスペクションではそれを行うことができません。

問題を具体化するには、次の html を使用します。

<ul><li>One</li><li>Two</li><li>Three</li></ul>

そして、このJavaScript:

var ul = document.querySelector('ul');
while (ul.lastChild) ul.removeChild(ul.lastChild);

ミューテーション オブザーバーは 2 つのミューテーション レコードを取得するため、それらが関連していることを確認するには、手の込んだ作業を行う必要があります。そのアルゴリズムがどのように見えるか、またはすべての状況で可能かどうかはわかりません.

とにかく、これが私のjsfiddleの例です:

http://jsfiddle.net/theazureshadow/88egh/

MutationObserver が処理しなければならないケースを制限できれば、もっと簡単でスマートなことができるかもしれません。

于 2014-06-14T03:02:53.317 に答える