Ajax实现进度条

     业务逻辑:在web应用建立进度条。

    页面:progressBar.jsp

<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>
Ajax进度条
</title>
<script type="text/javascript">
 //xmlHttpRequest对象
 var xmlHttp;
 var key;
        //进度条颜色
        var bar_color='gray';
  var span_id='block';
         var clear="&nbsp;&nbsp;&nbsp;"
        
        //创建xmlHttpRequest对象
        function createXMLHttpRequest(){
         if (window.ActiveXObject){
          xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                }
                else if(window.XMLHttpRequest){
                 xmlHttp = new XMLHttpRequest();
                }
        }
       
        //执行方法
        function go(){
         createXMLHttpRequest();
                checkDiv();
                var url = "ProgressBarServlet?task=create";
                //隐藏按钮
                var button = document.getElementById("go");
                button.disabled = true;
               
                xmlHttp.open("GET",url,true);
                xmlHttp.onreadystatechange = goCallback;
                xmlHttp.send(null);
        }
       
        //回调方法
        function goCallback(){
         if (xmlHttp.readyState == 4){
          if (xmlHttp.status == 200){
                           //设置更新时间
                                setTimeout("pollServer()",2000);
                        }
                }
        }
       
        //刷新,重新发送
        function pollServer(){
         createXMLHttpRequest();
                var url = "ProgressBarServlet?task=poll&key=" + key;
                xmlHttp.open("GET",url,true);
                xmlHttp.onreadystatechange = pollCallback;
                xmlHttp.send(null);
        }
       
        //回调方法
        function pollCallback(){
         if (xmlHttp.readyState == 4){
          if (xmlHttp.status == 200){
                           //完成百分比
                                var percent_complete = xmlHttp.responseXML.getElementsByTagName("percent")[0].firstChild.data;
                               
                                var index = processResult(percent_complete);
                                var (var i = 1; i <= index;i++){
                                 var elem = document.getElementById("block" + i);
                                        elem.innerHTML = clear;
                                       
                                        elem.style.backgroundColor = bar_color;
                                        var next_cell = i + 1;
                                        if (next_cell > index && next_cell < = 9){
                                         document.getElementById("block" + next_cell).innerHTML = percent_complete + "%";
                                        }
                                }
                               
                                if (index < 9){
                                 setTimeout("pollServer()",2000);
                                }else{
                                 document.getElementById("complete").innerHTML =  "Complete!";
                                        document.getElementById("go").disabled = false;
                                }
                        }
                }
        }
       
        //解析结果
        function processResult(){
         var ind;
                if (percent_complete.length == 1){
                 ind = 1;
                }else if (percent_complete.length == 2){
                 ind = percent_complete.substring(0,1);
                }else(
                 ind = 9;
                }
               
                return ind;
        }
       
        //检查提示层信息
        function checkDiv(){
         var progress_bar = document.getElementById("progressBar");
                if (progress_bar.style.visibility == "visible"){
                 //清除进度条
                   clearBar();
                        document.getElementById("complete").innerHTML = "";
                }else{
                 progress_bar.style.visibility = "visible";
                }
        }
       
        //清除进度条
        function clearBar(){
         for (var i = 1; i < 10; i++){
          var elem = document.getElementById("block" + i);
                        elem.innerHTML = clear;
                        elem.style.backgroundColor = "white";
                }
        }
  </script>
</head>
<body bgcolor="#ffffff">
<h1>
Ajax进度条示例
</h1>
运行进度条:
<input type="button" value="运行" id="go" οnclick="go()"/>
<p>
</p>
<table align="center">
 <tbody>
          <tr>
            <td><div id="progressBar" style="padding:2px;border:solid black 2px;visibility?hidden">
             <span id="block1">&nbsp;&nbsp;&nbsp;</span>
             <span id="block2">&nbsp;&nbsp;&nbsp;</span>
                <span id="block3">&nbsp;&nbsp;&nbsp;</span>
                <span id="block4">&nbsp;&nbsp;&nbsp;</span>
                <span id="block5">&nbsp;&nbsp;&nbsp;</span>
                <span id="block6">&nbsp;&nbsp;&nbsp;</span>
                <span id="block7">&nbsp;&nbsp;&nbsp;</span>
                <span id="block8">&nbsp;&nbsp;&nbsp;</span>
                <span id="block9">&nbsp;&nbsp;&nbsp;</span>
            </div></td>
          </tr>
          <tr><td align="center" id="complete"></td> </tr>
 </tbody>
