0

我寫了一個名爲「Word Welter」的谷歌瀏覽器擴展程序,它演示了類似血糖症。爲每個頁面重新運行後臺腳本導航到

該擴展插件使用後臺腳本來切換打開和關閉字。但是,雖然這可以在網頁上工作,但如果用戶打開功能並瀏覽到其他頁面(即單擊當前頁面中的超鏈接),則Chrome按鈕會返回到初始狀態(儘管該按鈕的工具提示文字說功能仍然在!),並且加擾功能關閉。看起來好像我的內容腳本只執行一次(即當執行切換時)。

我希望加擾功能可以在用戶導航到其他頁面時保持活動狀態,我希望我可以使用後臺腳本,但顯然不是這樣。任何人都知道我能如何解決這個問題?

請注意,在我引入切換按鈕之前,加擾功能工作正常(即用戶將導航到的每個頁面)。然而,切換按鈕是需要的,因爲如果每個頁面都經常被擾亂,它會變得煩人!

背景腳本(background.js)如下:

var toggle = false; 
chrome.browserAction.onClicked.addListener(function(tab) { 
    toggle = !toggle; 
    if(toggle){ 
    chrome.browserAction.setIcon({path: "WordWelterIcon19x19_On.png", tabId:tab.id}); 
    chrome.browserAction.setTitle({title: "Word Welter On"}); 
    chrome.tabs.executeScript(tab.id, {file:"content_script.js"}); 
    } 
    else{ 
    chrome.browserAction.setIcon({path: "WordWelterIcon19x19_Off.png", tabId:tab.id}); 
    chrome.browserAction.setTitle({title: "Word Welter Off"}); 
    chrome.tabs.executeScript(tab.id, {code:"window.location.reload();"}); 
    } 
}); 

和我的manifest.json有後臺腳本如下條目:

"background": { 
    "scripts": ["background.js"] 
    } 

任何幫助表示讚賞。

回答

0

我自己找到了這個問題的解決方案。我改變了代碼:

var toggle = false; 

var executeContentScript = function() { 
    chrome.tabs.executeScript({file:"content_script.js", allFrames : true }); 
}; 

chrome.browserAction.onClicked.addListener(function(tab) { 
    toggle = !toggle; 
    if(toggle){ 
    chrome.browserAction.setIcon({path: "WordWelterIcon19x19_On.png"}); 
    chrome.browserAction.setTitle({title: "Word Welter On"}); 
    executeContentScript(); 
    chrome.tabs.onUpdated.addListener(executeContentScript); 
    } 
    else{ 
    chrome.tabs.onUpdated.removeListener(executeContentScript); 
    chrome.browserAction.setIcon({path: "WordWelterIcon19x19_Off.png"}); 
    chrome.browserAction.setTitle({title: "Word Welter Off"}); 
    chrome.tabs.executeScript({code:"window.location.reload();"}); 
    } 
}); 

此修復程序是添加一個偵聽器,這樣的內容腳本將每一個激活的標籤被更新時執行;看到調用:

chrome.tabs.onUpdated.addListener(executeContentScript); 

這聽衆是未註冊的,當它再次通過調用來「的removeListener」切換:

chrome.tabs.onUpdated.removeListener(executeContentScript);