JS实现文件加载进度

目前在移动页面上,有很多情况需要加载大量的资源。但是移动端的访问速度和pc还是有很大的差距,有些时候需要一些取巧的方式来提升用户体验,而实时显示加载进度就是其中一种。

最终效果

代码如下

  <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        *{margin: 0;padding: 0;}
        div{width:200px;height: 30px;border:1px solid #ccc;margin: 50px auto;}
        span{display:inline-block;height: 30px;background: #abcdef;}
    </style>
</head>
<body>

    <div>
        <span id="loading"></span>
    </div>


    <!-- 图片需要自己添加到本地  协议要走http or https -->
    <script>
        var img_arr = ['1.jpg','2.jpg','3.png'];
        var nums = img_arr.length;
        var start = 0;
        for(var i in img_arr){
            var img = document.createElement('img');
            img.src = img_arr[i];
            (function(j){
                img.onload = function(){
                    start++;
                    if(start == nums){
                        console.log('全部加载完成');
                    }
                    document.getElementById('loading').style.width = (start/nums)*100 + '%';
                };
                img.onerror = function(){
                    start++;
                    console.log(img_arr[j] + '失败');
                    document.getElementById('loading').style.width = (start/nums)*100 + '%';
                }
            })(i);
            
        }

    </script>
</body>
</html>

有些情况下,资源会加载失败,但是页面又需要显示出来。这里我是把失败的情况就跳过了,如果有需要,可以考虑重新换资源加载

注意事项

  • 测试的时候,需要把文件放到服务器上,走本地的file协议是看不到效果的
  • 测试的时候,可以把网络设置为2g或者3g,可以方便看到加载的进度,然后禁止使用缓存
chrome 控制台

拓展

这里只监听了img格式,如果有需要,可以把js和css都加进来

注意:监听js或者css,需要把创建的资源追加到页面中,要不然监听不到onload和onerror事件

  <script>
        var script_arr = ['http://cdn.bootcss.com/jquery/3.1.0/jquery.slim.js','http://cdn.bootcss.com/jquery/3.0.0-rc1/jquery.js','http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.slim.min.js'];
        var nums = script_arr.length;
        var start = 0;
        for(var i in script_arr){
            var script = document.createElement('script');
            script.src = script_arr[i];
            (function(j){
                document.body.appendChild(script);
                script.onload = function(){
                    start++;
                    if(start == nums){
                        console.log('全部加载完成');
                    }
                    document.getElementById('loading').style.width = (start/nums)*100 + '%';
                };
                script.onerror = function(){
                    start++;
                    console.log(srcript_arr[j] + '失败');
                    document.getElementById('loading').style.width = (start/nums)*100 + '%';
                }
            })(i);
            
        }

    </script>
point
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容