1

Chrome 확장 프로그램에 내 발을 붓고 싶습니다. 나는 탭 리미터를 만들었지 만 그것의 버그.이벤트 리스너를 제거하는 중 문제가 발생했습니다.

browser action 아이콘을 클릭하여 확장 기능을 켜거나 끕니다. 나는 그것이 올바르게 설정되어 있다고 믿습니다. 전환 할 때 chrome.tabs API에서 수신자를 생성하지만 전환 할 때이 수신자를 삭제하는 데 어려움을 겪고 있습니다.

나는 Listener를 제거하기 위해 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); 
    } 
}); 
관련 문제