zoukankan      html  css  js  c++  java
  • javaScript & jquery完美判断图片是否加载完毕

    好久没写东西了,正好最近因为工作需要,写了一个瀑布流异步加载的程序。

    今天就不谈瀑布流,来谈一下关于load的问题。

    -------------------------------------------------------------

    众所周知,常见瀑布流当鼠标滚动到浏览器底部的时候,就会发起一个ajax的请求。在服务端生成item列表后,通过 js append到相应的div里边。

    看起来很简单的样子,关键问题就出在图片的加载问题上,图片一般都放在服务器上,通过http下载到客户端。

    例如我的图片地址:

    http://xxx.xxx.com/sc/item/cover/9-4352-c400.jpg

    而图片下载到本地是需要一定时间的(网速快的路过)。当图片还没有下载完的时候,使用js获取到元素的宽高将会是0。

    -------------------------------------------------------------------

    有的同学说了我使用jquery的ready不就好了。如下

    $(document).ready(function(){
      // 在这里写你的代码...
    });

    如果这么简单就好了,我这里就说下ready与window.onload的区别。

    jquery的ready只是dom的结构加载完毕,便视为加载完成。(缺点是图片没有加载完毕,宽高为0,程序出错)

    js的window.onload是指dom的生成和资源的加载,比如flash、图片完全加载出来后才执行onload。(缺点就是当某一张图片很大的时候,岂不阻止了其它js的正常执行)

    -------------------------------------------------------------------------------------

    知道了他们的区别后,我们再来谈谈如何避免错误和选择性使用。

    如果你进行了百度,很多人会告诉你。

    这样:

    $('img').load(function(){
      // 加载完成    
    });

    好像很强大的样子,其实不然,他的缺点是每加载一张图片,回调函数就执行一次。好吧太烦了,我只想全部加载完走一次就可以了。当然可以,你可以进行修改如下:

    va imgNum=$('img').length;
    $('img').load(function(){
        if(!--imgNum){
            // 加载完成
        }
    });

    这样总可以了吧,我加载一张,就用图片总数去减一,减到0我就加载完毕。看起来很完美,前提是你没遇到IE。

    IE的图片总是从缓存文件里去拿,这就造成load方法根本就不执行,只有是新图片才会走load。

    服了吧?继续往下看。

    ---------------------------------------------------------------

    或者是这样:

    document.getElementById('img').onload=function(){
            // 加载完成 
    };

    看我原生代码一统天下,实际上效果甚微,一次只能处理一个你准备写多少个document,有人说我可以用循环去绑定,经过我测试貌似根本没效果。

    还是一笑而过吧。看看我的最终解决方案(兼容:谷歌&火狐&IE)

    -------------------------------------------------------------

    利用图片没有加载完成的时候,宽高为0。我们很容易判断图片的一个加载情况。如下:

    var t_img; // 定时器
    var isLoad = true; // 控制变量
    
    // 判断图片加载状况,加载完成后回调
    isImgLoad(function(){
        // 加载完成
    });
    
    // 判断图片加载的函数
    function isImgLoad(callback){
        // 注意我的图片类名都是cover,因为我只需要处理cover。其它图片可以不管。
        // 查找所有封面图,迭代处理
        $('.cover').each(function(){
            // 找到为0就将isLoad设为false,并退出each
            if(this.height === 0){
                isLoad = false;
                return false;
            }
        });
        // 为true,没有发现为0的。加载完毕
        if(isLoad){
            clearTimeout(t_img); // 清除定时器
            // 回调函数
            callback();
        // 为false,因为找到了没有加载完成的图,将调用定时器递归
        }else{
            isLoad = true;
            t_img = setTimeout(function(){
                isImgLoad(callback); // 递归扫描
            },500); // 我这里设置的是500毫秒就扫描一次,可以自己调整
        }
    }

    总结:

    windows.onload可以工作.

  • 相关阅读:
    桟错误分析方法
    gstreamer调试命令
    sqlite的事务和锁,很透彻的讲解 【转】
    严重: Exception starting filter struts2 java.lang.NullPointerException (转载)
    eclipse 快捷键
    POJ 1099 Square Ice
    HDU 1013 Digital Roots
    HDU 1087 Super Jumping! Jumping! Jumping!(动态规划)
    HDU 1159 Common Subsequence
    HDU 1069 Monkey and Banana(动态规划)
  • 原文地址:https://www.cnblogs.com/zhao1949/p/6497204.html
Copyright © 2011-2022 走看看