2013-07-25 125 views
3

我正在開發一個Chrome擴展,其中有一個彈出窗口,用於調用background.js的「begin」函數。 Background.js打開選項卡和我有background.js監聽器將消息發送給標籤的content_script.js:監聽器多次實例化

background.js

function begin() { 
    var mySendedTabs = new Array(); 
    chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) 
    {    
    if(mySendedTabs.indexOf(tabId) == -1) { 
    if(changeInfo.status == "complete") 
    { 
    chrome.tabs.sendMessage(tabId, { question: "What's your location ?" }); 
    mySendedTabs.push(tabId);      
    } 
    }     
}); 
} 

content_script.js另一個消息回覆:

chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) { 
    if(request.question == "What's your location ?") { 
    alert("Got a location request"); 
    chrome.runtime.sendMessage({myLocation : location.href}); 
    } 
}); 

當我從「chrome:// extensions /」窗口刷新擴展名時沒有問題。問題是,如果我第二次運行我的程序(從彈出窗口),content_script.js中的警報被激發2次。如果我再次運行我的程序,警報會被觸發3次......依此類推。

它在我看來,監聽器仍然在內存中,儘管當我從彈出窗口啓動程序並且監聽器被複制時,background.js被刷新。

如果我打電話

chrome.tabs.onUpdated.removeListener(arguments.callee) 

,所有監聽器被刪除,該程序不工作了,即使我從彈出再次運行該程序。

我只是想從彈出窗口啓動程序時得到一個乾淨的瀏覽器窗口。

我想我必須從內容腳本啓動聽衆,這不會解決問題,但我不知道如何從我的聽衆做單身。

+0

「'雖然當我從彈出窗口啓動程序時刷新了background.js」 - 我不明白你的意思。你爲什麼說你的背景頁面是「刷新」?您的後臺頁面的狀態是持久性的(除非您重新啓動Chrome或更新您的擴展程序);這是背景頁面的全部要點。 – apsillers

+0

我認爲後臺頁面會刷新,因爲它不記得我的變量值從一次運行到另一次運行,聽衆都是。我在我的manifest.json中加入了''persistent':false',但它似乎沒有改變任何東西。 –

回答

0

每次顯示彈出窗口時,都會運行您的begin方法,然後再添加另一個偵聽器,因此最終會收到越來越多的偵聽器。 您需要做的是移動在begin()方法之外添加偵聽器的代碼。應該在加載後臺頁面時添加一次偵聽器。 然後,您還應該將mySendedTabs置於begin()方法之外(這樣偵聽者就可以訪問它)。

我不確定我明白你的意思,「我只是想從彈出窗口啓動程序時得到一個乾淨的瀏覽器窗口」,但是(如果我的猜測是正確的)你需要在begin()方法將重新初始化變量mySendedTabs

你background.js看起來是這樣的:

var mySendedTabs = new Array(); 
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {    
    if (mySendedTabs.indexOf(tabId) == -1) { 
     if(changeInfo.status == "complete") { 
      chrome.tabs.sendMessage(tabId, { question: "What's your location ?" }); 
      mySendedTabs.push(tabId); 
     } 
    } 
}); 

function begin() { 
    mySendedTabs = new Array(); 
} 

(我假設變量mySendedTabs填充了在創建標籤(的tabIDs通過回調的方式)。)

更新
順便說一句,這是一個好主意,把你的背景頁面變成一個活動頁面。 (在您的情況下,只能在您的清單中添加persistent: false。)
請查看docuemntation瞭解更多信息和說明。