H5上传文件进度条

版权声明:每次关键时刻我都会掉链子,我知道重要时刻我都会发挥失常,所以我会付出150%的努力,即使只能发挥60%水平,也能拿到90分! https://blog.csdn.net/qq_16371909/article/details/81000450

首先推荐一波我的网站 iscoser.com
关于原生标签上传文件,之前有写过两篇:分别是H5标签上传文件(功能实现)H5标签上传文件(样式美化)
这一篇我们要讲的是上传文件时的上传进度监听(进度条的实现)依赖jQuery !

jQuery默认使用的XMLHttpRequest对象(下文简称xhr)是内部生成的,要知道上传进度我们就要监听其xhr对象的upload属性的变化。所以我们要解决的问题是“如何给jQuery默认生成的xhr对象绑定上我们自己写的监听函数”。

热心网友们想到了一个办法,首先封装一个方法 传入一个监听函数 返回一个绑定了监听函数的XMLHttpRequest对象。具体实现方法如下:

$.ajax({
    type: "post",
    url: "上传路径",
    processData: false,
    data: {},
    //关键部分,用xhrOnProgress方法监听xhr,并返回挂载了监听函数的新xhr对象
    xhr: xhrOnProgress(function(e) {
        var percent = e.loaded / e.total;//计算百分比
        console.log(percent);
    }),
    success: function(r) {
        console.log(r);
    }
});

//上传进度监听方法
var xhrOnProgress = function(fun) {
    xhrOnProgress.onprogress = fun; //绑定监听
    //使用闭包实现监听绑
    return function() {
    //通过$.ajaxSettings.xhr();获得XMLHttpRequest对象
    var xhr = $.ajaxSettings.xhr();

    //判断监听函数是否为函数
    if(typeof xhrOnProgress.onprogress !== 'function'){
        return xhr;
    }

    //如果有监听函数并且xhr对象支持绑定时就把监听函数绑定上去
    if(xhrOnProgress.onprogress && xhr.upload) {
        xhr.upload.onprogress = xhrOnProgress.onprogress;
    }
    return xhr;
    }
}

以上部分就可以实现上传进度的监听了,我们在控制台的network将我们的网速设置为fast3g来测试这个上传的进度的变化,太快了感受不出来。打印的是变量是percent,即上传进度百分比,这个在上面的xhrOnProgress方法里面。测试图如下:
这里写图片描述

注意控制台打印的数据,就是我们的percent输出值。
下面贴完整的代码,直接复制粘贴可不能使用喔,但不要紧张或者咒骂这什么垃圾玩意!你只需要修改jquery的引用路径和上传的地址就可以了,我在注释里面给你标注了。拿到了关键的上传进度值,写个进度条还不容易么。完整代码如下:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>AJAX上传文件进度条的实现原理</title>
    </head>

    <body>
        <input type="file" onchange="uploadFile()" />
    </body>
    <!--这里要引用你自己的jquery喔 -->
    <script type="text/javascript" src="jquery-2.1.4.min.js"></script>
    <script>
        function uploadFile(event) {

            var e = window.event || event;
            var oFile = e.target.files[0];

            var oData = new FormData();
            oData.append("file", oFile);

            //上传进度监听方法
            var xhrOnProgress = function(fun) {
                xhrOnProgress.onprogress = fun; //绑定监听
                //使用闭包实现监听绑
                return function() {
                    //通过$.ajaxSettings.xhr();获得XMLHttpRequest对象
                    var xhr = $.ajaxSettings.xhr();
                    //判断监听函数是否为函数
                    if(typeof xhrOnProgress.onprogress !== 'function')
                        return xhr;
                    //如果有监听函数并且xhr对象支持绑定时就把监听函数绑定上去
                    if(xhrOnProgress.onprogress && xhr.upload) {
                        xhr.upload.onprogress = xhrOnProgress.onprogress;
                    }
                    return xhr;
                }
            }

            $.ajax({
                type: "post",
                url: "",//这里加上你自己的上传地址
                processData: false,//关闭jquery对文件的预处理
                data: oData,
                xhr: xhrOnProgress(function(e) {
                    //关键数据
                    /*稍微处理一下,看看控制台的打印数据就是上传的进度,
                     想要看明白,就控制一下你的网速,在浏览器控制台的
                     Network选项里面可以选择网速,选择fast 3g就可以啦。*/
                    var percent = e.loaded / e.total;
                }),
                success: function(r) {
                    console.log(r);
                }
            });

        }
    </script>

</html>

好了,全文到此结束,虽然现在是Vue、React、Angular的时代,但是jQuery真的是经典啊。又或者说,是我们这些见证着前端由jQuery到三剑客的老家伙们的一点执念吧!正所谓老兵不死,只是凋零!
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_16371909/article/details/81000450