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);
}
在这短短的测试时间里,我相信最后一种方法效果更好,因为它几乎可以立即释放空间,而不必等待进一步查看是否需要参考图像
总而言之,当您觉得必须释放某些东西时,最好自己使用垃圾收集。