qq_40670978 2019-07-23 09:11 采纳率: 0%
浏览 2136

用onprogress事件监控文件上传进度的问题,

使用filereader对象的onprogress可以监控到文件上传进度,今天突发奇想,
想在input标签里面写onprogress事件,像这样

<input type="file" id="files" onprogress="handleProgress()"/>

oninput事件是一上传文件就能调用
handleProgress()方法始终没有调用,不知道怎么触发这个onprocess事件,有人会吗,
我希望在input标签中使用onprogress事件,而不是通过js进行事件绑定

  • 写回答

1条回答 默认 最新

  • Ah_JackChen 2019-07-23 09:33
    关注

    原理:

    给XMLHttpRequest对象的upload属性绑定onprogress方法监听上传过程

    var xhr=new XMLHttpRequest(); xhr.upload.onprogress=function(e){}

    因为jQuery默认使用的XMLHttpRequest对象是内部生成的无法直接给jq的xhr绑定onprogress方法
    所以只要给jQuery重新生成一个绑定了onprogress的XMLHttpRequest对象即可实现
    首先封装一个方法 传入一个监听函数 返回一个绑定了监听函数的XMLHttpRequest对象

    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方法

    $.ajax({
        url: url,
        type: 'POST',
        xhr:xhrOnProgress(function(e){
            var percent=e.loaded / e.total;//计算百分比
        })
    });
    

    使用HW.js文件上传工具 自带进度条效果 支持绑定自定义监听函数,支持上传实时预览(HTML5实现 无需服务器)HW.js

    <div id="cover" class="HW_upload">请选择要上传的文件</div>
    <script>
    var upload= new HW.Widget.upload.Create({
        target:'#cover',//指定上传控件
        url:"/upload.php",//上传地址
        //设置允许上传的文件大小 单位为kb 默认为 4096
        maxSize:2048,
        //开启多文件上传
        mult:false,
        //设置上传按钮的文字
        uploadText:'请选择要上传的文件',
        //设置上传超时限制 单位为分钟 默认为20分钟
        timeout:20,
        //设置允许上传的文件类型 默认为['png','jpg','jpeg']
        // accept:['jpg'],
        //设置文件上传参数名 默认为HW_upload_input
        inputName:'cover',
        //设置控件为图片上传 默认为true 为false时则不开启文件预览
        isImage:true,
        //自定义文件检查函数 默认检测文件大小 类型
        // fileCheck:function(file){return true;},
        viewSize:[500,300],//设置图片预览框宽高 默认为400,300
        viewImageWidth:70,//设置预览图片宽度默认为80
        done:function(data){
           alert(data);//获得上传结束后服务器返回的数据
        }
    });
    
    评论

报告相同问题?

悬赏问题

  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作