chrome.extension.getBackgroundPage()函数示例

时间:2014-01-15 19:28:55

标签: javascript google-chrome google-chrome-extension

我正在处理需要在后台运行的小型Chrome扩展程序。但是,据我所知,当我使用弹出窗口时,这是不可能的。经过一些阅读后,似乎最好的选择是使用popup.js函数创建background.js以便运行chrome.extension.getBackgroundPage()

有人可以告诉我一个如何完成的例子吗?

这是清单:

"browser_action": {
"permissions": ["background"],
"default_popup": "popup.html"},
"options_page": "options.html",
"background": {
    "scripts": ["background.js"],
    "persistent" : true
}

我在popup.html中包含了popup.js参考:

<script src="popup.js"></script>

并在popup.js

中创建了一个变量
var bkg = chrome.runtime.getBackgroundPage();

所以现在我需要一种激活background.js的方法 我是否需要在background.js popup.js内运行相关功能, 或者给出background.js运行的一般命令?

2 个答案:

答案 0 :(得分:4)

是的,您需要在弹出窗口中从后台调用函数。这是一个简单的例子,演示了它是如何工作的。

<强> background.js

function backgroundFunction () {
    return "hello from the background!"
}

<强> popup.js

(function () {
    var otherWindows = chrome.extension.getBackgroundPage();
    console.log(otherWindows.backgroundFunction()); 
})();

当你检查你的popup.js时,你会看到“你好!”在你的控制台中。 GetBackgroundPage()只返回背景页面的窗口对象,因为您可能知道所有变量都附加到此窗口对象,因此您可以通过这种方式访问​​后台脚本中定义的函数。

示例代码demonstrating this in chrome documentation请参阅Idle Simple Example并查看文件history.js

答案 1 :(得分:3)

加载后台页面,然后将扩展程序加载到Chrome中。

将弹出页面视为普通网页:在此处,您需要使用chrome.runtime向后台页面发出请求。

通常,我使用隐式(时间)或显式(永久)通道。使用时间通道:

popup.js

chrome.runtime.onMessage.addListener(function (answer) { /* your code */ }
chrome.runtime.sendMessage({cmd: "shutdown"});

background.js

chrome.runtime.onMessage.addListener(function (request) {
    if (request.cmd === "shutdown") {
        shutdown();
    }
}

使用永久频道:

popup.js

var port = chrome.runtime.connect({name: "myChannel"});
port.onMessage.addListener(function (answer) { /* your code */ })

port.postMessage({cmd: "shutdown"});

background.js

chrome.runtime.onConnect.addListener(function (port) {
    port.onMessage.addListener(function (request) {
        if (request.cmd === "shutdown") {
            shutdown();
        }
    }
}

UPD。虽然这种content-backgrounf通信方式功能齐全,但使用chrome.runtime.getBackgroundPage()调用后台脚本中的函数的当前规范建议是请求不应该是异步的(因此,需要更少的编码并且更容易阅读代码)。请参阅the manual以及此帖的其他答案,以澄清此事。