我正在使用此代码进行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上的事件监听器是否可能忽略其他扩展导致的页面加载?
谢谢
答案 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);