我工作的一個Chrome擴展,涉及消息通過消息傳遞端口從的背景腳本到內容腳本。根據documentation我必須先查詢我要連接的內容腳本的標籤,然後使用該標籤的ID打開一個端口。所以,我的背景劇本和內容腳本如下所示:開放背景和content_script之間的消息端口的Chrome擴展
background.js
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
var port = chrome.tabs.connect(tabs[0].id, { name: "example" });
port.postMessage("hello world");
});
content_script.js
chrome.runtime.onConnect.addListener(function(port) {
port.onMessage.addListener(function(msg) {
console.log(msg);
});
});
而且沒有消息打印到控制檯。我首先在content_script port.onMessage.addListener(function(msg) {
這條線上放了一個斷點,這是從未命中的。這使我相信該端口從未在background.js中打開過。所以接下來,我把一個破發點中background.js在該行var port = chrome.tabs.connect(tabs[0].id, { name: "example" });
通過訪問這裏
開發者工具和事實證明,我的查詢實際上並不返回任何標籤步入回調使tabs[0].id
產生了一個錯誤。我猜測,一旦我得到這個選項卡查詢工作消息傳遞將開始工作,所以沒有人知道這裏發生了什麼,我不能查詢當前,活動選項卡?我已經看到了在許多其他StackOverflow響應中使用的確切查詢,並且在message passing docs的示例中。
我的解決方案是從內容腳本開始傳遞消息。謝謝!我仍然很好奇,爲什麼以其他方式做這件事並不奏效,如果這樣做是不可能的,爲什麼Chrome的文檔有一個這樣做的例子。 – azrosen92
@ azrosen92,我不是說從背景頁面開始時它不起作用。只是因爲查詢結果是不能用內容腳本注入的'chrome:// extensions'頁面,所以時間不適合。你可以嘗試第二種方式,添加一個特定的觸發點。 –