• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    让ajax更加友好的实现方法(实时显示后台处理进度。)
    ajax应用越来越多,大部分ajax处理都是在前台显示1个"loading...",然后把数据提交给服务器进行处理,处理完毕后显示"处理完毕"。我们能否让ajax更加友好点,实时显示服务器处理的进度了?这在一些长时间的请求中尤其重要,比如上传文件、发送邮件、批量处理数据。答案当然是可以的,不然就不会写这个了,对吧,^_^。

    存在的问题:
    要解决实现上面的功能,需要解决下面几个问题:

    1. 服务器如何在处理一部分数据后传递部分response到浏览器。
    2、浏览器如何能处理服务器传递过来部分数据,并保持http连接直到处理完全完毕。

    要解决第1个问题,使用flush让response分块进行呈现就可以了,具体请参考我另一遍随笔"flush让页面分块,逐步呈现";
    第2个问题,则需要用到XMLHttpRequest的readyState状态,w3c对 readyState 定义如下几个值:
    UNSENT = 0; // 没有发送请求
    OPENED = 1; // 已经打开http连接
    HEADERS_RECEIVED = 2; // 接收到response header
    LOADING = 3; // 真正接收response body
    DONE = 4; // 请求接收完毕
    相信状态4大家是天天在用,而我们这里需要用到就是状态3。
    实例:
    废话少说,代码实例比什么文字解释都管用。我们这里假设服务器的1个处理需要6秒种,每秒种处理1条记录,总共处理6条记录,我们需要服务器每处理完1条数据,客户端则显示处理进度(包括文字和进度条)。
    服务器端代码(下面JSP代码):
    复制代码 代码如下:

    %
    // 下面设置Content-Type:application/x-javascript 是为了适应Webkit的浏览器(chrome,safari)
    response.setHeader("Content-Type","application/x-javascript");
    int count = 6; // 处理6条数据
    for(int i=0;icount;i++){
    // 处理完毕一条,输出结果到客户端
    out.println(i+1);
    out.flush();
    // 这里假设每条数据处理时间为1秒
    Thread.currentThread().sleep(1000);
    }
    %>

    html代码:
    复制代码 代码如下:

    !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    html xmlns="http://www.w3.org/1999/xhtml">
    head>
    style>
    #divProgress{width:300px;height:24px;position:relative;}
    #divProgress div{position:absolute;left:0;top:0;height:24px;}
    #progressBg{background-color:#B9F8F9;z-index:10;}
    #progressText{z-index:15;text-align:center;width:100%;}
    /style>
    /head>
    body>
    div id="divProgress">
    div id="progressBg">/div>
    div id="progressText">/div>
    /div>
    br />
    button onclick="send()">提交数据/button>
    script>
    var t = document.getElementById("progressText");
    var bg = document.getElementById("progressBg");
    function send(){
    t.innerHTML = "loading...";
    bg.style.width = "0px";
    var xhr = new window.XMLHttpRequest();
    if(!window.XMLHttpRequest){
    try {
    xhr = new window.ActiveXObject("Microsoft.XMLHTTP");
    } catch(e) {}
    }
    xhr.open("post","http://localhost:801/ChunkTest/chunk.jsp?count=6");
    var oldSize=0;
    xhr.onreadystatechange = function(){
    if(xhr.readyState > 2){
    var tmpText = xhr.responseText.substring(oldSize);
    oldSize = xhr.responseText.length;
    if(tmpText.length > 0 ){
    // 设置文本
    t.innerHTML = tmpText + "/6";
    // 设置进度条
    var width = parseInt(tmpText)/6*300;
    bg.style.width = width+"px";
    }
    }
    if(xhr.readyState == 4){
    // 请求执行完毕
    t.innerHTML = "执行完毕";
    bg.style.width = "300px";
    }
    }
    xhr.send(null);
    }
    /script>
    /body>
    /html>

    运行效果图: 



    缺点:

    看到这里或许你已经蠢蠢欲动,想自己动手试试了。但是注意上面的方法虽好,但也有个缺点,就是浏览器的支持问题。目前IE所有版本的浏览器都不支持 xhr.readyState == 3状态,IE浏览器不支持在response响应完毕前读取responseText属性。 具体可查看MSDN : XMLHttpRequest Object

    基于Webkit的浏览器支持的不是很好,需要设置Content-Type:application/x-javascript才行(经测试发现Content-Type:text/html在有些情况下正常,有些情况下又不正常,而用application/x-javascript都正常)。

    看到了缺点后是否又打击了你的积极性了,其实针对IE,我们不需要做太多处理,IE不支持,就不会显示进度,就变成跟传统的ajax请求一样,一直显示1个loading直到请求完毕。我们只需要加1个简单的判断,判断如果是ie则不执行xhr.readyState > 2中的代码,如果不加判断,IE下会报JS错误.

    DEMO:

    demo服务器不太好,而且在国外,随时可能会点击不了,而且有时候运行效果不是很好,大家知晓下,最好是把代码copy到本地进行测试.
    请使用firefox或chrome查看demo,ie查看的效果跟一般的ajax没什么不一样.
    http://213.186.44.204:8080/ChunkTest/index.html  
    转载请注明出处:http://www.cnblogs.com/BearsTaR/。 禁止商用!
    您可能感兴趣的文章:
    • AJAX和JSP实现的基于WEB的文件上传的进度控制代码
    • AJAX 进度条实现代码
    • ajax+php打造进度条 readyState各状态
    • ajax+php打造进度条代码[readyState各状态说明]
    • ajax提交加载进度条示例代码
    • 一个简单的ajax上传进度显示示例
    • php+ajax实现带进度条的大数据排队导出思路以及源码
    • jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
    • jsp+ajax发送GET请求的方法
    • jquery+ajax实现跨域请求的方法
    • asp.net+ajax的Post请求实例
    • 服务端配置实现AJAX跨域请求
    • 解决ajax跨域请求数据cookie丢失问题
    • django通过ajax发起请求返回JSON格式数据的方法
    • Ajax在请求过程中显示进度的简单实现
    上一篇:给初学ajax的人 ajax函数代码
    下一篇:Ajax的内部实现机制、原理与实践小结
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    让ajax更加友好的实现方法(实时显示后台处理进度。) 让,ajax,更加,友,好的,实现,