【问题标题】:Does removing an element (a img) from the DOM with jquery clear the memory allocated?使用 jquery 从 DOM 中删除元素(img)是否会清除分配的内存?
【发布时间】:2011-03-04 01:22:02
【问题描述】:

我正在开发一个针对移动设备进行优化的网站,该网站有一个画廊,一个页面上有很多(在某些情况下超过 1oo+)图片。

我认为拥有这么多图像可能会使移动设备崩溃,因此我创建了一个函数,该函数会定期检查页面中是否有超过给定数量的 img 元素,如果是,则将其中一些从 DOM 中删除.empty().remove();

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

【问题讨论】:

  • 浏览器减速到停止后我返回到主屏幕。

标签: javascript jquery memory


【解决方案1】:

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

【讨论】:

  • 谢谢,这回答了我的问题。你知道从内存中删除图像的任何方法吗?
  • Javascript好像没有办法。。我建议你尝试从服务器端编码优化它,检测用户的设备/浏览器,然后决定将什么样的代码发送到浏览器。
【解决方案2】:

这里最安全的选择是前面讨论过的Node.removeChild 方法;但是内存分配由 Javascript 垃圾收集器控制,您不能按需“清理”。

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

  • Node.removeChild

    “假设你的代码没有在其他地方保留对节点的任何其他引用,它将立即变得不可用且无法恢复,并且通常会在短时间内从内存中删除automatically deleted

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 2014-05-22
    • 1970-01-01
    • 2011-09-21
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多