Javascript - 我的内容在Firefox中没有触发DOMSubtreeModified事件!

时间:2011-03-21 09:02:14

标签: javascript events firefox dom addeventlistener

我面临一种奇怪的行为,我需要一些帮助......

当我尝试识别页面内容是否被修改时,我遇到了一种情况。我是用

做的
gBrowser.tabContainer.addEventListener("DOMSubtreeModified", function (e) { this.foo(e); }, false);

我也尝试过收听document.DOMSubtreeModified和window.DOMSubtreeModified。

但是,我有时会遇到这样一种情况:默认\选择的文档与我无关 - 可能是一些IFrame或商业内置或其他什么,底线我的内容被修改但是当盯着浏览器DOMSubtreeModified因为它听取了一个文件\没有确实没有修改过......所以不会开火......

你能帮我解释一下我的问题吗?我需要创建一些事件来识别为每个文档触发的任何内容修改(比如DOMSubtreeModified),以便我可以识别我的相关内容并进行处理吗?

非常感谢,

尼里

2 个答案:

答案 0 :(得分:2)

您可以通过在文档对象上为您感兴趣的元素中的每个<iframe>元素添加一个侦听器来显式侦听所有DOM修改:

function listenForDomModified(node, listener) {
    node.addEventListener("DOMSubtreeModified", listener, false);
    var iframes = node.getElementsByTagName("iframe");
    for (var i = 0, len = iframes.length, doc; i < len; ++i) {
        // Catch and ignore errors caused by iframes from other domains
        try {
            doc = iframes[i].contentDocument || iframes[i].contentWindow.document;
            doc.addEventListener("DOMSubtreeModified", listener, false);
        } catch (ex) {}
    }
}

listenForDomModified(gBrowser.tabContainer);

请注意,DOMSubtreeModified事件在Opera中根本不会触发,因此您的代码将无法在该浏览器中运行。

答案 1 :(得分:0)

               for FF 2, Safari, Opera 9.6+

               doc.addEventListener('DOMNodeInserted', callback, false);
               doc.addEventListener('DOMNodeRemoved', callback, false);