转载URL:https://www.w3cmm.com/ajax/progress-events.html

MDN参考:https://developer.mozilla.org/zh-CN/docs/Web/API/ProgressEvent

进度事件(Progress Events)

Progress Events定义了与客户端服务器通信有关的事件。这些事件最早其实只针对XHR操作,但目前也被其它API借鉴。有以下6个进度事件。

  • loadstart:在接收到相应数据的第一个字节时触发。
  • progress:在接收相应期间持续不断触发。
  • error:在请求发生错误时触发。
  • abort:在因为调用abort()方法而终止链接时触发。
  • load:在接收到完整的相应数据时触发。
  • loadend:在通信完成或者触发error、abort或load事件后触发。

每个请求不对触发Loadstart事件开始,接下来是一或多个progress事件,然后触发error、abort或load事件中的一个,最后以触发loadend事件结束。

支持前5个事件的浏览器有Firefox 3.5+、Safari 4+、Chrome、iOS版Safari和Android版WebKit。Opera、IE8+只支持load事件。目前还没有浏览器支持loadend事件。

这些事件大都很直观,但其两个事件有一些细节需要注意。

1.load事件

Firefox在实现XHR对象的某个版本时,曾致力于简化异步交互模型。最终,Firefox实现中引入了load事件,用以替代readystatechange事件。响应接收完毕后将触发Load事件,因此也就没有必要去检查readyState属性了。而onload事件处理程序会接收到一个event对象,其target属性就指向XHR对象实例,因而可以访问到XHR对象的所有方法和属性。然而,并非所有浏览器都为这个事件实现了适当的事件对象。结果,开发人员还是要像下面这样被迫使用XHR对象变量。

function createXHR(){
    if(typeofXMLHttpRequest!="undefined"){
        returnnewXMLHttpRequest();
    }elseif(typeofActiveXObject!="undefined"){
        if(typeof arguments.callee.activeXString !="string"){
            var versions =["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"];
            for(var i =0, len = versions.length; i < len; i++){
                try{
                    var xhr =newActiveXObject(versions[i]);
                    arguments.callee.activeXString = versions[i];
                    return xhr;
                }catch(ex){
                    //跳过
                }
            }
        }
        returnnewActiveXObject(arguments.callee.activeXString);
    }else{
        thrownewError("NO XHR object available.")
    }}
var xhr = createXHR();
xhr.onload =function(){
    if((xhr.status >=200&& xhr.status <300)|| xhr.status ==304){
        alert(xhr.responseText);
    }else{
        alert("Request was unsuccessful: "+ xhr.status);
    }};
xhr.open("get","altevents.php",true);
xhr.send(null);

只要浏览器接收到服务器的响应,不管其状态如何,都会触发load事件。而这意味着你必须要检查status属性,才能确定数据是否真的已经可用了。Firefox、Operan、Chrome和Safari都支持load事件。

2.progress事件

progress事件会在浏览器接收新数据期间周期性地触发。而onprogress事件处理程序会接收到一个event对象,其target属性是XHR对象,但包含着三个额外的属性:lengthComputable、loaded和total。其中,lengthComputable是一个表示进度信息是否可用的布尔值,loaded表示已经接收的字节数,loaded表示根据Content-Length响应头部确定的预期字节数。有了这些信息,我们就可以为用户创建一个进度指示器了。下面展示了为用户创建进度指示器的一个示例。

var xhr = createXHR();
xhr.onload =function(){
    if((xhr.status >=200&& xhr.status <300)|| xhr.status ==304){
        alert(xhr.responseText);
    }else{
        alert("Request was unsuccessful: "+ xhr.status);
    }};//get请求一般用来获取下载进度
xhr.onprogress =function(event){
    var divStatus = document.getElementById("status");
    if(event.lengthComputable){
        divStatus.innerHTML ="Recived"+event.loaded +" of "+event.total +" bytes";
    }}
xhr.open("get","altevents.php",true);
xhr.send(null);

为确保正常执行,必须在调用open()方法之前添加onprogress事件处理程序。在前面的例子中,每次触发progress事件,都会以新的状态信息更新HTML元素的内容。如果响应头部中包含Content-Length字段,那么也可以利用此信息来计算从响应中已经接收到的数据的百分比

当请求类型为post时需要监听xhr.upload。

//post一般用来获取上传进度
xhr.upload.onprogress =function(e){if(e.lengthComputable){
console.log(e.loaded / e.total *100)}}

下面是一个get请求综合示例:

