8

我正在尝试修复和问题我的代码。我最初使用 DOMNodeRemoved 和 DOMNodeInserted 来关注我正在处理的页面中的元素。它们运行良好,但在 IE 中不起作用。所以我开始尝试使用 MutationObserver。

这是我在 onPageInit 上调用的代码(回调写入控制台,但我禁用了它,因为 IE 不再支持控制台):

var callback = function(allmutations){
    allmutations.map( function(mr){
        var mt = 'Mutation type: ' + mr.type;  // log the type of mutation
        mt += 'Mutation target: ' + mr.target; // log the node affected.
        //console.log( mt );
    })
}
mo = new MutationObserver(callback),
options = {
    // required, and observes additions or deletion of child nodes.
    'childList': true, 
    // observes the addition or deletion of "grandchild" nodes.
    'subtree': true
}
alert('its alive');
mo.observe(document.body, options);

它在 chrome 中运行良好,但由于某种原因在 IE 中表现平平。我在加载页面时收到一个消息框,上面写着:

An unexpected error occurred in a script running on this page.
onPageInit(pageInit)
scriptname

JS_EXCEPTION
TypeError 'MutationObserver' is undefined

难道我做错了什么?附加信息:页面是一个网络套件页面,运行 jQuery 1.7.2(如果重要)

4

2 回答 2

20

如果您需要检测 IE10+(以及其他尚不支持的浏览器MutationObserver)中的 DOM 插入,您可以使用基于侦听animationstart事件的技巧来处理不影响节点外观的属性的 CSS 动画。

该技术是由 Daniel Buchner 发现的,您可以看到它在 David Walsh 的这篇文章中对其进行了描述

使其工作所需的代码将是这样的:

@keyframes animationName{ 
    from { outline: 1px solid transparent } 
    to { outline: 0px solid transparent } 
}
* { 
    animation-duration: 0.001s; 
    animation-name: animationName;
}

document.addEventListener('animationstart', insertionHandler, false);

这个技巧跨浏览器工作所需的设置非常复杂,包含所有前缀和事件侦听器名称。将为每个新节点调用处理程序,并且很难选择要设置动画的属性。

这就是为什么我将它包装在一个库中以使其易于使用: https ://github.com/naugtur/insertionQuery

这是一个简短的使用示例:

insertionQ('selector').every(function(element){
    //callback on every new element
});
于 2014-02-06T10:56:30.950 回答
9

该方法是在 IE11 中添加的,因此如果浏览器在兼容模式下运行 IE11 以外的任何内容,则该方法将不可用。

http://msdn.microsoft.com/en-us/library/ie/dn265034(v=vs.85).aspx

于 2013-12-04T19:02:55.717 回答