【发布时间】:2011-09-09 20:33:54
【问题描述】:
我正在将此代码用于 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 上的事件监听器是否有可能忽略其他扩展导致的页面加载?
谢谢
【问题讨论】:
-
除了在 Wladimir 的回答中进行的讨论(这很好)之外,您可能希望避免使用
alert来处理此类问题,因为它会一直阻塞,直到用户单击“确定”。也许改用window.dump。 -
@MatrixFrog 我禁用了导致这些问题的插件并升级到 Firefox 4。我正在考虑接受他的回答,但如果可以只听 DOMContentLoaded 事件,我还是有点兴趣由浏览器(不是由其他插件)引起的。谢谢你的提示。我一直在寻找比
alert更好的选择。在哪里可以看到window.dump的输出? -
一般来说,其他插件不应触发 DOMContentLoaded 事件,但页面内的框架/iframe 会触发。您需要启用配置设置才能使用 window.dump。见developer.mozilla.org/en/DOM/window.dump
-
他们不应该,但“在后台”加载的链接在一个插件的数据库中(警报框 - 定期检查更改)。它们位于 e.target.URL 中。同样一些 chrome:// windows 和 about:blank
-
我认为这与您的问题没有直接关系,但我只想指出
removeEventListener调用实际上并没有像您认为的那样删除事件。在这两种情况下,您都传入了一个匿名函数,但它们不是 same 匿名函数。 JavaScript 每次定义时都会创建一个新的。为了真正删除事件侦听器,您需要将对该函数的引用保存在一个变量中,并将该变量传递给add和remove调用。
标签: javascript events firefox-addon addeventlistener