由于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. jQuery的DOM突变
- 5. PHP dom替换
- 6. Firefox:断开节点的DOM突变事件?
- 7. Click事件替换
- 8. 变换Html DOM
- 9. windows.location.href改变而handelng MutationObserver突变事件
- 10. 替换/替换记事本
- 11. 用touchmove事件替换mousemove
- 12. Regex.Replace()替换整个事件
- 13. 用事件替换innerhtml
- 14. jQuery on('hover')事件替换
- 15. PHP DOM文本替换
- 16. 替换DOM上的图像
- 17. DOM node.textContent解析和替换
- 18. DOM文档PHP替换TD
- 19. HTML DOM事件
- 20. onfullscreenchange DOM事件
- 21. 的Javascript内嵌DOM变化事件
- 22. 有没有“DOM变化”事件?
- 23. DOM事件的onResize
- 24. 使用替换时保留事件数据使用替换
- 25. DOM Level 0事件与DOM Level 2事件有什么区别?
- 26. 替换变量
- 27. 变量替换
- 28. 替换变量
- 29. 变量替换
- 30. 替换变量
你甚至可以考虑John Resig的NodeList - https://github.com/jeresig/nodelist但是,这仍然处于发展阶段,但似乎有希望成为替代突变事件的候选人。 – 2011-10-12 07:36:53