DOMContentLoaded只有一次

时间:2011-06-07 07:34:49

标签: javascript events firefox-addon addeventlistener

我正在使用此代码进行firefox扩展

1: var Test {
2:  f: function() {
3:    alert("DOM content loaded");
4:    window.removeEventListener("DOMContentLoaded", function(e) { Test.f(); }, false);
5:  }
6: }
7: window.addEventListener("DOMContentLoaded", function(e) { Test.f(); }, false);

当加载DOM内容(weg页面)时,它应该在函数f()中执行代码,这意味着如果我打开新页面或新选项卡或重新加载页面,它应该给我一个警报。问题是,它给了我大约20个警报,而不是一个。
如果我想在函数f()中附加一些文本(例如,如果我想附加文本“(com)”它将附加“(com)(com)(com)(com)( COM)“

你知道如何实现我想要的行为吗? removeEventListener没有帮助。

罪魁祸首似乎是其他firefox扩展和about:blank。 DOMContentLoaded上的事件监听器是否可能忽略其他扩展导致的页面加载?

谢谢

2 个答案:

答案 0 :(得分:1)

DOMContentLoaded通常每个文档只触发一次,所以我怀疑你也是从页面框架中捕获事件。无法用所提供的信息确定。

我可以告诉你为什么你无法删除监听器。 function(e) { Test.f(); }是一个闭包,每次运行此代码时都会创建一个新函数。因此,您添加为侦听器的功能与您删除的功能不同。请尝试以下示例:

alert(function(e) { Test.f(); } == function(e) { Test.f(); });

为了避免这个问题,你需要实际记住你的闭包,例如:

var listener = function(e)
{
    window.removeEventListener("DOMContentLoaded", listener, false);
    Test.f();
}
window.addEventListener("DOMContentLoaded", listener, false);

答案 1 :(得分:1)

您需要测试是否由帧加载或主文档加载触发DOMContentLoaded,并且只在后一种情况下执行您的函数:

    var Test {
        f: function() {
            if (!event.originalTarget.defaultView.frameElement) {
                alert("DOM content loaded");
            }
        }
    }

    window.addEventListener("DOMContentLoaded", function(e) { Test.f(); }, false);