如何删除chrome.webNavigation事件?
chrome.webNavigation.onCompleted.addListener(x.bind(request.data.url), {
url:[{urlPrefix:request.data.url+""}]
});
这就是我创建事件的方式,这就是我试图在“x”函数中删除事件的方式,
chrome.webNavigation.onCompleted.removeListener(arguments.callee);
但奇怪的是它并没有删除监听器,而是每次调用addlistener时我都会添加越来越多的监听器而不删除最后一个监听器。
编辑: 因此,似乎无法删除.bind()函数创建的匿名函数。
答案 0 :(得分:0)
没有尝试使用addListener / removeListener,只使用addEventListener / removeEventListener - 但我认为逻辑是合理的
function once(ev, filter, listener) {
const fn = (...args) => {
listener(...args);
ev.removeListener(fn);
}
ev.addListener(fn, filter);
}
并且,您案例中的用法是
once(chrome.webNavigation.onCompleted, {url:[{urlPrefix:request.data.url+""}]}, x.bind(request.data.url));
答案 1 :(得分:0)
.bind()
创建一个新的bound function,它调用你绑定的函数,设置适当的this
并调整你指定的参数,以及绑定时使用的任何参数。函数被调用。
您可以从polyfill for .bind()
on MDN了解其工作原理。
以下是一些示例代码,用于演示arguments.callee
不是绑定函数:
function toBeBound(arg1) {
console.log('arguments.callee:', arguments.callee);
console.log('arguments.callee === arg1:', arguments.callee === arg1);
console.log('arg1:', arg1);
}
var bound = toBeBound.bind(null);
bound(bound);

you create with x.bind(request.data.url)
是一个调用x()
的不同函数的绑定函数。它不是 x
。因此,当您处于x
函数并尝试:
chrome.webNavigation.onCompleted.removeListener(arguments.callee);
您实际做的是:
chrome.webNavigation.onCompleted.removeListener(x);
因为x
当时是arguments.callee
,由.bind()
创建的函数调用。但是,作为侦听器添加的函数是绑定函数。
实现所需内容的方法是引用绑定函数,您可以在x()
中使用它来删除侦听器。一种简单的方法是添加你的监听器:
var boundX = x.bind(request.data.url);
chrome.webNavigation.onCompleted.addListener(boundX, {
url:[{urlPrefix:request.data.url+""}]
});
然后,在x()
函数中,您可以使用以下命令删除侦听器:
chrome.webNavigation.onCompleted.removeListener(boundX);
显然,如何实现这一点可能需要对您的实际代码更复杂。但是,鉴于您提供的代码量极少,任何更复杂的代码都只是我的推测。在某些情况下,我保留了数组或对象,其中包含对我作为听众使用的绑定函数的引用。
如果你的用例是总是想要在事件第一次触发时删除事件监听器,那么Jaromanda X提供了一个很好的解决方案来完成their answer中的事件。它基本上是基于ES6的标准方法实现,用于构建一个通用方法来调用事件监听器一次(addEventListener
具有specify once
as an option能力之前)。它的作用是创建一个自动保持对侦听器的引用的函数。