2014-01-15 66 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