如何删除传递给构造函数 tabs.open 的 onLoad 事件侦听器?

How to remove onLoad event listener which was passed to constructor's tabs.open?

我创建了一个带有一些构造函数参数的新选项卡,例如 onLoad 事件:

tabs.open({
    url: url,
    onLoad: function onLoadFn(tab) {
        console.log("Tabs.open; onLoadFn()");
        setTimeout(function() {
            handler(this.findWorker(tab));
            tab.removeListener("load", onLoadFn);
        }.bind(this), 500);
    }.bind(this)
});

我想在执行后立即删除事件侦听器。我试过:

tab.removeListener("load", onLoadFn);
tabs.removeListener("load", onLoadFn);

但它不起作用。

如何删除这个 onLoad 事件侦听器?

这里的问题是您试图删除您从未添加的功能。您没有添加 onLoadFn 作为侦听器,而是添加了一个基于 onLoadFn 的新函数,您绑定了 this,更准确地说:

function foo() {};

console.log(foo === foo.bind(this)); // false

我不知道你为什么需要这样的东西,所以我真的不能建议一个更优雅的方法,但如果你想删除监听器,你必须传递你添加的相同函数.因此,您必须将绑定结果的引用保存在某处,然后将其删除。作为替代方案,您也可以在调用 open 之前使用 tabs.once("load", listener),这将为您做到这一点——顾名思义,它只会在事件第一次发出时执行一次侦听器。