单次加载页面时触发两次DOMContent Loaded事件 [英] DOMContentLoaded event firing twice for a single page load

查看:0
本文介绍了单次加载页面时触发两次DOMContent Loaded事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

几个月前,我编写了一个Firefox插件,但最近失败了。该附加组件主要是查找特定的URL,然后修改页面的DOM。我将失败归因于(意外)安装了"AVG Safe Search"插件。我发现,在禁用AVG外接程序的情况下,DOMContent Loaded事件会为文档触发一次(我最初预期的行为),但是在启用它的情况下,DOMContent Loaded事件会为文档触发两次。我的外接程序将一列插入到一个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插件中的错误/副作用?

推荐答案

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

也就是说,我认为不管AVG是什么原因导致这种异常,明智的做法是像您所说的那样,在插入之前检查列是否存在,因为AVG可能不是唯一影响Firefox事件触发器的外部应用程序。

我非常厌倦DOM驱动的事件,因为在我自己的插件中,整个开发过程中对它的测试表明,基于如此多的变量(不同的操作系统、不同版本的FF、主机上的不同应用程序、任何给定用户FF内的不同插件等),存在大量异常。

总结:

  • AVG出现错误?可能。
  • 您的插件性能是否有可能受到许多其他来源的影响?绝对有可能!
  • 解决方案:IMHO-始终检查您的更改是否已完成 为了安全起见,在对所有DOM项进行实际更改之前。

这篇关于单次加载页面时触发两次DOMContent Loaded事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