在网页中有一个预览图片的功能,由一个单元格显示要预览的图片,由于实际图片有大有小,所以要有个函数处理图片的大小。可以这样写
/**//*
* 设定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程序块执行终止以后,再隔一段时间调用某一函数,该函数只调用一次。