在jQuery中,如果删除一个元素,它上面的任何事件都会被删除吗?

时间:2009-10-08 14:38:59

标签: jquery event-binding

例如,如果我有一个绑定了以下事件的链接:

$("a.d").bind("click", this, onDelete);

以后再做:

$("a.d").remove();

这样好吗?或者是否会导致内存泄漏,我需要调用unbind 1st?

感谢您的帮助。

4 个答案:

答案 0 :(得分:6)

来自jQuery docs for remove()

  

从中删除所有匹配的元素   DOM。这不会删除它们   jQuery对象,允许你使用   匹配的元素。注意   这个函数从1.2.2开始   还将删除所有事件处理程序   和内部缓存的数据。

答案 1 :(得分:4)

我还没有对它进行过测试,但我相信删除一个元素会解除其事件处理程序的绑定。我从jQuery API documentation(搜索删除)得出这个结论,该结论表明如果你想将一个元素从DOM的一个部分移动到另一个部分:

$("#foo").remove().appendTo("#bar");

应该写成

$("#foo").appendTo("#bar");

以避免丢失事件处理程序。

答案 2 :(得分:0)

答案是肯定的,只要事件附加了jQuery。如果附上像“onclick”这样的东西,我不相信它会。

本文讨论其中的一些内容。它还定义了一个递归函数,用于删除元素及其所有子元素的所有单击事件。它将涵盖jQuery单击处理程序以及使用onclick定义的处理程序,因此您将被覆盖。

http://www.computerhowtoguy.com/how-to-use-the-jquery-unbind-method-on-all-child-elements/

function RecursiveUnbind($jElement) {
    // remove this element's and all of its children's click events
    $jElement.unbind();
    $jElement.removeAttr('onclick');
    $jElement.children().each(function () {
        RecursiveUnbind($(this));
    });
}

要使用上一个示例中的函数,我们将调用函数将“container”div作为jQuery对象传递给它。

RecursiveUnbind($('#container'));

答案 3 :(得分:-2)

为了记录,你不必担心javascript中的内存泄漏。 (冷静的人,不是c ++!)

浏览器的javascript引擎管理所有对象,垃圾收集它们。当我说对象时,这也意味着事件处理函数,因为函数也是javascript中的对象。

无关:我喜欢javascript中的所有内容:D

干杯!
JRH