2

我尝试将 eventListener 添加到我的扩展程序中。我想在每次选项卡处于活动状态(被用户点击)或新加载时执行一个功能。

我试过这个:

window.addEventListener("DOMContentLoaded", checkHost(), false);

它给了我错误

未捕获的引用错误:未定义窗口

它让我发疯,我在网上找不到例子。请帮我。

4

4 回答 4

2

对于那些想要使用 window 对象的人,您可以使用以下代码创建它:

var { viewFor } = require("sdk/view/core");
var window = viewFor(require("sdk/windows").browserWindows[0]);

此代码可在 MDN 上找到:https ://developer.mozilla.org/en-US/Add-ons/SDK/High-Level_APIs/windows

于 2014-10-18T15:18:12.743 回答
1

问题是 Firefox 扩展不在任何特定窗口的上下文中运行。因此,他们通常没有window定义对象,或者如果您不熟悉编写扩展代码,它被定义为您不期望的东西。如果您从编写 JavaScript 以在 HTML 页面中使用的角度来处理此问题,则尤其如此。扩展在更大的上下文中运行,包括整个浏览器以及所有窗口和选项卡。因此,没有自动合适的窗口用作window对象。在扩展的上下文中,每个 HTML 页面只是整体的一部分。

您可以通过使用nsIWindowMediator获取每个主浏览器窗口。以下来自 MDN的函数将为每个打开的窗口运行一次您传递给它的函数:

Components.utils.import("resource://gre/modules/Services.jsm");
function forEachOpenWindow(todo)  // Apply a function to all open browser windows
{
    var windows = Services.wm.getEnumerator("navigator:browser");
    while (windows.hasMoreElements())
      todo(windows.getNext().QueryInterface(Components.interfaces.nsIDOMWindow));
}

您通常希望找到window用户访问的最新浏览器/选项卡。以下代码将定义window变量并将其设置为最近使用的浏览器/选项卡。它可以在附加 SDK 或覆盖/引导扩展中工作,具体取决于您取消注释的部分。

有关在 Firefox 扩展程序中使用窗口的更多信息,您应该参阅在 chrome 代码中使用窗口

if (window === null || typeof window !== "object") {
    //If you do not already have a window reference, you need to obtain one:
    //  Add a "/" to un-comment the code appropriate for your add-on type.
    /* Add-on SDK:
    var window = require('sdk/window/utils').getMostRecentBrowserWindow();
    //*/
    /* Overlay and bootstrap (from almost any context/scope):
    var window=Components.classes["@mozilla.org/appshell/window-mediator;1"]
                         .getService(Components.interfaces.nsIWindowMediator)
                         .getMostRecentWindow("navigator:browser");        
    //*/
}

交替使用Services.jsm访问nsIWindowMediator

/* Overlay and bootstrap:
Components.utils.import("resource://gre/modules/Services.jsm");
//*/
if (window === null || typeof window !== "object") {
    //If you do not already have a window reference, you need to obtain one:
    //  Add a "/" to un-comment the code appropriate for your add-on type.
    /* Add-on SDK:
    var window = require('sdk/window/utils').getMostRecentBrowserWindow();
    //*/
    /* Overlay and bootstrap (from almost any context/scope):
    var window = Services.wm.getMostRecentWindow("navigator:browser");
    //*/
}
于 2014-10-18T16:39:35.820 回答
1

通过您当前的状态:http ://builder.addons.mozilla.org/package/206579/latest

在线构建器是一个使用Addon-SDK进行开发的在线 IDE ,window它不在全局范围内——它不是任何特定的窗口。

您可以包含选项卡模块并侦听就绪事件或激活(选项卡现在聚焦)事件,这可能是您想要的。

let tabs = require('sdk/tabs');
tabs.on('ready', function (tab) {
  console.log(tab.url + ' is ready!');
});
于 2013-10-09T20:36:33.347 回答
0

您必须将覆盖层eventlistener中引用的脚本放入内部:browser.xul

试试这样:

window.addEventListener("DOMContentLoaded", function() {checkHost();}, false);
于 2013-10-07T20:36:49.733 回答