onload做.改成:
<body onload="display_img()">后,效果和用:setTimeout("display_img()",10);
一样了.显示是第一次也有图片显示出来,不过图片显示是在一个新的HTML中了.(另外,我上面的说的图片第一次不出来,也不是每次都第一次不出来,例如一些小的图片,容量很小的图片,就第一次点击链接也出来,但大一点的图片,90%的在第一次点击的时候都不出来,硬要等到点第二次链接,不过只是显示了一次以后,以后就正常了,以后就只要点击一次图片就显示出来了)

解决方案 »

  1.   

    <img id="a">
    <script language="javascript">
    <!--
    function DrawImage(ImgD)
    {  
    var image=new Image(); 
    image.src=ImgD.src;  
    if(image.width>0 && image.height>0){  
        flag=true;  
        if(image.width/image.height>= 450/300){  
         if(image.width>450){    
         ImgD.width=450;  
         ImgD.height=(image.height*450)/image.width;  
         }else{  
         ImgD.width=image.width;    
         ImgD.height=image.height;  
         }  
         }  
        else{  
         if(image.height>300){    
         ImgD.height=300;  
         ImgD.width=(image.width*300)/image.height;       
         }else{  
         ImgD.width=image.width;    
         ImgD.height=image.height;  
         }  


    ///* *这是第一种处理方法,直接将该图片在这个方法中画出来.
    document.write("<img id=s_a1 name=s_a1 src='' width='' height=''>");
    document.all("s_a1").src=ImgD.src 
    document.all("s_a1").width=ImgD.width 
    document.all("s_a1").height=ImgD.height
    //*/
    return(ImgD);
    }  return (ImgD);
    } a.src ="http://expert.csdn.net/images/jspd_wdzx_sqgg_ad.gif";
    var myIMG = new DrawImage(a);
    //-->
    </script>这样没有问题哦
      

  2.   

    就是多用了个new吗?OK,我先试试.
      

  3.   

    TO: yeefly(Web开发版) 
    加了NEW后,效果还是一样.各位老兄,你们做这种点击显示图片,让图片按一定的比例显示是如何做的了?
      

  4.   

    <img id="a" >
    <script language="javascript">
    function DrawImage(ImgD)
    {  
    var image=document.all("a"); 
    //alert(ImgD);
    image.src=ImgD;  
        
            if(image.width/image.height>= 450/300){  
        // 太宽
            alert("ccc");
         if(image.width>450){    
           image.width=450;  
           image.height=(image.height*450)/image.width;  
         }else{  
           image.width=image.width;    
           image.height=image.height;  
                      }  
            }  
        else{  //不太宽
             //alert("bbb");
         if(image.height>300){    
             //alert("ddd");
         image.height=300;  
         image.width=(image.width*300)/image.height;       
         }else{  
         image.width=image.width;    
         image.height=image.height;  
         }  

    }  return(image);
    }  
    </script><br>
    <input type="button" name="B6" value="图片" onclick="DrawImage('11.jpg')">
      

  5.   

    呵呵,帖主的函数是使图片适应某个框架对不?为什么帖主会总是想“载入图片时就以一定比例显示”呢?为什么不能是“载入图片之后先以原始尺寸显示图片,然后以迅雷不及掩耳之势改成一定比例显示”呢?还有一点哦,为什么帖主喜欢用document.write呢?这个函数经常会发生“完全改变页面”的情况啊,就像你说的“图片显示是在一个新的HTML中”,其实不是新的HTML,是新的document。另外,加入帖主执意要“一开始就以一定比例显示”,也是可以的哦~不过请不要再用document.write了~,请用CreateElement,Append,innerHTML= 之类的语句~有不明白的请查一下 微软的 DHTML DOM 手册~(不好意思,我经常是记不清楚这些函数的单词,有可能打错,你最好去查一下)
      

  6.   

    多谢楼上老兄.我已经改成了不用document.write,改用了CreateElement和appendChild了.
    a.src ="<%=Server.URLEncode(path2)%>";
    myIMG = new DrawImage(a);

    function fnCreate(){
    oData.innerHTML="";
    var html_txt = "<img src ='<%=server.URLEncode(path2)%>'>";
    var aElement=document.createElement(html_txt);
    aElement.width = myIMG.width;
    aElement.height = myIMG.height;
    oData.appendChild(aElement);
    form1.load_info.value='';
    form1.load_info.style.width='0px';
    }
    fnCreate();在上面代码中,DrawImage()这个方法中的注释部分不用了,即不用document.write那部分了.改成了上面后,图片还是有时第一次不显示出来,硬要到第二次以后才显示出来.这究竟是怎么回事了?
      

  7.   

    因为浏览器必须下载图片之后才能得到图片的宽度和高度
    第二次打开的时候,浏览器因为cache的原因已经知道图片的大小。我看你的程序是ASP的,因此可以考虑预先得到图片的大小,写成如下的形式:<img id="a"  width="400", height="300">
      

  8.   

    将所有用到的图片都放在一个隐藏的层中~~~
    这样的话在你打开页面后,就会下载所有图片~~~你再点BUTTON就不会有延迟了~~~
    不过打开页面可能时间会比较长~~
      

  9.   

    呵呵,我的就是ASP的.不过我的程序中不能先定义图片的大小啊,图片的宽高比例是不定的,如果直接定义死图片的大小,会导致显示出来后的图片比例失真啊.上面的程序,我如果加了个setTimeout后,第一次就会显示出来了.不过第一次显示的,有时是原始尺寸,点第二次才调整了比例了.
    function fnCreate(){
    oData.innerHTML="";
    var html_txt = "<img src ='<%=server.URLEncode(path2)%>'>";
    var aElement=document.createElement(html_txt);
    aElement.width = myIMG.width;
    aElement.height = myIMG.height;
    oData.appendChild(aElement);
    form1.load_info.value='';
    form1.load_info.style.width='0px';
    }
    //fnCreate();
      

  10.   

    呵呵,我的就是ASP的.不过我的程序中不能先定义图片的大小啊,图片的宽高比例是不定的,如果直接定义死图片的大小,会导致显示出来后的图片比例失真啊.上面的程序,我如果加了个setTimeout后,第一次就会显示出来了.不过第一次显示的,有时是原始尺寸,点第二次才调整了比例了.
    function fnCreate(){
    oData.innerHTML="";
    var html_txt = "<img src ='<%=server.URLEncode(path2)%>'>";
    var aElement=document.createElement(html_txt);
    aElement.width = myIMG.width;
    aElement.height = myIMG.height;
    oData.appendChild(aElement);
    form1.load_info.value='';
    form1.load_info.style.width='0px';
    }
    //fnCreate();
              //改成:
             setTimeout("fnCreate()",50);
      

  11.   

    帖主,wuyg(平平) 说的没有错啊~只用js不可能在网页未载入图片之前就确定图片的大小啊(用ASP的话就可以,参见首页里关于“ADODB.STREAM”的资料,自己找一下)但是,这与“第一次显示就改变大小”并不矛盾~“载入”和“显示”是不同的概念正像 mikespook(Mike大懒猫) 说的一样,载入的时候图片并不显示出来,而在载入之后立即改变图片的尺寸并使其可见(visibility属性),而这个函数,就附加在图片的“onload”事件中。相信你已经会写代码了……试试看
      

  12.   

    这个东西没想到会搞到这么麻烦.
    --------
    正像 mikespook(Mike大懒猫) 说的一样,载入的时候图片并不显示出来,而在载入之后立即改变图片的尺寸并使其可见(visibility属性),
    ---------
    一开始就全部载入图片在我的程序中是不现实的,我这是一个图片查看的程序,在开始的时候是不知道要多少图片的,图片的路径存在数据库中,图片存在目录中,也许有时图片有几十张,而且我左右分框架,左边是图片名的链接.左边又是一个树型结构,点击的节点不同,图片的内容又完全不同.所以一开始就装载是不行的.
    试了很久后,我终于找到一种暂时可以解决的方法了,在那个方法中无限循环,如果高宽还没得到,就继续调用,直到有高宽了为止.不知会不会出什么问题.
    function fnCreate(){
             var i_count = 0;
             var is_continue = true;
    oData.innerHTML="";
    var html_txt = "<img src ='<%=server.URLEncode(path2)%>'>";
    var aElement=document.createElement(html_txt);
    while(is_continue){
    i_count++;
    aElement.width = myIMG.width;
    aElement.height = myIMG.height;
    if(aElement.width != 0 && aElement.height !=0){
    is_continue = false;
    }else{
    myIMG = DrawImage(a);
    }
    }
    window.status = i_count;
                      oData.appendChild(aElement);
    form1.load_info.value='';
    form1.load_info.style.width='0px';
    }
    setTimeout("CreateImg()",10);这样一来,图片大一点的,我看到第一次点图片的时候,有的那个循环数居然有600多次!
      

  13.   

    倒……帖主你没理解我的意思?谁说要一开始就全部载入图片啊~?我是说图片的可见性(visibility)全部设置为hidden,然后图片的onload的事件是调用你的改变图片长宽的函数啊!记得在该函数最后设置图片可见性为visible就好了!!我才做的一个系统里面就有一个图片浏览功能的,系统里有10多万张图片,我就是这么做的没什么问题啊~
      

  14.   

    其实各位都忽略了一个非常好解决的方法,
    去年我就碰到这样的问题,也是个图片查看软件,你可以试试这样的方法,定义一个隐藏的内部IFRAME,该IFRME就是用来导入图片的,在主页面触发IFRAME导入图片,在IFRAME中的ONLOAD事件来触发主也面的的变化,在这时候因为图片都已经完全导入,那么图片的大小什么的都已经可以获取了,其他的自适应大小,不是非常容易了吗?而且这样还可以有完整的系统状态显示,等于就是后台导入,也有更好UI交互功能.
    我的项目就是这样的方案,客户反映都非常好,而且图片显示就是适应大小.
      

  15.   

    TO liuqinglq(白菜)感谢老兄的回复!不过我看了几遍你讲的方法,但就是没看明白,总是首先从感觉上就不能理解.
    老兄能否给点代码看看?谢谢