繁体   English   中英

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

[英]Does removing an element (a img) from the DOM with jquery clear the memory allocated?

我正在开发一个移动优化的网站,该网站有一个画廊,页面上有很多(在某些情况下为 1oo+)图像。

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

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

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;
},

这里最安全的选择是如前所述的Node.removeChild方法; 但是内存分配是由 Javascript 垃圾收集器管理的,你不能按需“清理”。

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

  • Node.removeChild

    “假设你的代码没有在别处保留对节点的任何其他引用,它将立即变得无法使用和无法恢复,并且通常会在短时间内自动从内存中删除

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM