更新:我认为有一个更简单的方法来做到这一点,这取决于您的应用程序。如果只需要一个<img>
元素或Image
对象(或者两个,如果需要动画或转换,则可以是'this'图像和'next'图像),而不是简单地更新.src
,.width
,.height
和如此,你永远不应该接近10MB的限制。如果您想要制作轮播应用程序,则必须先使用较小的占位符。你可能会发现这种技术可能更容易实现。
我想我实际上可能找到了解决这个问题的方法。
基本上,您需要做一些更深层次的图像管理,并明确缩小任何不需要的图像。您通常通过使用document.removeChild(divMyImageContainer)
或$("myimagecontainer").empty()
或您有什么,但在移动Safari上这完全没有;浏览器根本就不会释放内存。
相反,您需要更新图像本身,因此占用的内存很少;你可以通过改变图像的src
属性来做到这一点。我知道最快的方法是使用data 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==
你可以回到良好的旧C日,并使用“删除”来...错误...删除,你没有显示的图像:) – 2010-06-06 21:55:46
嗯,这**吸**。我讨厌苹果。 – 2010-06-06 21:57:37
将图像写入页面后,我认为不应使用相同的内存限制。我很确定我已经浏览了超过10MB图片的网页。所以我想问题是你如何使用JS来获取图像?你能用一些你如何加载它们的例子来更新你的问题吗? – Andrew 2010-06-06 23:20:18