以下代码利用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