0

我希望能夠從內容腳本(任何標籤)背景溝通Chrome擴展onMessage.addListener在background.js不會被調用

根據文件,我應該使用 chrome.extension chrome.runtime.onMessagechrome.runtime.sendMessage

所以這就是我所做的:

的manifest.json

"background": { 
    "scripts": ["background.js"], 
    "persistent": false 
}, 
"permissions": [ 
    "*://*/*" 
], 

background.js

console.info('1'); 
chrome.runtime.onMessage.addListener((request, sender, sendReponse) => { 
    console.info('2'); 
    sendReponse({ msg: 'foo' }); 
    return true; 
}); 

我不是很肯定return true; is needed。我嘗試了和沒有。

建設和重裝擴展後,我通過chrome://extensions

> 1 // background.js file was run 
> chrome.runtime.sendMessage({ hello: 'so' }, v => console.info(v)) 
> undefined 
> undefined // This is the callback response I get. Why? 

更重要的訪問鍍鉻背景頁,我也從其他選項卡(即stackoverflow.com)

> chrome.runtime.sendMessage('extension id', { hello: 'so' }, v => console.info(v)) 
> undefined 
> undefined 
運行時的sendMessage得到一個空的響應回調

爲什麼我會得到一個空響應回調?

我是否缺少特別許可?錯誤的參數?也許錯誤的API函數這樣做?

+1

至於'返回TRUE',它僅在需要時響應從一個[異步執行的代碼]傳送(https://stackoverflow.com/a/14220323)。 – wOxxOm

回答

2
  1. runtime.sendMessage doesn't send the message發送者的情況下since Chrome 49

    如果發送給您的延長,runtime.onMessage活動將在您的分機的每一幀發射(除發送方的幀),

  2. 網頁可以發送郵件到你的背景/事件在兩種情況下頁:manifest.json中

    • externally_connectable鍵允許該頁
    • 擴展的內容腳本加載˚F或頁面,在這種情況下,你可以上下文切換到控制檯工具欄在你的擴展能夠從控制檯手動發送消息:

      pic

      內容腳本可以在manifest.json的聲明中,它通過[re]加載頁面自動注入。或者您可以從後臺/活動頁面中以tabs.executeScript明確注入它。