DOM突变事件的替代

由于DOM突变被W3C标记为废弃(见http://www.w3.org/TR/DOM-Level-3-Events/#events-mutationevents ),是否有一种(快速)替代方法来检测属性修改在DOM中?

据我所知,没有其他select(但),所以你坚持DOMAttrModified只有在Firefox和Opera支持。 在IE中你有onpropertychanged事件,但在Chrome / Safari中没有办法获得类似的function。 有很多事情可以做,具体取决于你想要完成什么,以及你正在瞄准的浏览器:

  • 将getter和setter定义为要监视的属性
  • 重写方法,如document.createAttributeattributes.setNamedItem ,…

我一直在研究跨浏览器的解决scheme,但没有取得太大的成功。 你应该远离突变事件,因为它们不是跨浏览器和非常缓慢的。 他们为什么被弃用有很好的理由。 如果你想了解更多,请阅读:

突变事件被弃用的原因是因为巨大的性能问题。

replace是Mutation Observers ,请看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每晚构build都支持此function。 Firefox 14也将支持这个function。

animationStart与CSSanimation结合使用,代替了不推荐使用的DOM *事件。 大卫·沃尔什写这个方法。

首先,设置关键帧并将其应用到您想要听的元素( 不要忘记供应商前缀! ):

 @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 

当当! 这是大卫的演示 。 对于我的Chrome扩展程序,它可以将Facebook图片添加到Google语音 (请参阅content.css和inject.js)。

一年之后 ,DOM级别4有了新的shiny的Mutation Observers (点击链接,他们解释了很多!)。 Mutation Event触发一千次的情况下, MutationObserver只会触发一次,包含所有修改并可访问。

适用于(截至2017/03):

  • Firefox 14+
  • IE 11
  • 边缘
  • Opera 15+
  • Chrome 26+(18到25前缀, window.WebKitMutationObserver
  • Safari 6.0(前缀, window.WebKitMutationObserver