以下代碼利用DOM突變事件DOMNodeInserted
來檢測body
元素的存在並將其innerHTML
包裝爲包裝。DOM突變觀察者是否比DOM突變事件慢?
<!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>
儘管包裝成功,但有一個錯誤顯示未找到節點。 This answer的一個問題解釋說,這是因爲當jQuery被加載時,它添加了一個div
元素到主體中來做一些測試,但是它沒能移除那個div
元素,因爲那個元素已經被包裝進了包裝器,所以它不是身體的孩子元素了。
上面的實驗告訴我們,DOMNodeInserted
事件比jQuery的測試要快,因爲jQuery的測試元素(div
)在被jQuery刪除之前被包裝了。
現在下面的代碼可以實現同樣的操作,並且它使用新引進的DOM突變觀察。截至目前(2012-07-11),它僅適用於Chrome 18或更高版本。
<!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
)。
從以上兩個實驗中,我們發現,當它涉及到執行速度:
- DOM突變事件> jQuery的測試
- jQuery的測試> DOM突變觀察者
這個結果能否適當地證明DOM突變觀察者比DOM突變事件慢?
非常感謝@AshHeskes和很好的解釋!最後我瞭解他們的執行原則。 – 2012-07-31 04:45:50