DOMContentLoaded只有一次

xra*_*alf 7 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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢

Wla*_*ant 1

DOMContentLoaded 通常每个文档仅触发一次,因此我怀疑您也从页面框架捕获事件。根据所提供的信息无法确定。

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

alert(function(e) { Test.f(); } == function(e) { Test.f(); });
Run Code Online (Sandbox Code Playgroud)

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

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