Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firefox加载项窗口。addEventListener错误:未定义窗口_Javascript_Firefox_Firefox Addon Sdk - Fatal编程技术网

Javascript Firefox加载项窗口。addEventListener错误:未定义窗口

Javascript Firefox加载项窗口。addEventListener错误:未定义窗口,javascript,firefox,firefox-addon-sdk,Javascript,Firefox,Firefox Addon Sdk,我正试图按照本教程创建一个firefox插件,当地址栏中的url发生变化时进行拦截: 我只是复制了代码,只是添加了一个警报,看看它是否有效,但我无法让它以任何方式运行 我的代码是: const {Cu} = require("chrome"); Cu.import("resource://gre/modules/XPCOMUtils.jsm", this); var urlListener = { oldURL: null, init: function() {

我正试图按照本教程创建一个firefox插件,当地址栏中的url发生变化时进行拦截:

我只是复制了代码,只是添加了一个警报,看看它是否有效,但我无法让它以任何方式运行

我的代码是:

const {Cu} = require("chrome");
Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);

var urlListener = {
    oldURL: null,

    init: function() {
        gBrowser.addProgressListener(this);
    },

    uninit: function() {
        gBrowser.removeProgressListener(this);
    },

    processNewURL: function(aURI) {
        if (aURI.spec == this.oldURL) return;

        // now we know the url is new...
        alert(aURI.spec);
        this.oldURL = aURI.spec;
    },

    // nsIWebProgressListener
    QueryInterface: XPCOMUtils.generateQI(["nsIWebProgressListener",
                                           "nsISupportsWeakReference"]),

    onLocationChange: function(aProgress, aRequest, aURI) {
    alert("Called");
        this.processNewURL(aURI);
    },

    onStateChange: function() {},
    onProgressChange: function() {},
    onStatusChange: function() {},
    onSecurityChange: function() {}
};

  window.addEventListener("load", function() { urlListener.init() }, false);
  window.addEventListener("unload", function() { urlListener.uninit() }, false);
每当我尝试启动/测试此扩展时,都会收到以下错误:

Running tests on Firefox 24.3.0/Gecko 24.3.0 ({ec8030f7-c20a-464f-9b0e-13a3a9e97384}) under linux/x86-gcc3.
Error: ReferenceError: window is not defined 
 Traceback (most recent call last):
  File "resource://jid1-u33krawc1uacsa-at-jetpack/amazon_rewriter/tests/test-main.js", line 1, in 
    var main = require("./main");
  File "resource://gre/modules/commonjs/sdk/loader/cuddlefish.js", line 133, in CuddlefishLoader/options<.load
    result = load(loader, module);
  File "resource://jid1-u33krawc1uacsa-at-jetpack/amazon_rewriter/lib/main.js", line 38, in 
    window.addEventListener("load", function() { urlListener.init() }, false);
0 of 1 tests passed.
在linux/x86-gcc3下运行Firefox 24.3.0/Gecko 24.3.0({ec8030f7-c20a-464f-9b0e-13a3a9e97384})上的测试。
错误:引用错误:未定义窗口
回溯(最近一次呼叫最后一次):
文件“resource://jid1-u33krawc1uacsa-at-jetpack/amazon_rewriter/tests/test-main.js“,第1行,在
var main=要求(“./main”);

文件“resource://gre/modules/commonjs/sdk/loader/cuddlefish.js“,第133行,在CuddlefishLoader/options中没有全局
窗口
gBrowser
对象,您需要获取浏览器并选择要添加侦听器的窗口(
nsIDOMWindow
)。本教程中似乎缺少或超出了此部分的范围

var gBrowser = windowUtils.getMostRecentBrowserWindow().getBrowser();
获得窗口的方法可能有多种。如果使用低级API,我会这样做。您可以使用
getMostRecentBrowserWindow
获取上述最新窗口,或者使用
windowUtils.windows()
获取所有当前打开的窗口,如下所示:

const windowUtils = require("sdk/window/utils");

for each (let window in windowUtils.windows()) {
    urlListener.init();
    window.addEventListener("unload", function() { urlListener.uninit(); }, false);
}
如果您还想将侦听器添加到将来打开的所有窗口中,您可以在新窗口打开时添加它们:

const windows = require("sdk/windows");
windows.browserWindows.on("open", domWindow => {
    urlListener.init();
    windowUtils.getMostRecentBrowserWindow().addEventListener("unload", function() { urlListener.uninit(); }, false);
});

感谢您的回答,这消除了窗口未定义的问题,但现在看来,当我在任何选项卡中插入任何内容时,都不会发生任何事情。你知道吗?@Ivan应该有一个“警报”弹出窗口,但我不确定警报是否能在这种情况下工作。您可以尝试添加一些
控制台。改为记录
消息,看看它们是否显示在控制台中。哦,我也不知道如何获得
gBrowser
,但我使用
windowUtils.getMostRecentBrowserWindow().getBrowser()
。虽然不确定这是否是一个好方法,但它似乎对我有效。这是在示例中!!:(非常感谢!!现在一切都正常了!:)(嘿,代码中有两个输入错误,只是缺少了括号。我认为添加答案可能会很有用,还可以参考gBrowser问题!)