</table>
</body>
</html>

服务器端:ProgressBarServlet.java

package ajaxvalidation;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class ProgressBarServlet
    extends HttpServlet {
  private static final String CONTENT_TYPE = "text/html; charset=GBK";
  //计数器
  private int counter = 1;
  //Initialize global variables
  public void init() throws ServletException {
  }

  //处理get方法
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws
      ServletException, IOException {
    //得到任务类型
    String task = request.getParameter("task");
    //返回的xml字符串
    String res = "";
   
    //第一次,创建进度条
    if (task.equals("create")){
      res = "<key>1</key>";
      counter = 1;
    }else{
      //完成百分比
      String percent = "";
      switch(counter){
        case 1:percent = "10";break;
        case 2:percent = "23";break;
        case 3:percent = "35";break;
        case 4:percent = "51";break;
        case 5:percent = "64";break;
        case 6:percent = "73";break;
        case 7:percent = "89";break;
        case 8:percent = "100";break;
      }
      counter++;
     
      res = "<percent>" + percent + "</percent>";
    }
   
    PrintWriter out = response.getWriter();
    response.setContentType("text/xml");
    response.setHeader("Cache-Control","no-cache");
    out.println("<response>");
    out.println(res);
    out.println("</response>");
    out.close();
  }

  //Clean up resources
  public void destroy() {
  }
}

 

参考书籍:Ajax基础教程,作笔记吧

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在Django中实现进度条,可以使用Django框架提供的HttpResponse对象和Ajax技术。 首先,在views.py中编写一个函数,用于处理上传文件的请求。该函数可以使用Python的os模块来执行上传文件的操作,并在上传过程中输出进度信息。 然后,在该函数中使用Django的HttpResponse对象来返回上传进度信息。可以将进度信息转化为JSON格式,并使用HttpResponse对象的content_type参数来指定返回的数据类型。 最后,在前端使用Ajax技术来获取HttpResponse对象中的进度信息,并将其显示在进度条上。 下面是一个简单的示例代码: ```python # views.py import os from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt import json @csrf_exempt def upload(request): if request.method == 'POST': file = request.FILES.get('file') file_path = '/path/to/upload/directory/' + file.name with open(file_path, 'wb+') as f: for chunk in file.chunks(): f.write(chunk) uploaded_size = f.tell() total_size = file.size progress = uploaded_size / total_size response_data = { 'progress': progress, 'uploaded_size': uploaded_size, 'total_size': total_size } response_json = json.dumps(response_data) response = HttpResponse(response_json, content_type='application/json') response['Content-Length'] = len(response_json) yield response # upload.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Upload File</title> <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> </head> <body> <form id="upload-form" method="POST" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="file"> <button type="submit">Upload</button> </form> <div> <progress id="progress-bar" value="0" max="1"></progress> <span id="progress-text">0%</span> </div> <script type="text/javascript"> $(document).ready(function() { $('#upload-form').submit(function(event) { event.preventDefault(); var formData = new FormData(this); $.ajax({ url: '/upload/', type: 'POST', data: formData, processData: false, contentType: false, xhr: function() { var xhr = new window.XMLHttpRequest(); xhr.upload.addEventListener('progress', function(event) { if (event.lengthComputable) { var percentComplete = event.loaded / event.total; $('#progress-bar').val(percentComplete); $('#progress-text').text(percentComplete * 100 + '%'); } }, false); return xhr; }, success: function(response) { console.log('Upload complete!'); }, }); }); }); </script> </body> </html> ``` 在这个例子中,upload函数会处理上传文件的请求,并在上传过程中输出进度信息。在前端,使用Ajax技术来获取HttpResponse对象中的进度信息,并将其显示在进度条上。 通过访问http://yourdomain.com/upload/即可上传文件并动态显示进度条
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值