如何在Chrome扩展程序中删除事件侦听器

cha*_*ang 19 javascript events event-handling google-chrome-extension

我正在尝试删除请求后onRequest添加的侦听器chrome.extension.onRequest.addListener,如下所示:

chrome.extension.onRequest.addListener(
    function(request){
        chrome.extension.onRequest.removeListener();
        other_function(request);
    }
);
Run Code Online (Sandbox Code Playgroud)

问题是我不知道这是否有效.我试过chrome.extension.onRequest.hasListener,似乎没有给出正确的答案,所以我想知道是否有其他方法来删除onRequest监听器或检查监听器是否存在.

谢谢!

aps*_*ers 34

removeListener采取争论.您需要命名侦听器函数,然后按名称删除它:

function doStuff(request){
    chrome.extension.onRequest.removeListener(doStuff);
    other_function(request);
}
chrome.extension.onRequest.addListener(doStuff);
Run Code Online (Sandbox Code Playgroud)

或者,更简洁:

chrome.extension.onRequest.addListener(
    function doStuff(request){
        chrome.extension.onRequest.removeListener(doStuff);
        other_function(request);
    }
);
Run Code Online (Sandbox Code Playgroud)

  • @chao Huang:不,回调不需要匿名。 (2认同)
  • @chao Huang:他们说的是匿名函数,但他们真正的意思是你不能将任意参数传递给回调,就像该示例中的“四”一样 - 构造另一个执行该部分的函数。如果您想稍后删除侦听器,则需要具有为“addEventListener”提供的相同函数。 (2认同)

Pra*_*GPz 8

使用匿名函数时另一种简单直接的方法:

chrome.runtime.onMessage.addListener(function(msg, sender, reply) {
    chrome.runtime.onMessage.removeListener(arguments.callee);
});
Run Code Online (Sandbox Code Playgroud)

  • 从EcmaScript 5(2009)开始,严格模式下不支持`arguments.callee`。 (2认同)