删除chrome webNavigation事件

时间:2017-06-28 22:31:23

标签: javascript google-chrome google-chrome-extension

如何删除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()函数创建的匿名函数。

2 个答案:

答案 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能力之前)。它的作用是创建一个自动保持对侦听器的引用的函数。