【问题标题】:Display: Block/None html elements with css..not releasing from memory显示:带有 css 的块/无 html 元素 ..未从内存中释放
【发布时间】:2012-09-06 16:29:59
【问题描述】:

我无法解决这个问题。我在HTML 页面中有几个 Div。每个 Div 代表一个不同的部分,因此包含该部分的不同图像。所有图像均从 css 引用并使用 javascript (document.getElementById('DIV').style.display='none/block';) 显示/删除。

为了这个例子的目的,假设我有 2 个 div。每个部分 Div(Div1 & Div2) 将是父 div,并且这些父级中的任何 Div 都将是其子级。 (DIV1a, DIV2a)

我发现如果 Div1 使用 display: block 设置并使用 css Background-image:.... 并且 Div2 是 display='none' 当我使用 style.display = 'none'; 隐藏 Div1 时,它确实将其从屏幕中删除并且允许我显示 Div2..但是背景图像仍然存在于浏览器内存中。

有趣且我无法理解的是,当我将 style.display = 'none' 用于父 DIV1 时,如果我将 background-img 放入 DIV1 内的子 div(div1a) 中,子 div1a 图像确实会得到当我在父 DIV1 上使用 style.display = 'none' 时从浏览器内存中删除。但是我发现这也不一致....它似乎适用于某些父 div 而不适用于其他 div。

正如您现在可能知道的那样,我非常困惑,真的不知道如何解决这个问题。

感谢大家的时间和想法。

代码示例:

使用此方法时

<div id="Div1">
    content....
</div>

<div id="Div2" style="display: none">
    ...content
</div>

div#Div1{
    background-image: url(images/mybg.png);
    background-repeat: no-repeat;
    width: 480px;
    height: 360px;
}

document.getElementById("Div1").style.display='none';
document.getElementById("Div2").style.display='block';

当我执行上述 javascript 时,图像仍然存在于资源选项卡中

使用此方法时:

<div id="Div1">
    <div id="Div1a">
        content....
    </div>
</div>

<div id="Div2" style="display: none">
    content....
</div>

div#Div1a{
    background-image: url(images/mybg.png);
    background-repeat: no-repeat;
    width: 480px;
    height: 360px;
}

document.getElementById("Div1").style.display='none';
document.getElementById("Div2").style.display='block';

当我执行上面的 javascript 时,图像会从资源选项卡中删除...但是这种效果不一致并且并不总是有效:s

【问题讨论】:

  • 请通过代码展示您的示例。更容易理解。
  • 为什么说图片已从浏览器内存中删除?你如何测试这个?
  • @JeremyJStarcher 我正在查看 document(index.html) > images 中资源选项卡下的 chrome 检查器
  • @Drew 只要您的代码中有一个指向必须在某个时候加载的资源的链接,它就会显示在资源选项卡中。这个问题应该可以结束了。
  • Jeremy 的简短回答:浏览器在管理内存方面做得非常好。除非您正在编写应用程序并意外地将内存锁定在闭包中,否则不要担心。 (IE6 除外——那完全是“另一锅鱼”。)

标签: javascript css html


【解决方案1】:

将某些内容设置为display: none 不会从任何浏览器的内存中删除任何内容。整个 DOM 元素仍然在 DOM 中占用同样多的内存,只是被标记为从视图和布局中隐藏。

如果你想真正从内存中删除一个元素,那么你需要从 DOM 中物理删除它,通常使用parent.removeChild(child) 并确保在你的 javascript 中的任何地方都没有对 DOM 元素的引用,这会保留它免于收集垃圾。


另外,我不知道您如何评估浏览器的内存使用情况,但大多数方法都无法准确检测浏览器是否已释放给定图像,因为内存可能已从内部内存池中释放(可重复使用),但不返回给操作系统。仅仅发布一张图片并不一定会减少浏览器的内存使用量。所显示的内容将是高度特定于浏览器甚至特定于操作系统的,并且肯定取决于您用于检查内存使用情况的工具。

【讨论】:

  • 好的,谢谢。我正在使用 chrome 检查器并在资源选项卡下查看。我正在尝试最小化运行 os5/6 的黑莓设备的内存消耗,因此将尝试合并 parent.removeChild(child) 方法。我假设一旦这样做,我将需要使用 parent.addChild(child) 将其重新添加到 DOM?
  • @Drew - 您必须创建一个新的 DOM 对象并将其添加回 DOM 以再次显示它。没有addChild()。您可以使用appendChild()insertBefore()
  • 是的(如果addChild 是指appendChild),但如果您保留对它的引用(例如child),它将不会被垃圾收集(根据@jfriend 的回答) .如果您真的想将其从内存中取出,则需要将其完全丢弃。如果您稍后要以确切的形式重新添加它,通常没有理由尝试将其从内存中删除。这有点像说你想保持头脑清醒,当你不打算开车去某个地方时忘记你的车钥匙在哪里。
  • @Pete true.....我想从 DOM 中删除它的原因是因为我有一些 GIF 动画,我认为它们仍然存在时会占用内存/电池,不是吗?
  • @Drew - 任何合理的浏览器都不会使用display: none 的动画 GIF 来消耗电池电量。它们足够聪明,知道当它们不可见时不要对其进行动画处理。但是,它会占用内存。免责声明:我无法确定黑莓浏览器是否是合理的浏览器。
猜你喜欢
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
相关资源
最近更新 更多