几个月前我创作了一个最近失败的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附加组件中的错误/副作用?
那么它意味着我们需要做额外的工作,如笔者说他插入唯一的ID来停止多个呼叫? – 2011-05-18 15:36:22