<divid="status"></div><scripttype="text/javascript">
    function createXHR(){
        if(typeofXMLHttpRequest!="undefined"){
            returnnewXMLHttpRequest();
        }elseif(typeofActiveXObject!="undefined"){
            if(typeof arguments.callee.activeXString !="string"){
                var versions =["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],
                    i, len;                 for(i =0, len = versions.length; i < len; i++){
                    try{
                        var xhr =newActiveXObject(versions[i]);
                        arguments.callee.activeXString = versions[i];
                        return xhr;
                    }catch(ex){
                        //跳过
                    }
                }
            }             returnnewActiveXObject(arguments.callee.activeXString);
        }else{
            thrownewError("No XHR object available.");
        }
    }     window.onload =function(){
        var xhr = createXHR();
        xhr.onload =function(){
            if((xhr.status >=200&& xhr.status <300)|| xhr.status ==304){
                alert(xhr.responseText);
            }else{
                alert("Request was unsuccessful: "+ xhr.status);
            }
        };
        xhr.onprogress =function(event){
            var divStatus = document.getElementById("status");
            if(event.lengthComputable){
                divStatus.innerHTML ="接收到 "+ event.loaded +" of "+ event.total +" bytes";
            }
        };
        xhr.open("get","altevents.php",true);
        xhr.send(null);
    };</script>

altevents.php文件示例代码:

<!-- altevents.php --><?php
    header("Content-Type: text/plain");
    header("Content-Length: 27");
    echo "Some data";
    flush();
    echo "Some data";
    flush();
    echo "Some data";
    flush();?>

(转载) 上传文件进度事件,进度事件(Progress Events)的更多相关文章

  1. HTML5 jQuery+FormData 异步上传文件,带进度条

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link href ...

  2. Spring Boot上传文件(带进度条)

    Spring Boot 上传文件(带进度条)# 配置文件 spring: freemarker: template-loader-path: classpath:/static/ ##Spring B ...

  3. ajax 上传文件,显示进度条,进度条100%,进度条隐藏,出现卡顿就隐藏进度条,显示正在加载,再显示上传完成

    <form id="uploadForm" method="post" enctype="multipart/form-data"&g ...

  4. jquery ajax php 无刷新上传文件 带 遮罩 进度条 效果的哟

    在很多项目中都会叫用户上传东西这些的,自从接触了jquery 和ajax之后就不管做什么,首先都会想到这个,我这个人呢?是比较重视客户体验的,这次我这边负责的是后台板块,然后就有一块是要求用户上传照片 ...

  5. 前端使用nginx上传文件时,进度获取不对

    在使用iview时,上传文件获取进度时onUploadProgress返回数据不对. 原因是开启了nginx代理,本地上传时先传到本地nginx然后在传到服务器,导致获取进度不对 解决:在nginx的 ...

  6. MVC上传文件并模拟进度条

    进度条样式和JS <style type="text/css"> .spa { font-size: 12px; color: #0066ff; } .put { fo ...

  7. spring mvc + xmlHttpRequest2.0 实现无刷新上传文件,带进度条和剩余时间

    1.springmvc支持文件上传,需要在spring-mvc.xml配置文件中加上下面的一段话: <!-- 支持上传文件 --> <bean id="multipartR ...

  8. js上传文件(可自定义进度条)

    //本地上传图片.语音 function rsc_UploadFile(file) { ]; //创建一个FormData空对象,然后使用append方法添加key/value var fd = ne ...

  9. [转]C#在WinForm下使用HttpWebRequest上传文件并显示进度

    /// <summary> /// 将本地文件上传到指定的服务器(HttpWebRequest方法) /// </summary> /// <param name=&qu ...

随机推荐

  1. 五步掌握Git的基本开发使用命令

    第一步:设置全局变量: git config --global user.name "gang.li" git config --global user.email "l ...

  2. JDBC连接MySQL数据库的示例代码

    虽然老调,但有时也需要用一下,从网上找的原型修改了下放这. import java.sql.Connection; import java.sql.DriverManager; import java ...

  3. java 短信猫发送短信的方法

    用java实现短信收发的功能,目前一般项目中短信群发功能的实现方法大致有下面三种: ·                 1. 向运行商申请短信网关,不需要额外的设备,利用运行商提供的API调用程序发送 ...

  4. 【转载】Socket通讯原理以及TCP、IP三次握手机制分析

    要写网络程序就必须用Socket,这是程序员都知道的.而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,w ...

  5. 处理页面载入图片js(等比例压缩图片)

    第一页面html  <div class="admin">${answer.content}</div> <div class="admin ...

  6. apk程序查找方法调用

    有android killer,现在ida对android的支持等一些方便工具,此篇(关于搜索和修改代码)废弃. 没有好的调试工具下 常用插代码(如果怕影响寄存器值,可以将.locals xxx改多几 ...

  7. vmware nat不能上网的解决办法

    1 很多奇怪的问题都是vmware突然不能上网导致的 当yum.pip等包管理工具突然不能上网了时,要ping www.baidu.com,看看网络是不是好的. 2 nat网络出现问题的解决办法 2. ...

  8. TiDB 是否支持其他存储引擎?

    https://www.pingcap.com/docs-cn/FAQ/ 1.1.11 TiDB 是否支持其他存储引擎? 是的,除了 TiKV 之外,TiDB 还支持一些流行的单机存储引擎,比如 Go ...

  9. Tomcat的虚拟主机的配置

    比如:配置一个虚拟主机的名字是www.sina.com 1 改动window系统中的HOST文件[C:\WINDOWS\system32\drivers\etc\hosts]   127.0.0.1 ...

  10. (linux)schedule_delayed_work()

      原文地址:schedule_delayed_work()用法作者:Valley   第一篇 工作队列       在Linux内核中,对下半部(或者说推后执行的工作)的处理方式有好几种,包括BH( ...