4

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

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

后来做:

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

可以吗?还是它会导致内存泄漏,我需要调用 unbind 1st?

谢谢你的帮助。

4

4 回答 4

6

来自用于 remove() 的 jQuery 文档

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

于 2009-10-08T14:45:23.990 回答
4

我还没有测试过它,但我相信删除一个元素会解除它的事件处理程序的绑定。我从jQuery API 文档(搜索删除)中得出这个结论,该文档指出,如果要将元素从 DOM 的一个部分移动到另一个部分:

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

应该写成

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

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

于 2009-10-08T14:45:05.303 回答
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));
    });
}

要使用前面示例中的函数,我们将调用该函数,并将“容器”div 作为 jQuery 对象传递给它。

RecursiveUnbind($('#container'));
于 2012-10-24T20:28:04.197 回答
-2

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

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

无关:我喜欢一切都是 javascript 中的对象:D

干杯!
jrh

于 2009-10-08T15:06:53.573 回答