0

在我的網絡擴展中,我將多個相同的監聽器添加到不同的標籤ID,這取決於用戶告訴擴展名所做的事情。
browser.webRequest.onBeforeRequest.addListener(mycallback, {urls: ["myurl"], tabId: varyingtabid},["blocking"]);webRequest刪除附加到標籤IDI的監聽器

但是,當我需要清理的偵聽器選項卡,我不知道如何指定監聽器,文檔說的removeListener只需要一個參數,即回調。
browser.webRequest.onBeforeRequest.removeListener(mycallback); //does this remove every listener, what does this do when there are multiple listeners?

回答

1

根據api_event_listeners.cc(link)的源代碼,的removeListener不管用於添加該偵聽器的過濾器移除指定偵聽所有的註冊。

那是因爲你不能多次使用不同的過濾器(link)添加相同的偵聽器:

 
    // Note that we only consider the listener function here, and not the 
    // filter. This implies that it's invalid to try and add the same 
    // function for multiple filters. 
    // TODO(devlin): It's always been this way, but should it be? 

換句話說,每次調用的addListener與相同功能的參考時間,這是一個no-op


注意,如果聲明另一個函數裏面的回調,回調基準每次都會有所不同,因爲在JS function name() {}相當於var name = function() {}用的無所不包的第一個語句之前所聲明的更多便利功能。

+0

無論如何動態創建一個函數的不同函數引用,並使用該引用作爲偵聽器回調?我嘗試使用創建偵聽器時不起作用的對象。 – regularjoe

+0

假設'foo()'是一個全局/持久函數,你可以簡單地使用一個包裝器:function(){return foo.apply(this,arguments); } – wOxxOm