javascript - 在添加任何新事件监听器之前删除匿名事件监听器

标签 javascript

编辑:我需要调用一个函数来获取数据并重新加载页面的内容。但是,一旦另一个函数获取了数据(webSql),就必须调用它。我无法使用 WebSql 回调,因为变量超出范围。因此,我创建了一个自定义事件,并在第二个函数作用域中添加了一个监听器。因此,当获取数据时,我将在第一个函数作用域中调度事件。现在的问题是,如果页面重新加载多次,监听器将被添加多次,并且所有监听器都将被调用,这是我不想要的。

我需要确保只有一个函数正在监听自定义事件。现在,一旦像这样调用监听器,就将其删除:

document.addEventListener("customEvent", function () {
  actualCallBack(var1, var2); // Since I need to pass parameters I need to use callBack within an anonymous function.
  this.removeEventListener("customEvent", arguments.callee, false);
}, false);

但问题是匿名函数只有在第一次调用后才会被删除。监听器有可能被多次添加。如何在添加新事件监听器之前删除事件监听器?

document.removeEventListener("customEvent");
document.addEventListener(...);

如果使用变量函数,我可以删除它,但我需要将一些参数传递给回调,因此我需要使用匿名函数。

最佳答案

使用菲利克斯的建议

var setSingletonEventListener = (function(element){
    var handlers = {};
    return function(evtName, func){
        handlers.hasOwnProperty(evtName) && element.removeEventListener(evtName, handlers[evtName]);
        if (func) {
            handlers[evtName] = func;
            element.addEventListener(evtName, func);
        } else {
            delete handlers[evtName];
        }
    };
})(document);

setSingletonEventListener("custom event", function(){

});

//replaces the previous
setSingletonEventListener("custom event", function(){

});

//removes the listener, if any
setSingletonEventListener("custom event");

关于javascript - 在添加任何新事件监听器之前删除匿名事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17390733/

相关文章:

javascript - 如何获取我的页面上每个帖子的 id?

javascript - 您可以在不使用 jQuery 发出请求的情况下定义 AJAX 请求吗?

javascript - Knockout js观察div值变化

javascript - 在 ASP.NET MVC 中从外部 javascript 文件提交 Ajax 请求

javascript - 使用 jquery 1.6 的 chrome 中的 nyroModal 关闭按钮问题

javascript - 如何使用多个系列将图例添加到剑道股票图表?

javascript - 警报事件有效,但我的单击更改颜色的 javascript 函数不起作用

javascript - 获取 "filter"来过滤整个数组

工具提示中的 javascript 随机内容。如何在需要时添加空间

javascript - 当单击该表中的按钮时,如何使使用toggleClass 显示的表保持打开状态?