Javascript DOMNodeInserted等效于IE?

Javascript DOMNodeInserted等效于IE?,javascript,internet-explorer,dom,mutation-events,Javascript,Internet Explorer,Dom,Mutation Events,除了使用计时器计算一段时间内元素的数量并寻找变化外,我想不出更好的方法来模拟这个事件 是否有某种专有的IE版本的DOMNodeInserted?谢谢。不,没有。最近的是propertychange事件,该事件响应元素的属性或CSS属性的更改而激发。它在直接更改元素的innerHTML属性时触发,但在通过其他方式更改元素内容时(例如,通过使用DOM方法,如appendChild()或通过更改子元素的innerHTML)不会触发 2014年2月6日更新 正如评论中所指出的,有一个变通办法。这是基于一

除了使用计时器计算一段时间内元素的数量并寻找变化外,我想不出更好的方法来模拟这个事件


是否有某种专有的IE版本的DOMNodeInserted?谢谢。

不,没有。最近的是
propertychange
事件,该事件响应元素的属性或CSS属性的更改而激发。它在直接更改元素的
innerHTML
属性时触发,但在通过其他方式更改元素内容时(例如,通过使用DOM方法,如
appendChild()
或通过更改子元素的
innerHTML
)不会触发

2014年2月6日更新
正如评论中所指出的,有一个变通办法。这是基于一个精心设计的黑客,我建议尽可能使用变异观察员。有关详细信息,请参见@naugtur的答案@naugtur的答案已被删除,但可以在

找到解决方案。您可以超越所有DOM操作方法—appendChild、insertBefore、replaceChild、insertAdjacentHTML等—并使用onpropertychange监视innerHTML

您可能会想出一个满足您需求的解决方案

顺便说一句,看来DOMNodeInserted等将在未来被浏览器弃用。
参见

似乎,DHTML行为可以在IE中用于模拟
域导入
onreadystatechange将在IE中工作。DHTML行为必须通过htc附加到元素,但htc文件不必存在:

if (!!document.addEventListener)
  {
  $(domnode).get(0).addEventListener("DOMNodeInserted", fixtext, false);
  }
else
  {
  $(domnode).get(0).addBehavior("foo.htc");
  $(domnode).get(0).attachEvent("onreadystatechange", fixtext);
  }

按照Paul Sweatte的建议使用onreadystatechange实际上不起作用。readystatechange事件仅在加载foo.htc时触发。它与更改DOM节点无关

我摆好了一把小小提琴来演示它。看一看或看一看

HTML:


如您所见:即使没有进行DOM操作,也会发生readystatechange事件。

一个棘手的解决方法是拦截元素类型的原型方法,如下所示:

window.attachEvent('onload', function() {
    invokeNodeInserted(document);
    (function(replace) {
        Element.prototype.appendChild = function(newElement, element) {
            invokeNodeInserted(newElement);
            return replace.apply(this, [newElement, element]);
        };
    })(Element.prototype.appendChild);
    (function(replace) {
        Element.prototype.insertBefore = function(newElement, element) {
            invokeNodeInserted(newElement);
            return replace.apply(this, [newElement, element]);
        };
    })(Element.prototype.insertBefore);
    (function(replace) {
        Element.prototype.replaceChild = function(newElement, element) {
            invokeNodeInserted(newElement);
            return replace.apply(this, [newElement, element]);
        };
    })(Element.prototype.replaceChild);
});

好奇的是,您在哪里看到了关于DOMNodeInserted的弃用部分?@Anurag注意:MutationEvent接口是在domlevel2事件中引入的,但是还没有在用户代理之间完全和可互操作地实现。此外,有人批评说,设计的接口会带来性能和实现方面的挑战。一个新的规范正在开发中,其目的是解决突变事件解决的用例,但以更高效的方式。因此,本规范完整地描述了突变事件,但不推荐同时使用MutationEvent接口和MutationNameEvent接口。知道新规范可能是什么,或者在哪里实现了吗?“使用OnPropertyChange监视innerHTML。”-我不明白。如果innerHTML被更改,onpropertychange将不会触发()@ripper234:从您引用的页面:“更改子元素的innerText或innerHTML不会导致父元素触发onpropertychange事件。”您能详细说明一下吗?您没有说太多。如果您确实有解决方案,请在此处提供。这里没有错误语句的位置;div.onpropertychange=function(){var e=window.event;警报(e.propertyName+“:“+this[e.propertyName]);};文件.正文.附件(div);div.innerHTML=“你好”;无效(0)@肖恩:好吧,我不清楚。我的意思是,
propertychange
不会在元素的内容以任何方式更改时触发
innerHTML
,而不是直接设置其
innerHTML
属性,这使得它作为
DOMNodeInserted
的解决方案几乎毫无用处。我已更新我的答案。请参阅我的答案。模拟这一事件是可能的,而且已经完成了,尽管这可能比它的价值更大。@Sean:我看到了。覆盖所有可能改变DOM的DOM方法和属性是不可能的,所以作为一个通用解决方案,这是不可能的+
function bar(e) {
    var state = $('#fooDiv').get(0).readyState;
    alert (state);
}

$("#fooBtn").on("click", function(){
    $('#fooDiv').get(0).addBehavior("foo.htc");
    $('#fooDiv').get(0).attachEvent("onreadystatechange", bar);
});
window.attachEvent('onload', function() {
    invokeNodeInserted(document);
    (function(replace) {
        Element.prototype.appendChild = function(newElement, element) {
            invokeNodeInserted(newElement);
            return replace.apply(this, [newElement, element]);
        };
    })(Element.prototype.appendChild);
    (function(replace) {
        Element.prototype.insertBefore = function(newElement, element) {
            invokeNodeInserted(newElement);
            return replace.apply(this, [newElement, element]);
        };
    })(Element.prototype.insertBefore);
    (function(replace) {
        Element.prototype.replaceChild = function(newElement, element) {
            invokeNodeInserted(newElement);
            return replace.apply(this, [newElement, element]);
        };
    })(Element.prototype.replaceChild);
});