Javascript Firefox扩展:加载页面时运行

Javascript Firefox扩展:加载页面时运行,javascript,firefox-addon,dom-events,Javascript,Firefox Addon,Dom Events,我正在尝试编写firefox扩展,它将在加载(特定)页面时运行(它将是相同的关键字替换) 我编写的代码如下: window.addEventListener("load", function() maApp.init(); }, false); var maApp= { init: function() { var appcontent = document.getElementById("appcontent"); // browser if(appcontent)

我正在尝试编写firefox扩展,它将在加载(特定)页面时运行(它将是相同的关键字替换)

我编写的代码如下:

window.addEventListener("load", function()  maApp.init(); }, false);
var maApp= {

  init: function() {
    var appcontent = document.getElementById("appcontent");   // browser
    if(appcontent)
      appcontent.addEventListener("DOMContentLoaded", maApp.onPageLoad, true);
    var messagepane = document.getElementById("messagepane"); // mail
    if(messagepane)
      messagepane.addEventListener("load", function(event) { maApp.onPageLoad(event); }, true);
  },
    onPageLoad: function() {
           alert("test);
        doSomething();
    }                       
};

但onPageLoad永远不会运行。。。没有警报。。。有人能告诉我我做错了什么吗?

首先谈谈获取浏览器元素。在Firefox中,此元素具有ID
content
,而不是
appcontent
。不过,建议使用
window.gBrowser
变量来获取它。在Thunderbird 5中,浏览器元素的ID已更改,因此您的代码将停止工作-您应该使用
window.messageContent
变量,该变量将在当前和将来的版本中工作。你们一起得到:

var browser = null;
if ("gBrowser" in window)
  browser = window.gBrowser;             // Firefox and SeaMonkey Browser
else if ("messageContent" in window)
  browser = window.messageContent;       // Thunderbird
else if ("getMessageBrowser" in window)
  browser = window.getMessageBrowser();  // SeaMonkey Mail

if (browser)
  ...
现在,关于侦听页面加载,这里推荐的方法是progress listeners—请参阅。将进度侦听器附加到浏览器并查找状态更改:

onStateChange: function(aWebProgress, aRequest, aFlag, aStatus)
{
  if ((aFlag & Components.interfaces.nsIWebProgressListener.STATE_STOP) &&
      (aFlag & Components.interfaces.nsIWebProgressListener.STATE_IS_WINDOW))
  {
    // A window finished loading
    doSomething(aWebProgress.DOMWindow);
  }
}

公认的答案已经过时了。使用WebExtensionsAPI的解决方案是

browser.tabs.onUpdated.addListener(function(tabId, changeInfo) {
    if (changeInfo.status == "complete") {
        //add your script
    }
})
browser.tabs.onUpdate.addListener
侦听选项卡()中的事件


(changeInfo.status==“complete”)
过滤正确的事件并执行if语句中的命令。

您在第一行遗漏了一个大括号…或者直接传递函数:maApp.init这是什么上下文,Firefox/Thunderbird覆盖?Thunderbird有
,但在Firefox中,appcontent不是浏览器,而是它的容器。内容框架中的事件不会出现气泡,因此您必须将侦听器直接连接到浏览器(
document.getElementById(“content”)
),这是针对firefox的。我设法解决我的问题。正如叶佳斌所说,这是第一行的一个大括号。所以在我的var maApp={}中,我应该添加onStateChange?不,你应该阅读我给你的链接。您可以将maApp转换为进度侦听器,也可以创建单独的进度侦听器对象,这无关紧要。但是,即使您不使用这些方法,
onSecurityChange
onProgressChange
等),进度侦听器也需要拥有所有这些方法。