我尝试将 eventListener 添加到我的扩展程序中。我想在每次选项卡处于活动状态(被用户点击)或新加载时执行一个功能。
我试过这个:
window.addEventListener("DOMContentLoaded", checkHost(), false);
它给了我错误
未捕获的引用错误:未定义窗口
它让我发疯,我在网上找不到例子。请帮我。
我尝试将 eventListener 添加到我的扩展程序中。我想在每次选项卡处于活动状态(被用户点击)或新加载时执行一个功能。
我试过这个:
window.addEventListener("DOMContentLoaded", checkHost(), false);
它给了我错误
未捕获的引用错误:未定义窗口
它让我发疯,我在网上找不到例子。请帮我。
对于那些想要使用 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
问题是 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");
//*/
}
通过您当前的状态: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!');
});
您必须将覆盖层eventlistener
中引用的脚本放入内部:browser.xul
试试这样:
window.addEventListener("DOMContentLoaded", function() {checkHost();}, false);