2014-01-15 37 views
5

我正在研究一个需要在后台运行的小型Chrome扩展。但是,我明白,当我使用弹出窗口时,这是不可能的。经过一番阅读,似乎最好的选择是创建popup.js,以便运行background.js,使用chrome.extension.getBackgroundPage()函数。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 是否需要从popup.js, 内运行background.js中的相关功能或为background.js运行一般命令?

+0

我已经编辑我的答案。请注意,如果您在'manifest.json'中没有'persistent':false',那么这个解决方案是可以的。否则,请参阅@Pawelmhm – lexasss

回答

2

背景页面已加载,然后你的扩展程序加载到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以及本帖子的其他答案以阐明此事。

+0

的答案'chrome.runtime.getBackgroundPage()'是首选方式,不应该仅在事件页面使用**。它与持久背景页面的效果相同,因此无论背景页面的类型如何,都可以使用它。 'chrome.extension.getBackgroundPage()',另一方面,不能在事件页面上使用。 (我不是在说你的意思,否则只是把重点放在它上面。) – gkalpak

+0

感谢你澄清这件事。我修改了我的答案,以便它不再包含误导性陈述。 – lexasss

+1

'chrome.extension.getBackgroundPage()'比'chrome.runtime.getBackgroundPage'好的一点是第一个是同步的。以同步方式进行编码最初导致了更清晰的代码。但是,如果不努力就不能使同步代码再次异步,所以如果你正在开发一个新的扩展,使用'chrome.runtime.getBackgroundPage(callback)'。 –

3

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

background.js

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

popup.js

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

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

有一个示例代码demonstrating this in chrome documentation看到Idle Simple Example,并期待在文件history.js

+0

谢谢#Pawelmhm,但由于我的background.js代码位于window.onload内,因此来自popup.js的调用似乎无法达到此功能。当我删除window.onload时,无论将脚本标记放置在popup.html中的哪个位置,我都会收到null错误的'onclick'。 – Nim

+0

@NimrodSarda:对于有人猜测你的代码可能出错,如果他们没有看到它,这是很难的。 – gkalpak