2010-12-04 101 views
8

几个月前我创作了一个最近失败的Firefox插件。插件基本上查找特定的URL,然后修改该页面的DOM。我将失败追溯到“AVG安全搜索”附件的(意外)安装。我发现,在禁用AVG插件的情况下,DOMContentLoaded事件针对文档触发一次(行为我最初预期),但启用它后,DOMContentLoaded事件会针对文档触发两次。我的插件将一列插入到HTML表格中,因此事件触发两次,插入两个重复的列而不是一个。DOMContentLoaded事件为单个页面加载启动两次

这里是我的附加的蒸馏的初始化代码:

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附加组件中的错误/副作用?

回答

3

我不知道我是否会考虑这个“正常”,但外部应用程序影响插件操作的可能性是无穷无尽的。这就是说,我认为不管AVG是如何导致这个失败的,像你说的那样,聪明的事情是检查列插入之前是否存在,因为AVG可能不是唯一影响Firefox事件的外部应用程序触发。

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

总结:

  • 的Bug AVG?也许吧。
  • 您的插件性能受到许多其他来源的影响吗?绝对!
  • 解决方案:恕我直言,总是检查您的更改是否已作出 之前,为所有DOM项目进行实际更改才是安全的。
+0

那么它意味着我们需要做额外的工作,如笔者说他插入唯一的ID来停止多个呼叫? – 2011-05-18 15:36:22

1

尝试读取的jQuery bindReady方法:

https://github.com/jquery/jquery/blob/master/src/core.js

你会发现:

if (readyBound) { 
return; 
} 
readyBound = true; 

// Use the handy event callback 
document.addEventListener("DOMContentLoaded", DOMContentLoaded, false); 
// A fallback to window.onload, that will always work 
window.addEventListener("load", jQuery.ready, false);