编辑:我需要调用一个函数获取数据并重新加载页面的内容。但是一旦另一个函数获取了数据(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(...);
我可以删除它,如果使用一个变量函数来代替,但我需要通过一些参数回调,所以我需要使用匿名函数。
IIRC,'cloneNode'克隆了一切,但事件监听器。在'document'范围内做这件事可能很搞笑,但.. – fjdumont
一种方法是将整个事件绑定到一个自定义函数中。然后该函数可以保持对传入处理程序的引用,并确保只绑定一个处理程序。当然,这要求处理程序仅通过该函数绑定到元素。 –
我不明白你的解释为什么你必须使用匿名函数。这里是一个相关的问题btw:http://stackoverflow.com/questions/4386300/javascript-dom-how-to-remove-all-events-of-a-dom-object – basilikum