2014-01-13 62 views
0

在我的擴展中,我將一條消息從background.js傳遞到contentScript.js。如果在Chrome擴展中使用「run_at」:「document_start」,消息傳遞會發生兩次

的問題是,當我在我的manifest.json使用

"run_at" : "document_start" 

,從background.js到contentScript.js的消息被稱爲兩次,有時甚至比這更多。

消息傳遞不止一次對我而言有點貴,因爲我正在向服務器發送調用,並且多次在服務器上處理相同的值是非常昂貴的。

background.js

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 

    chrome.tabs.sendMessage(tab.id, {type: "get-url", url: tab.url}); 

}); 

contentScript.js

chrome.runtime.onMessage.addListener( 
    function(message, sender, sendResponse) { 
    switch(message.type) { 
    case "get-url" : someFunction(message.url); 
        break; 
      // other cases 

    } 
}); 

有沒有辦法解決這個問題的方法嗎?

+0

爲了找出導致第二條消息的問題,我們需要看一些代碼,不是嗎? – gkalpak

+0

作爲編輯添加 – Akanksha

回答

1

chrome.tabs.onUpdated被稱爲在標籤更新週期多次(例如,當標籤開始加載新頁面時,標籤完成加載新頁面,當圖標被取出等時)。

最好的選擇是checj爲當標籤加載完成:

chrome.tabs.onUpdated.addListener(function (tabId, info, tab) { 
    if (info.status === 'complete') { 
     /* Now it is safe to send the message */ 
     chrome.tabs.sendMessage(tabId, { 
      type: 'get-url', 
      url: tab.url 
     }); 
    } 
}); 

BTW,(不manifest.json)編程注射時,該屬性的名稱是runAt,不run_atdocs)。

+0

與檢查DOM是否加載有區別嗎? – Akanksha

+0

如果您在'document_start'處注入content-script並在標籤的狀態爲'loading'時發送消息,我不確定它是否能夠保證它將到達其接收者。你的要求究竟是什麼(即你希望你的腳本何時運行)? – gkalpak

+0

我想要將消息發送到內容腳本,只要我有當前選項卡的網址。標籤何時完成加載?它是否在DOM加載後?或之前呢? – Akanksha