是否使用jquery从DOM中删除元素(img)清除分配的内存?

时间:2011-03-04 01:22:02

标签: javascript jquery memory

我正在开发一个移动优化网站,其中包含一个图库,在网页上有很多(在某些情况下为1oo +)图像。

我认为有很多图像可能会导致移动设备崩溃,所以我创建了一个函数,定期检查页面中是否有超过给定数量的img元素,如果有,请从DOM中删除一些.empty().remove();

页面仍然在Ipod 3G上的某些点上崩溃(只有可用于测试atm的移动设备)所以我问,如果从dom中删除<img>元素,是否会清除内存浏览器?

2 个答案:

答案 0 :(得分:3)

https://developer.mozilla.org/En/DOM/Node.removeChild

“删除的子节点仍然存在于内存中,但不再是DOM的一部分......”

jQuery源代码:

    // keepData is for internal use only--do not document
remove: function( selector, keepData ) {
    for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
        if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
            if ( !keepData && elem.nodeType === 1 ) {
                jQuery.cleanData( elem.getElementsByTagName("*") );
                jQuery.cleanData( [ elem ] );
            }

            if ( elem.parentNode ) {
                elem.parentNode.removeChild( elem );
            }
        }
    }

    return this;
},

empty: function() {
    for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
        // Remove element nodes and prevent memory leaks
        if ( elem.nodeType === 1 ) {
            jQuery.cleanData( elem.getElementsByTagName("*") );
        }

        // Remove any remaining nodes
        while ( elem.firstChild ) {
            elem.removeChild( elem.firstChild );
        }
    }

    return this;
},

答案 1 :(得分:0)

这里最安全的赌注是前面讨论的Node.removeChild方法;但是内存分配由Javascript垃圾收集器控制,你不能清理&#34;按需。

因此,通常您的目标已实现,但如果您在垃圾收集有机会取消引用已删除的dom元素之前达到内存限制,则该页面可能会使浏览器崩溃。

  • Node.removeChild
      

    &#34;假设您的代码没有在其他地方保留对该节点的任何其他引用,它将立即变得无法使用且无法恢复,并且在短时间后通常会从内存中automatically deleted&#34;