下面的代碼使用DOMNodeInserted
對body
元素插入DOM後執行DOM操作。我知道$(document).ready(function { });
就足夠完成這項工作,但我想測試DOMNodeInserted
事件。DOMNodeInserted在對主體執行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
}
}
if (document.addEventListener) {
document.addEventListener('DOMNodeInserted', DOMmanipulation);
}
</script>
</head>
<body>
<p>Lorem ipsum dolor sit amet.</p>
</body>
</html>
正如你所看到的,DOM操作是的body
所有innerHTML
包裝成<div class="wrapper"></div>
。
它確實有效。然而,一件奇怪的事發生了。如果您使用Firebug或Chrome開發人員工具來檢查被操縱的body
,您會發現有一個神祕的元素被添加。它是:
<div style="padding: 0px; margin: 1px 0px 0px; border: 0px none; visibility: hidden; width: 0px; height: 0px; position: static; top: 0px;"></div>
而且儘管操作成功,螢火顯示了這個錯誤:
- 節點沒有被發現(jquery.min.js 2號線)
和Chrome開發人員工具顯示此錯誤:
- 未捕獲錯誤:NOT_FOUND_ERR:DOM異常8(jquery.min.js第2行)
但如果操作是剛剛加入的className,沒有錯誤:
document.body.className += ' js';
最奇怪的是,如果刪除了jQuery的參考,該事件將無法工作。這是否意味着本地DOMNodeInserted
事件有時需要jQuery才能正常工作?
順便說一句,如果DOM操作使用jQuery的語法:
$('body').wrapInner('<div class="wrapper"></div>');
然後神祕的元素變得更加怪異:
<div style="padding: 0px; margin: 1px 0px 0px; border: 0px; visibility: hidden; width: 0px; height: 0px; position: static; top: 0px; zoom: 1; ">
<div style="position: absolute; top: 0px; left: 0px; width: 1px; height: 1px; padding: 0px; margin: 1% 0px 0px; border: 0px; visibility: hidden; ">
<div style="position: relative; top: 0px; left: 0px; width: 1px; height: 1px; padding: 0px; margin: 0px; border: 5px solid rgb(0, 0, 0); display: block; overflow: hidden; ">
<div style="padding: 0px; margin: 0px; border: 0px; display: block; overflow: hidden; "></div>
</div>
<table style="position:absolute;top:0;left:0;width:1px;height:1px;padding:0;margin:0;border:5px solid #000;" cellpadding="0" cellspacing="0"><tbody><tr><td></td></tr></tbody></table>
</div>
</div>
綜上所述,我們可以看到以上實驗中的三個問題:
- 怪異的元素(一個或多個)被添加
- 發生了錯誤,儘管DOM操作的成功
DOMNodeInserted
有時似乎需要jQuery的工作
任何解釋,將不勝感激。謝謝。
感謝@Andreas解釋這個問題! – 2012-07-10 06:35:48
@IanY。我錯過了第三部分^^看看我的編輯 – Andreas 2012-07-10 07:54:32
非常感謝你,@Andreas。現在我明白了 :) – 2012-07-10 08:17:26