在将其重新连接到新元素之前,是否需要分离我的事件处理程序?

时间:2013-05-07 16:04:17

标签: javascript jquery

我正在编写一个将事件处理程序附加到链接的jQuery JS文件,但事件处理程序用通过ajax请求检索的新链接替换该链接。它实际上是一个+1,-1函数,因此链接来回切换。

我的理解是,即使链接被点击两次并返回其原始值,它也将成为第三个唯一对象,对吗?我的问题是,每次分离事件处理程序对我有什么好处吗?因为在链接被替换后删除事件处理程序时它不会抛出错误,我猜测该对象及其事件处理程序仍然存在于JS中,它们不再存在于HTML文档,对吗?无论我是否这样做,它都能正常工作,但我现在已经100%确定这个过程究竟是如何运作的。

这是我的.done()函数:

.done(function(ReturnData){
    PlusOneDiv.replaceWith(ReturnData);
    // Redefine variables and detatch/reattach event
    PlusOneLink.off('click'); // Is this line helpful at all?
    PlusOneDiv = $('#plusonediv');
    PlusOneLink = PlusOneDiv.children('a');
    PlusOneLink.on('click', submit_plus_one);

1 个答案:

答案 0 :(得分:1)

当您替换元素时,它将从DOM中删除。如果该元素没有被其他任何东西引用,那么它将有资格进行垃圾收集,当它被垃圾收集时,它的点击处理程序也将被垃圾收集(假设没有其他东西引用点击处理程序)。

但是,例如,如果你的代码中有某个全局变量,就像这样:

var plusOneDiv = $("#plusonediv");

并且您不更新该变量以引用通过AJAX检索的新链接,然后即使使用$(...).replace(...)替换元素将其从DOM中删除,也不会对其进行垃圾回收。但看起来你正在更新它,所以最初的#plusonediv元素及其监听器最终将被垃圾收集并从内存中删除。