Firefox扩展开发中“加载”事件处理程序的问题

时间:2011-07-04 06:38:05

标签: firefox javascript-events event-handling dialog firefox-addon

我正在编写一个firefox扩展,但由于正确地获得了正确的事件,因此存在用户交互问题。我的扩展应完成以下任务:

  • 检查某些结构上当前查看的浏览器标签
  • 做一些后端服务器调用
  • 打开对话框
  • 将用户重定向到着陆页

到目前为止一切顺利,它确实有效。我使用以下eventHandler启动序列:

window.gBrowser.selectedTab.addEventListener("load",function(){ Fabogore.Load();},true);
打开对话框后,我尝试从对话框中删除EventHandler:

window.opener.gBrowser.selectedTab.removeEventListener("load",function(){Fabogore.Load();},true);

但序列一次又一次被触发,eventlistener获取每个标签的每个加载事件,尽管我使用了selectedTab?所以Dialog一次又一次弹出。我也尝试在原始Javascript中关闭事件处理程序。

任何猜测?在此先感谢:)

1 个答案:

答案 0 :(得分:0)

这很容易解释 - 您添加为监听器的功能和您删除的功能是不同的。尝试运行此代码:

alert(function(){ Fabogore.Load();} == function(){ Fabogore.Load();});

这将显示false,每次在代码中定义一个函数时,都会创建一个 new 函数。要解决您的问题,您需要定义一个函数,存储对它的引用并使用它来添加和删除监听器:

var listener = function(){ Fabogore.Load();};
var listenerTab = window.gBrowser.selectedTab;
listenerTab.addEventListener("load", listener, true);
[...]
listenerTab.removeEventListener("load", listener, true);

请注意,我还将window.gBrowser.selectedTab的值存储在变量中 - 当您决定删除侦听器时,所选的选项卡可能已经更改。您希望从添加它的选项卡中删除侦听器,而不是其他选项卡。