0

我工作的一個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" });通過訪問這裏

enter image description here

開發者工具和事實證明,我的查詢實際上並不返回任何標籤步入回調使tabs[0].id產生了一個錯誤。我猜測,一旦我得到這個選項卡查詢工作消息傳遞將開始工作,所以沒有人知道這裏發生了什麼,我不能查詢當前,活動選項卡?我已經看到了在許多其他StackOverflow響應中使用的確切查詢,並且在message passing docs的示例中。

回答

3

請確保當前的活動標籤允許注入內容腳本,也就是說,當您在背景頁面中調用chrome.tabs.query時,活動標籤頁不是chrome://extensions頁面。這通常發生在重新加載擴展程序時,在這種情況下,在調用chrome.tabs.query({active: true, currentWindow: true})後,您將得到帶有chrome://extensions url的選項卡,而此頁面不允許默認注入內容腳本。

爲了避免這種情況,你可以調整你的消息傳遞方式:

  1. 你可以starting the message passing from content scripts
  2. 您還可以添加一些其他觸發點來啓動消息傳遞。例如,單擊browserAction時調用chrome.tabs.query
+0

我的解決方案是從內容腳本開始傳遞消息。謝謝!我仍然很好奇,爲什麼以其他方式做這件事並不奏效,如果這樣做是不可能的,爲什麼Chrome的文檔有一個這樣做的例子。 – azrosen92

+1

@ azrosen92,我不是說從背景頁面開始時它不起作用。只是因爲查詢結果是不能用內容腳本注入的'chrome:// extensions'頁面,所以時間不適合。你可以嘗試第二種方式,添加一個特定的觸發點。 –

相關問題