jQuery中的解除绑定

8
如果一个元素从页面中移除,它会自动解绑吗?还是说这种情况下应该使用jQuery的unbind方法来手动解绑呢?
我认为它会自动解绑...

@martym 当你从 DOM 中删除一个元素并重新加载页面时,它不会再次绑定,因为它找不到该元素。这会在下一次页面加载时发生。 - kobe
为什么我需要进行另一个页面加载,而不刷新呢?你的回答让我有些困惑... - Matrym
1个回答

6
如果您使用removeempty删除元素,则会自动删除事件处理程序以防止内存泄漏。否则,它们将保留下来,除非在删除这些元素之前明确解除绑定。编辑:事实证明,.html也会通过调用内部的.cleanData方法(在第5177行声明)来删除事件处理程序。您可以在源代码中查看此内容。
html: function( value ) {
   ...

    for ( var i = 0, l = this.length; i < l; i++ ) {
                    // Remove element nodes and prevent memory leaks
                   if ( this[i].nodeType === 1 ) {
                       jQuery.cleanData( this[i].getElementsByTagName("*") );
                       this[i].innerHTML = value;
                    }
                }
   ...

因此,为避免内存泄漏,请不要直接使用 innerHTML 替换已附加 jQuery 事件处理程序的 DOM 元素。

如果我使用.html("stuff")替换div的内容,那么我是否理解先前在其中的元素仍然绑定?我之后可以解除绑定吗,还是必须在将它们从dom中删除之前解除绑定? - Matrym
@martym .html将HTML应用于现有的DOM元素,因此无需再次绑定。如果需要对要使用的元素进行一些绑定,则必须使用jQuery.live并执行操作。 - kobe
@Karim,谢谢,这就是我想到的。@GOV,我觉得你误解了我的意思。如果DOM被绑定,然后通过更改其父容器的HTML从页面中删除,那么绑定似乎会持续存在并导致内存泄漏。 - Matrym
@martym 我误解了,抱歉。 - kobe
通常情况下,当我们想要禁用任何点击或其他事件时,我们使用unbind...我一直以为是这样。 - kobe
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接