温馨提示:本文翻译自stackoverflow.com,查看原文请点击:javascript - DOMContentLoaded event firing twice for a single page load
dom javascript event-handling firefox-addon

javascript - DOMContentLoaded事件针对单个页面加载触发两次

发布于 2020-03-29 22:06:32

几个月前,我写了一个Firefox插件,但最近失败了。插件基本上会查找特定的URL,然后修改页面的DOM。我将故障归因于“ AVG安全搜索”加载项的(偶然)安装。我发现,在禁用AVG加载项的情况下,为文档触发DOMContentLoaded事件一次(我原本期望的行为),但是在启用它的情况下,为文档触发DOMContentLoaded事件两次。我的附加组件在HTML表中插入一列,因此,由于该事件触发两次,因此将插入两个重复的列,而不是一个。

这是我的附件的提炼的初始化代码:

var hLoadListener = function(event) { myAddon.initialize(event); }
var hContentLoadedListener = function(event) { myAddon.onContentLoaded(event); }

myAddon.initialize = function(aEvent)
{
    gBrowser.addEventListener("DOMContentLoaded", hContentLoadedListener, false);
};

myAddon.onContentLoaded = function(aEvent)
{
    if (!(aEvent.originalTarget.nodeName === "#document")) { return; }

    var doc = aEvent.target; // document that triggered "onload" event

    if (!(doc instanceof HTMLDocument)) { return; }
    if (!doc.location) { return; }

    var href = doc.location.href; // URL of current page

    if (URLRegExp.test(href))
    {
      // Modify the page's DOM
    }
};

window.addEventListener("load", hLoadListener, false);

通过插入一个唯一的DOM元素,然后从一开始就对其进行测试,似乎很容易解决此问题。我的问题是,加载项开发人员是否应该期望此事件行为正常,还是该问题主要是AVG加载项中的错误/副作用?

查看更多

提问者
Jeremy Giron
被浏览
24
Purge 2010-12-21 00:11

我不知道我是否会认为这种“正常”,但是外部应用程序影响插件操作的可能性是无限的。

就是说,我认为无论AVG是否引起此异常,就像您所说的那样,明智的做法是在插入之前检查列是否存在,因为AVG可能不是唯一会影响firefox事件触发器的外部应用程序。

我对DOM驱动的事件感到非常厌倦,因为在我自己的插件中进行了测试,并且在整个开发过程中对它的测试表明,基于如此多的变量(不同的OS,不同的FF版本,主机上的不同应用程序,内部的不同插件),异常情况很多任何给定的用户FF等。)

总结一下:

  • AVG中的错误?也许。
  • 您的插件性能是否有可能受到许多其他来源的影响?绝对!
  • 解决方案:恕我直言-为了安全起见,在对所有DOM项目进行实际更改之前,请务必检查是否已进行更改。