更新:我认为有一种更简单的方法可以做到这一点,具体取决于您的应用程序。<img>
如果您只拥有一个元素或Image
对象(或者可能两个,例如“this”图像和“next”图像,如果您需要动画或过渡)并简单地更新.src
,等.width
,而不是拥有多个图像,.height
您应该永远不要接近 10MB 的限制。如果你想做一个轮播应用程序,你必须首先使用较小的占位符。您可能会发现这种技术可能更容易实现。
我想我实际上可能已经找到了解决这个问题的方法。
基本上,您需要进行一些更深入的图像管理并明确缩小您不需要的任何图像。您通常会通过使用document.removeChild(divMyImageContainer)
or$("myimagecontainer").empty()
或 what have you 来做到这一点,但在 Mobile Safari 上,这绝对没有任何作用;浏览器根本不会释放内存。
相反,您需要更新图像本身,使其占用很少的内存;您可以通过更改图像的src
属性来做到这一点。我知道的最快的方法是使用数据 URL。所以不要这样说:
myImage.src="/path/to/image.png"
...改为这样说:
myImage.src="data:image/gif;base64,AN_ENCODED_IMAGE_DATA_STRING"
下面是一个测试来证明它的工作。在我的测试中,我的 750KB 大图像最终会杀死浏览器并停止所有 JS 执行。但是在重置之后src
,我已经能够在图像实例中加载超过 170 次。代码如何工作的解释也在下面。
var strImagePath = "http://path/to/your/gigantic/image.jpg";
var arrImages = [];
var imgActiveImage = null
var strNullImage = "data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7";
var intTimesViewed = 1;
var divCounter = document.createElement('h1');
document.body.appendChild(divCounter);
var shrinkImages = function() {
var imgStoredImage;
for (var i = arrImages.length - 1; i >= 0; i--) {
imgStoredImage = arrImages[i];
if (imgStoredImage !== imgActiveImage) {
imgStoredImage.src = strNullImage;
}
}
};
var waitAndReload = function() {
this.onload = null;
setTimeout(loadNextImage,2500);
};
var loadNextImage = function() {
var imgImage = new Image();
imgImage.onload = waitAndReload;
document.body.appendChild(imgImage);
imgImage.src = strImagePath + "?" + (Math.random() * 9007199254740992);
imgActiveImage = imgImage;
shrinkImages()
arrImages.push(imgImage);
divCounter.innerHTML = intTimesViewed++;
};
loadNextImage()
这段代码是为了测试我的解决方案而编写的,所以你必须弄清楚如何将它应用到你自己的代码中。代码分为三个部分,我将在下面解释,但唯一真正重要的部分是imgStoredImage.src = strNullImage;
loadNextImage()
只需加载新图像并调用shrinkImages()
. 它还分配了一个onload
事件,用于开始加载另一个图像的过程(错误:我应该稍后清除此事件,但我没有)。
waitAndReload()
在这里只是为了让图像有时间出现在屏幕上。移动版 Safari 非常慢并且显示大图像,因此在图像加载后需要时间来绘制屏幕。
shrinkImages()
遍历所有先前加载的图像(活动图像除外)并将 更改.src
为 dataurl 地址。
我在这里为 dataurl 使用了一个文件夹图像(这是我能找到的第一个 dataurl 图像)。我只是简单地使用它,以便您可以看到脚本正常工作。您可能希望改用透明 gif,因此请改用此数据 url 字符串:data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==