没话说了

所学甚浅,所知甚少
随笔 - 15, 文章 - 2, 评论 - 15, 引用 - 0
数据加载中……

图片处理

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

posted on 2006-04-24 20:36 howard 阅读(500) 评论(0)  编辑  收藏 所属分类: JavaScript


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问