更新:我认为有一种更简单的方法可以做到这一点,具体取决于您的应用程序。而不必多张图片,如果你只是有一个<img>
元素或Image
物体(或者两个,像“这个”形象和“未来”的形象,如果你需要的动画或转换),并简单地更新.src
,.width
,.height
等等,你应该永远不要接近 10MB 的限制。如果您想做轮播应用程序,则必须首先使用较小的占位符。您可能会发现这种技术可能更容易实现。
我想我实际上可能已经找到了解决方法。
基本上,您需要进行一些更深入的图像管理并明确缩小您不需要的任何图像。您通常会通过使用document.removeChild(divMyImageContainer)
或$("myimagecontainer").empty()
或您拥有的东西来做到这一点,但在 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()
只是为了让图像时间显示在屏幕上。Mobile Safari 速度非常慢并且显示大图像,因此在图像加载后需要时间来绘制屏幕。
shrinkImages()
遍历所有先前加载的图像(活动图像除外)并将 更改.src
为 dataurl 地址。
我在这里为 dataurl 使用了一个文件夹图像(这是我能找到的第一个 dataurl 图像)。我只是在使用它,所以您可以看到脚本正在运行。您可能想改用透明 gif,因此请改用此数据 url 字符串:data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==