删除DOM中的图像时如何防止内存泄漏?

webkit中有一个已知的bug,当您从DOM中删除一个图像时,它不会释放与其相关的内存

这是经常加载图像的单页应用程序的一个问题

各种建议的解决方案包括:

  • 从DOM中删除图像之前,请先删除图像src属性
  • 在从DOM中删除图像之前,请将图像src设置为“”
  • 在从DOM中删除图像之前,将图像设置为单像素图像
  • 创建数量有限的图像元素并不断循环使用

前三种方法不适合我。回收图像元素的主要缺点是,这意味着要编写大量代码来管理图像元素。我正在通过AJAX加载可能包含图像的新HTML,因此我不一定知道将加载的图像数量

是否有其他解决此问题的方法

我使用了3种不同的方法

首先。添加了一组图像,并将垃圾收集留在浏览器中。

它肯定是垃圾收集的,但是过了一段时间,确保不需要创建图像

。为图像的src使用了data:URI模式

var s=“data:image/png;base64,ivborw0kggoaaaansuhueugaaaaaaaaaafcayaaacnbyblaaaaheleqvqi12p4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=”;
对于(变量i=0;i<100;i++){
var img=document.createElement(“img”);
img.src=s;
document.getElementById(“myList1”).appendChild(img);
setTimeout(函数(){img=null;},1000);
}

这看起来很相似,但对我来说更好一点,因为我在浏览器前观看,发现使用的内存更少,垃圾收集几乎与上面相同

第三。在代码中执行垃圾收集

var s=“data:image/png;base64,ivborw0kggoaaaansuhueugaaaaaaaaaafcayaaacnbyblaaaaheleqvqi12p4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=”;
对于(变量i=0;i<100;i++){
var img=document.createElement(“img”);
img.src=”https://stackoverflow.com/questions/13859041/dot.png“;//或另一个,两者在这里的意思相同。
img.src=s;
document.getElementById(“myList1”).appendChild(img);
setTimeout(函数(){img=null;},1000);
}

在这短短的测试时间里,我相信最后一种方法效果更好,因为它几乎可以立即释放空间,而不必等待进一步查看是否需要参考图像

总而言之,当您觉得必须释放某些东西时,最好自己使用垃圾收集。

发表评论