Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript domcontents只加载一次_Javascript_Events_Firefox Addon_Addeventlistener - Fatal编程技术网

Javascript domcontents只加载一次

Javascript domcontents只加载一次,javascript,events,firefox-addon,addeventlistener,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

我将此代码用于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上的事件侦听器是否可能忽略其他扩展导致的页面加载


谢谢

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);

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

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

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

@Wladimir Palent:我应该将代码粘贴到我的代码的何处来测试它?你应该将它粘贴到添加侦听器的位置-并从
test
@Wladimir中删除侦听器的尝试。你的意思是在我的代码的第6行和第7行之间粘贴你的两个代码段吗?不,我的意思是用第二个代码段替换第7行并删除第4行第一个代码片段只是为了举例说明我所说的。现在,代码只针对一个页面执行。当我重新加载其他页面时,它不是。但我理解,这是因为事件侦听器被删除了。所以我在
Test.f()之后再次添加了它
我又收到了许多警报。我注意到这些警报来自更多的选项卡。如果我只打开了一个选项卡,那就更好了,当firefox启动时,我只收到两个警报,然后看起来一切正常(到目前为止)。似乎我需要修改仅关注选项卡中的HTML内容(在DOMContentLoaded事件中)。除了Wladimir的答案中正在进行的讨论(这很好),您可能希望避免使用
alert
,因为在用户单击“确定”之前,它会一直阻塞。可以使用
window.dump
。@matrixprog I禁用了导致这些问题的加载项并升级到firefox 4。我正在考虑ac我接受他的答案,但我还是有点感兴趣,是否可以只听由浏览器(而不是其他插件)引起的DOMContentLoaded事件。谢谢你的提示。我正在寻找比
警报
更好的替代方法。我在哪里可以看到
窗口的输出。转储
?一般来说,其他加载项不应该触发DOMContentLoaded事件,但页面内的帧/iFrame会触发。你需要启用配置设置以使用window.dump。请参阅它们不应该触发,但链接会触发t被加载到一个插件的数据库中(alertbox-定期检查更改)。它们位于e.target.URL中。类似地,一些chrome://windows和about:blank我认为这与您的问题没有直接关系,但我只想指出,
removeEventListener
调用实际上并不像您认为的那样删除事件。在这两种情况下,您都传递了一个匿名函数,但它们并不相同匿名函数。JavaScript每次定义它们时都会创建一个新函数。为了真正删除事件侦听器,您需要在变量中保存对该函数的引用,并将该变量传递到
add
remove
调用中。我使用了
if(!e.originalTarget.defaultView.frameElement){…
但当我启用扩展时,问题仍然存在,我正在测试
警报(e.target.URL);
我正在获取下载其他扩展的URL。尝试使用扩展,在其中设置一些警报,您将看到。所以问题是,当打开不包含正常网页的窗口时,您会收到警报(例如扩展安装窗口)?如果我理解正确,您可能希望尝试警报(例如originalTarget.defaultView),因为我打赌有些是ChromeWindow对象,您可以过滤掉这些类型。从扩展加载的DOMContentLoaded的类型为
[object XrayWrapper[object window]]
它的类型与我重新加载普通内容时的类型相同。