1

當試圖通過從後臺腳本內容腳本的消息,我使用背景內容腳本消息:消息內容腳本之前發送準備

chrome.tabs.query(
    {active: true, currentWindow: true}, 
    function(tabs) { 
    chrome.tabs.sendMessage(
     tabs[0].id, 
     {greeting: "hello"}, 
     function(response) { 
     console.log(response.farewell); 
     } 
    ); 
}); 
在後臺腳本

和相應的監聽器

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
    if (request.greeting === "hello") { 
     sendResponse({farewell: "goodbye"}); 
    } 
    }); 

在內容腳本中(根據the documentation)。現在

,我可能要送東西給內容腳本在當前選項卡的Web請求已完成,例如,

chrome.webRequest.onCompleted.addListener(
    // sender code from above 
) 

我發現,不過,背景腳本發送郵件時內容腳本還沒有被注入到頁面中。因此,沒有答覆。

如何解決這個問題?是否有一個事件可以在後臺腳本中監聽,告訴我內容腳本何時加載?

+0

什麼觸發你的第一個片段?對於競賽狀況,重要的是要知道。 – Xan

+0

另外,對於所有聖潔的愛,我希望你不要在你的代碼中使用'greeting' /'farewell'。這段示例代碼已經成爲擴展編程中真正的[貨物崇拜](https://en.wikipedia.org/wiki/Cargo_cult)對象,並且它有點噁心。 – Xan

+0

@Xan澄清。當然,我實際上並沒有使用「問候」/「告別」。 :) –

回答

3

最安全的方法是從發送消息指示它已準備好的內容腳本,然後才從後臺頁面回覆。

例如,您可以爲每個標籤ID添加類似隊列的內容,並在該處添加消息,並在該標籤到達的消息將消息隊列提供給它時​​。

您也可以嘗試使用,而不是明顯的注射方案注射:

chrome.tabs.executeScript({file: "yourContentScript.js"}, function() { 
    // After the above finishes executing 
    /* your messaging code */ 
}); 

但是,如果你打電話,之前導航致力於,即標籤的上下文之前實際更改(可可能發生在webRequest事件),您的腳本將嘗試注入之前的頁面,並且將通過轉換來消除。

相關問題