在IE8中,用javascript动态修改src时,内存一直增加,无法释放,直到图片无法显示。
图片有300张左右,每张700K左右。如:document.getElementById("myimg").src = imglist[nCurImg];用CollectGarbage();手动释放,效果也不明显。大家有什么解决方法。
在IE6和IE9中,貌似没有这个问题。
代码如下:
-----------------------------------------------------<html>
<head>
</head>
<body><input type="button" name="input1" value="showNext" onclick="showNext()">
<input type="button" name="input1" value="showAll" onclick="showAll()">
<input type="button" name="input1" value="relaease" onclick="release()">
<input type="button" name="stop" value="stop" onclick="stop()"><br>
<img alt="" id="myimg" src="image/default.jpg" /><script>
// 图片实际300张左右,现在只写了4张的,作为例子。
var imglist = new Array("./img/1.jpg", "./img/2.jpg","./img/3.jpg","./img/4.jpg");
var nCurImg = -1;
var timer = null;</script><script type="text/javascript">
function showAll()
{
timer = setInterval("show()", 1000);
}
function show()
{
nCurImg = nCurImg + 1;
document.getElementById("myimg").src = imglist[nCurImg];}
function showNext()
{ nCurImg = nCurImg + 1;
document.getElementById("myimg").src = imglist[nCurImg];
}
function release()
{ CollectGarbage(); window.clearInterval(timer);
timer = null; document.getElementById("myimg").src = null;
CollectGarbage();
}function stop()
{
window.clearInterval(timer);
timer = null;
}
</script>
</body>
</html>
图片有300张左右,每张700K左右。如:document.getElementById("myimg").src = imglist[nCurImg];用CollectGarbage();手动释放,效果也不明显。大家有什么解决方法。
在IE6和IE9中,貌似没有这个问题。
代码如下:
-----------------------------------------------------<html>
<head>
</head>
<body><input type="button" name="input1" value="showNext" onclick="showNext()">
<input type="button" name="input1" value="showAll" onclick="showAll()">
<input type="button" name="input1" value="relaease" onclick="release()">
<input type="button" name="stop" value="stop" onclick="stop()"><br>
<img alt="" id="myimg" src="image/default.jpg" /><script>
// 图片实际300张左右,现在只写了4张的,作为例子。
var imglist = new Array("./img/1.jpg", "./img/2.jpg","./img/3.jpg","./img/4.jpg");
var nCurImg = -1;
var timer = null;</script><script type="text/javascript">
function showAll()
{
timer = setInterval("show()", 1000);
}
function show()
{
nCurImg = nCurImg + 1;
document.getElementById("myimg").src = imglist[nCurImg];}
function showNext()
{ nCurImg = nCurImg + 1;
document.getElementById("myimg").src = imglist[nCurImg];
}
function release()
{ CollectGarbage(); window.clearInterval(timer);
timer = null; document.getElementById("myimg").src = null;
CollectGarbage();
}function stop()
{
window.clearInterval(timer);
timer = null;
}
</script>
</body>
</html>
<div id="myimg"></div>
<script type="text/javascript">
function show() {
nCurImg = nCurImg + 1;
document.getElementById("myimg").innerHTML = '<img alt="" src="'+imglist[nCurImg]+'" />';
}
function showNext() {
nCurImg = nCurImg + 1;
document.getElementById("myimg").innerHTML = '<img alt="" src="'+imglist[nCurImg]+'" />';
}
</script>
另外,show()和showNext()函数的定义完全一样,只要定义一个就可以的吧。
尝试了大家说的方法问题并没有解决,包括异步加载图片,问题还是一样。新的发现就是图片大小不设置的时候,不会出现内存增加的问题(难道是之前虚拟内存设置的不对?)。
如果设置图片显示大小,内存增加问题就出现了。比如把
<img alt="" id="myimg" src="image/default.jpg" />
修改为
<img alt="" style="width:500px; height:500px;" id="myimg" src="image/default.jpg" />大家还有什么新的想法没有?
var obj = document.getElementById("myimg");var Idx = 0;
var Len = arr.length;
var Img = new Image();
Img.src = arr[Idx];
Img.onload = function() {
obj.src = arr[Idx];
Idx = ++ Idx % Len;
setTimeout(function(){Img.src = arr[Idx]}, 2000);
}
Idx = ++ Idx % Len;
setTimeout(function(){Img.src = arr[Idx]}, 2000);
}
d. 图片大小每张700k; 2593*1936;1. 如果不设置图片的大小,让图片显示原始的尺寸,1秒中显示1张,都不会出现问题。
2. 如果设置图片的大小,就算6秒中显示一张,都会出现内存增加问题。
3. 感觉关键的问题是,为什么设置图片大小的时候会导致内存增加,且不能自动释放。
IE7中为什么就没问题呢。
<img alt="" style="width:500px;" id="myimg" src="image/default.jpg" />
1、如果这样滴,那应该就是IE8的BUG了。
2、IE8增强了图片锯齿平滑处理功能,也就是当图片显示尺寸与原来尺寸不一样时,无论是放大还是缩小,浏览器渲染出来都会出现锯齿,为了浏览视觉平滑,浏览器貌似除了FF外都会对锯齿进行平滑处理,且IE8处理算法或方法最有效。但我猜测,IE8对图片缩放锯齿的正常处理存在一个缩放比率的上限,超过该上限程序无法有效完成,被占用内存区间处于Releasing状态。再就是2593/500 = 5.186,width=height=500不是等比缩放,这会溢出IE8对JPG的平滑处理环境吗?
3、为了检验上述猜测,请你先把缩放比调整在1倍以内(int:2或者只有1位浮点小数),并等比width和height试试看。再适当加大缩放比,测试该正常运行上限。