1

試圖讓我的腳受到Chrome擴展程序的影響。我創建了一個製表符限制器,但它的越野車。排除事件監聽器的問題

我希望點擊browser action圖標可以打開和關閉分機。我相信我的設置是正確的。當打開時,它會創建一個來自chrome.tabs API的偵聽器,但是當切換時,我很難刪除此偵聽器。

我已經嘗試了一些StackOverflow上的常見問題(如下所示)以刪除偵聽器,但沒有一個能夠正常運行。

這裏是background.js

var tabUrls, bookmarkFolder, currentWindow; 
var toggle = false; 

chrome.browserAction.onClicked.addListener(function(tab){ 
    toggle = !toggle; 

    if(toggle) { 
    chrome.browserAction.setBadgeText({"text": "ON"}); 

    console.log("I'm listening to the browser action"); 

    runExtension(); 

    } else { 
    console.log("i shouldn't be working now."); 

    chrome.browserAction.setBadgeText({"text": ""}); 

    // Need to remove the listener somehow. This isn't working. 

    chrome.tabs.onCreated.addListener(doStuff); 
    } 
}); 

    // Functions 

    // Potential function to removeListener. Not working. 
    function doStuff(tab){ 
    chrome.tabs.onCreated.removeListener(doStuff); 
    } 

    var runExtension = function(){ 
    chrome.tabs.onCreated.addListener(function(tab){ 

     // Find and set reference to the current window 
     chrome.windows.getCurrent(function(window){ 
     currentWindow = window; 
     }); 

     // Logic to limit tabs (remove window, create bookmarks, play audio, manipulate DOM on new window) 
     chrome.tabs.getAllInWindow(function(tabs) { 
     tabUrls = lengthRequirement(tabs); 

     console.log(tabUrls); 

     if (typeof tabUrls != "string") { 

      createBookmarkFolder(tabUrls); 
      chrome.windows.remove(currentWindow.id); 
      playAudioClip(); 
      chrome.windows.create({ "url": "http://www.justinstewart.info/"}); 
      chrome.tabs.executeScript({file: "content_script.js"}); 

     } 
     }); 
    }); 
    } 

    var playAudioClip = function(){ 
    var audio = new Audio("audio_file.mp3"); 
    audio.play(); 
    } 

    var createBookmarkFolder = function(tabUrls){ 
    chrome.bookmarks.create(
     {'title': "Caroline Strikes Again @ " + new Date()}, 
     function(bookmark){ 
     createBookmarks(tabUrls, bookmark); 
     } 
    ) 
    } 

    var createBookmarks = function(urls, folder){ 
    for(i=0; i<urls.length; i++) { 
     chrome.bookmarks.create({ 
     'parentId': folder.id, 
     'url': urls[i][0], 
     'title': urls[i][1] 
     }) 
    } 
    } 

    var lengthRequirement = function(tabsArray){ 
    if (tabsArray.length > 9) { 
     var urls = []; 

     for(i=0; i<tabsArray.length; i++) { 
     info = []; 
     info.push(tabsArray[i].url); 
     info.push(tabsArray[i].title); 

     urls.push(info); 
     } 
     return urls; 
    } else { 
     return "Not there yet....."; 
    } 
    } 

+++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++

manifest.json文件:

{ 
    "manifest_version": 2, 
    "name": "Caroline", 
    "version": "0.2", 

    "description": "A fun tab limiter to help increase productivity and focus.", 

    "icons": { 
    "16": "icon16.png", 
    "48": "icon48.png", 
    "128": "icon128.png" 
    }, 

    "background": { 
    "scripts": ["background.js"], 
    "persistent": false 
    }, 

    "browser_action": { 
    "default_icon": "icon48.png", 
    "default_title": "Sweet Caroline" 
    }, 

    "permissions": [ 
    "tabs", "bookmarks", "*://*/" 
    ] 
} 

任何非常感謝幫助!

回答

5

.removeListener(func)只有當func與之前添加的事件偵聽器之一相同時纔會刪除偵聽器。

首先,內runExtension刪除匿名函數,因爲如果是匿名的,你不能給函數的對象更多的引用:

var runExtension = function(){ 
 chrome.tabs.onCreated.addListener(function(tab){ 
    ... 
 }); 
}; 

然後,.addListener(runExtension);取代runExtension(),並使用.removeListener(runExtension);每當你想要移除聽衆:

chrome.browserAction.onClicked.addListener(function(tab){ 
    toggle = !toggle; 
    if (toggle) { 
     ... 
     chrome.tabs.onCreated.addListener(runExtension); 
    } else { 
     ... 
     chrome.tabs.onCreated.removeListener(runExtension); 
    } 
});