chrome.request.sendRequest()中的document.addEventListener()问题

时间:2012-01-24 22:05:36

标签: javascript google-chrome-extension

我有一个谷歌浏览器扩展程序,我在其中创建了一个后台页面,我查询了我的扩展程序的设置,在我的情况下,我只是查询启用/禁用的变量。

首先,这是manifest.json:

{
    "name": "Foo",
    "version": "0.1",
    "description": "",
    "icons": {
        "128": "128.png",
        "48": "48.png",
        "16": "16.png"
    },
    "content_scripts": [{
        "all_frames": true,
        "js": ["foo.js"],
        "matches": ["http://*/*", "https://*/*"],
        "run_at": "document_start"
    }],
    "background_page" : "background.html",
    "browser_action": {
        "default_icon": "icons/19x19.png",
        "default_title": "Foo",
        "default_popup": "popup.html"
    }
}

背景页面的javascript如下所示:

FooApp = {};
FooApp.enabled = 1;

chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) {
        if (request.getSetting == "enabled") {
            sendResponse({result: FooApp.enabled});
        }
    }
);

在我的内容脚本中,我查询后台页面以查看脚本是否已启用&应该执行:

(function() {
    chrome.extension.sendRequest({getSetting: "enabled"}, function(response) {
        console.log("in sendRequest callback");
        if (response.result == 1) {
            console.log("in response.result = 1");
            document.addEventListener("beforeload", function(event) {
                console.log("in beforeload callback");
            }, true);
        } else {
            console.log("in response.result = 0");
        };
    });
}());

当我运行它时,我可以看到

的控制台日志
  1. “在sendRequest回调”
  2. “in response.result = 1”
  3. 但是我没有得到“inload callback”的控制台日志,这是“beforeload”事件监听器的回调内部。

    是否有一些我遗漏的东西....我希望beforeload回调能够触发并看到控制台日志消息,但我没有。在我处理beforeload eventlistener中的任何代码之前,我正在尝试查询我的应用程序以检查它是否已启用。

    当我删除除了beforeload事件监听器注册之外的所有内容时,代码运行正常,例如:

    document.addEventListener("beforeload", function(event) {
        console.log("in beforeload callback");
    }, true);
    

    当事件监听器嵌套在chrome.extension.sendRequest内时,它似乎永远不会被注册?如果我无法使用此路线查询我的应用设置,是否有更好的方法来执行此操作?

1 个答案:

答案 0 :(得分:0)

在加载事件触发后附加事件侦听器。

(function() {
// load event has already fired.
...
}());

相反,您应该只执行要放在事件侦听器中的if内的代码。