由於DOM突變被w3c標記爲廢棄(請參閱http://www.w3.org/TR/DOM-Level-3-Events/#events-mutationevents),是否有(快速)替代方法來檢測DOM中的屬性修改?DOM突變事件替換
回答
據我所知,目前還沒有其他選擇,因此您只能在Firefox和Opera中支持DOMAttrModified
。在IE中,您有onpropertychanged
事件,但在Chrome/Safari中無法獲得類似的功能。有一些事情你可以根據你所要完成的是什麼,你是靶向瀏覽器:
- 定義getter和setter要監視
- 覆蓋的方法,如
document.createAttribute
屬性,attributes.setNamedItem
,...
我一直在研究跨瀏覽器的解決方案,但沒有取得太大的成功。你應該遠離突變事件,因爲它們不是跨瀏覽器和非常緩慢的。 他們被棄用的原因有很好的理由。如果您想了解更多閱讀:
我認爲Mozilla傢伙[完成你的工作](http://stackoverflow.com/a/13835369/237285)。 :) – 2012-12-12 08:15:56
是突變事件已被否決是因爲巨大的性能問題的原因。
更換爲突變觀察,看http://updates.html5rocks.com/2012/02/Detect-DOM-changes-with-Mutation-Observers和https://developer.mozilla.org/en/DOM/DOM_Mutation_Observers
約突變信息傳遞到觀察員MutationRecords的有序序列,代表有發生
樣品使用情況變化的觀察序列:
var observer = new MutationObserver(function(mutationRecords) {
// Handle mutations
});
observer.observe(myNode,
{ // options:
subtree: true, // observe the subtree rooted at myNode
childList: true, // include information childNode insertion/removals
attribute: true // include information about changes to attributes within the subtree
});
這在Chrome 18和Firefox和Webkit每晚構建中都受支持。 Firefox 14也將支持這個功能。
「選項」對象字面值中的分號應爲逗號。 – Holf 2013-05-21 16:46:13
一年之後,DOM 4級有新的閃亮Mutation Observers
(按照鏈接,他們解釋了很多!)。如果一個Mutation Event
發射了一千次,MutationObserver
只有一次包含和可訪問的所有修改觸發。
Works的(作爲2017/03):
- 火狐14+
- IE 11
- 邊緣
- 歌劇15+
- 鉻26+(18至25爲前綴,
window.WebKitMutationObserver
) - Safari 6。0(前綴,
window.WebKitMutationObserver
)
的棄用DOM一個偉大的替換*事件與CSS動畫結合animationStart
。關於該方法的David Walsh writes。
首先,設置關鍵幀,並把它應用到你想監聽的元素(不要忘了供應商前綴!):
@keyframes nodeInserted {
from { clip: rect(1px, auto, auto, auto); }
to { clip: rect(0px, auto, auto, auto); }
}
#parentElement > li {
animation-duration: 0.001s;
animation-name: nodeInserted;
}
接下來,添加監聽器:
var insertListener = function(event){
if (event.animationName == "nodeInserted") {
// This is the debug for knowing our listener worked!
// event.target is the new node!
console.warn("Another node has been inserted! ", event, event.target);
}
}
document.addEventListener("animationstart", insertListener, false); // standard + firefox
document.addEventListener("MSAnimationStart", insertListener, false); // IE
document.addEventListener("webkitAnimationStart", insertListener, false); // Chrome + Safari
Ta-da!這裏是David's demo。它適用於我的Chrome擴展程序adds Facebook pictures to Google Voice(請參閱content.css和inject.js)。
另請參閱[naugtur的偉大工作](http://stackoverflow.com/a/15328624/237285)。 – 2013-05-25 02:27:25
順便說一下。 'clip:rect'不會在IE10中觸發事件。我前段時間修復了它 – naugtur 2014-02-03 12:01:11
- 1. DOM突變事件的庫?
- 2. DOM突變觀察者是否比DOM突變事件慢?
- 3. 替換DOM可變
- 4. PHP dom替換
- 5. Firefox:斷開節點的DOM突變事件?
- 6. 變換Html DOM
- 7. windows.location.href改變而handelng MutationObserver突變事件
- 8. Regex.Replace()替換整個事件
- 9. 用事件替換innerhtml
- 10. DOM node.textContent解析和替換
- 11. 有沒有「DOM變化」事件?
- 12. onfullscreenchange DOM事件
- 13. VueJs - DOM不更新的陣列突變
- 14. 使用替換時保留事件數據使用替換
- 15. graphQL多重突變事務
- 16. 替換變量
- 17. 替換變量
- 18. 變量替換
- 19. DOM Level 0事件與DOM Level 2事件有什麼區別?
- 20. Oracle:替換多個字符串事件
- 21. 如何用GreaseMonkey替換onclick事件?
- 22. Xamarin - 替換TextChanged()上的QR碼事件
- 23. 添加onclick事件替換爲jquery
- 24. LogParser - 事件日誌數據值替換
- 25. Ant在xml中替換特定事件
- 26. dplyr突變替換基於以有效的方式
- 27. 像「onclick」和「onmouseover」等標準DOM事件的替代品?
- 28. PHP排序DOM元素和替換
- 29. jQuery:替換DOM中的嵌套元素
- 30. 使用PHP的DOM類替換DOMNode
你甚至可以考慮John Resig的NodeList - https://github.com/jeresig/nodelist但是,這仍然處於發展階段,但似乎有希望成爲替代突變事件的候選人。 – 2011-10-12 07:36:53