在网页中有一个预览图片的功能,由一个单元格显示要预览的图片,由于实际图片有大有小,所以要有个函数处理图片的大小。可以这样写

/**//*
* 设定img的宽,高
* img 动态图片对象
* width 单元格宽
* height 单元格高
*/

fitImageSize = function(img, width, height)
{
var rate = img.width / img.height;
var wh = width / height;


if (rate > wh)
{

if (img.width > width)
{
img.height = img.height * (width / img.width);
img.width = width;
}
}

else
{

if (img.height > height)
{
img.width = img.width * (height / img.height);
img.height = height;
}
}
} 当图片动态加载显示的时候,有一个奇怪的问题,就是,第一次预览时,图片实际大小并没有改变,也就是说,这个函数好像无效了。预览事件代码片断如下:

for(
)
{

if(
.)
{
// 是否可以预览
img.src = "url
..";
// alert(img.src);
fitImageSize(img, view.width, view.height);
img.align = "center";
document.getElementById(id).appendChild(img);
}
} 而当将alert的注释去掉以后,图片将被正常的处理。这应该是alert的时候,js程序被挂起,而图片继续在加载,当alert点击以后,图片加载已经成功,所以,图片被正确处理。如果你alert的是img.width,你会看见信息是0。因此,我对程序再做一点改动,用setInterval函数进行图片的完全加载处理。

for(
)
{

if(
)
{
// 是否可以预览
img.src = "url
.";
// alert(img.src);
//fitImageSize(img, view.width, view.height);
//img.align = "center";
//document.getElementById(id).appendChild(img);

preview_interval = window.setInterval(function()
{ loadingImage(img); }, 100);
}
}
{...coding....}
var preview_interval;

/**//*
* img 加载的图片对象
*/

loadingImage = function(img)
{

if(img.complete)
{
clearInterval(preview_interval);
fitImageSize(img, view.width, view.height);
img.align = "center";
document.getElementById(id).appendChild(img);
}
} 这样一来,程序就可以预览图片,并且也不再会出现第一次预览时撑大单元格的现象了。
上面是预览一张图片的情况,我还遇到js动态一次性加载多张图片的情况,解决办法与此相似。下面的代码是我处理多张图(2张为例)的,实际上可以和上面的写在一起,呵呵,懒的,不去动它了。

/**//*
* 加载相关图片
*/

myClass.prototype.loadAssociateImage = function()
{
// 判断图片是否已经被加载过,避免重复加载时不必要的消耗。这里以image数组的长度
// 作为是否已经加载的判断。

if(this.astImage.length != 0)
{
// alert('Not reload');
return;
}


for (var i = 0; i < 2; i++)
{
this.astImage[i] = new Image();
}
this.astImage[0].src = this.pic.pic0;
this.astImage[1].src = this.pic.pic1;

}


var my_interval;

/**//*
* 显示
*/

myClass.prototype.create = function()
{
this.loadAssociateImage();

my_interval = window.setInterval(function ()
{
// 变量g是myClass的全局变量,可以当作this看
var length = g.astImage.length;

for (var i = 0; i < length; i++)
{

if (!g.astImage[i].complete)
{
break;
}

else
{

if (i != length -1)
{
continue;
}

else
{
clearInterval(my_interval);
// my process now
}
}
}
}, 10);
} 补充一下对setInterval和setTimeout的说明:setInterval是让js每隔一段时间就运行某一函数一次,从js代码执行setInterval开始,这样直到注销(clearInterval)其为止;setTimeout是在js程序块执行终止以后,再隔一段时间调用某一函数,该函数只调用一次。