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.createAttribute
,attributes.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
)