0

我有一個背景頁面和一個內容腳本。內容腳本有這樣的代碼:從background.js發送消息到內容腳本

chrome.runtime.sendMessage({ getSetting: { setting: "hideAuth" } }, function (hide) { 
    // this should be executed after 'respond(setting)' in the backgroud page 
}); 

背景頁有這樣的代碼:

chrome.runtime.onMessage.addListener(function (msg, sender, respond) { 
    if (msg["getSetting"]) { 
     chrome.storage.sync.get(msg.getSetting.setting, function (setting) { 
      respond(setting); // this should callback to the content script 
      }); 
     }); 
    } 
}); 

但是,永遠不會執行的內容腳本的響應回調。我嘗試過查詢當前標籤並手動發送消息,但標籤仍然沒有收到消息。有沒有人處理過這個?是否有另一種方法來做到這一點?

+0

http://stackoverflow.com/a/20077854 – rsanchez

回答

1

既然要異步調用(即chrome.storage.sync.get回調內部respond功能,你應該在你的onMessage偵聽器回調添加return true;

chrome.runtime.onMessage.addListener(function (msg, sender, respond) { 
    ... 
    return true; 
}); 

報價the docs

此功能變得當事件監聽器返回時無效,除非您從事件監聽器返回true以表示您希望異步發送響應(這會記錄p消息通道開放到另一端,直到調用sendResponse)。

+0

那麼,它的作用就像一個魅力,但現在我得到'不能從'extensions :: event_bindings'代碼中調用'null'的方法'disconnect'。有沒有辦法在代碼捕獲之前手動斷開連接? –

+0

你在哪裏斷開連接? 'disconnect'僅用於持久連接,不適用於簡單的一次性消息傳遞。你不需要它 - 只需使用上面的代碼(不需要更多)。 – gkalpak

+0

就是這樣。我不是。它被一些我不能控制的內部代碼調用。這意味着我做錯了什麼。 –

相關問題