单次加载页面时触发两次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项进行实际更改之前。
相关文章