【发布时间】:2013-06-27 18:19:06
【问题描述】:
编辑:我需要调用一个获取数据并重新加载页面内容的函数。但是一旦另一个函数获取了数据(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-scope 中这样做可能会很有趣…… -
一种方法是将整个事件绑定放在自定义函数中。然后,该函数可以保留对传递的处理程序的引用,并确保只绑定一个处理程序。当然,这要求处理程序仅通过该函数绑定到元素。
-
我不明白你为什么必须使用匿名函数的解释。这是一个相关的问题顺便说一句:stackoverflow.com/questions/4386300/…
-
@FelixKling 我没有将事件绑定到 div 元素。我在另一个函数中使用
dispatchEvent调用事件侦听器。所以我需要删除之前添加的任何内容。 -
@basilikum 我已经编辑了问题。我需要传递一些参数,所以我将 callBack 包装在一个匿名函数中。
标签: javascript