次のコードは、DOM Mutation Eventを利用して要素DOMNodeInserted
の存在を検出し、それをラッパーにラップします。body
innerHTML
<!DOCTYPE html>
<html lang="en">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>
function DOMmanipulation() {
if (document.body) {
document.removeEventListener('DOMNodeInserted', DOMmanipulation);
// DOM manipulation start
document.body.innerHTML = '<div class="wrapper">' + document.body.innerHTML + '</div>';
// DOM manipulation end
}
}
document.addEventListener('DOMNodeInserted', DOMmanipulation);
</script>
</head>
<body>
<p>Lorem ipsum dolor sit amet.</p>
</body>
</html>
また、ラッピングが成功したにもかかわらず、ノードが見つからなかったことを示すエラーがあります。この質問の回答は、jQueryが読み込まれたときに、いくつかのテストを行うために要素を本体に追加したが、その要素が子ではないようにラッパーにラップされているため、その要素div
を削除できなかったためであると説明しましたdiv
もう体の要素。
上記の実験は、jQueryのテスト要素( )がjQueryによって削除される前にラップされたDOMNodeInserted
ため、イベントがjQueryのテストよりも高速であることを示しています。div
これで、次のコードで同じ操作を実行でき、新しく導入されたDOMMutationObserversを使用しています。現時点(2012-07-11)では、Chrome18以降でのみ動作します。
<!DOCTYPE html>
<html lang="en">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>
var observer = new WebKitMutationObserver(function() {
if (document.body) {
observer.disconnect();
// DOM manipulation start
document.body.innerHTML = '<div class="wrapper">' + document.body.innerHTML + '</div>';
// DOM manipulation end
}
});
observer.observe(document, { subtree: true, childList: true });
</script>
</head>
<body>
<p>Lorem ipsum dolor sit amet.</p>
</body>
</html>
このコードはエラーを生成しませんでした。つまり、jQueryはDOM Mutation Observersよりも高速であるため、そのdiv
要素をラッパーにラップする前に、テスト要素()を削除することができました。
上記の2つの実験から、実行速度に関しては次のことがわかります。
- DOMミューテーションイベント>jQueryのテスト
- jQueryのテスト>DOMMutation Observers
この結果は、DOMミューテーションオブザーバーがDOMミューテーションイベントよりも遅いことを適切に証明できますか?