简单的jQuery进度条

时间:2014-10-03 14:39:09

标签: javascript php jquery html ajax

假设:有一些cablemodems,一个人想要从MySQL数据库中列出他们的数据。 (ip地址,mac地址,modemtype,...)

以下是HTML和PHP代码:( $ limit value:15或25或50,用户可以选择)

<table>
  <?php
    $sql = "SELECT ... needed fields from some tables... LIMIT $start, $limit";

    $result = mysqli_query( $conn, $sql ) or trigger_error( mysqli_error( $conn ) );

    while ( $row = mysqli_fetch_object( $result ) ) {
      echo "<tr class='modem_row' id='$row->modem_id' style='color:gray'>\n";
      echo "<td>$row->mac_address</td>\n";
      echo "<td>$row->ip_address</td>\n";
      echo "<td>$row->type</td>\n";
      // ...
      echo "</tr>\n";
    }

    mysqli_free_result( $result );
  ?>
</table>

<div id="progress" style="display:none; width:150px; height:20px"></div>

当数据库查询完成后,jQuery脚本会查询所有显示调制解调器是否“在线”(通过SNMP)。这是jQuery脚本:

<script type="text/javascript">
  $(function() {
    $(".modem_row").each(function(){
      var modem_id = $(this).attr("id");
      $.ajax({
        url: "/modules/get_modem_state.php?modem_id="+modem_id,
        success: function(data) {
          if (data == 'online') {
            $('#'+modem_id).animate({color: 'black'});
          }
        }
      });
    });
  });
</script>

好的,它有效。但我想在一个简单的HTML div中看到整个ajax的进展。当jQuery脚本开始时,那么'progress'div出现就好了,然后在一个简单的彩色条中显示百分比,当完成所有ajax查询时,'progress'栏就会消失。

(例如,如果$ limit = 15,则有15个ajax查询。如果第一个查询完成,则'progress'div宽度将为10px,在第二个ajax查询完成后,'progress'div width将20px等。)

我认为我应该使用jQuery Progressbar,但我不知道如何粘合在一起。

3 个答案:

答案 0 :(得分:1)

您可以使用任何加载图片。在此处创建您自己的加载图片:http://www.ajaxload.info/

然后修改你的代码:

<div class="loader" style="display:none;">
    <img src="loader.gif" alt="" />
</div>

<script type="text/javascript">
  $(function() {
    $(".modem_row").each(function(){
      var modem_id = $(this).attr("id");
      $(".loader").show();
      $.ajax({
        url: "/modules/get_modem_state.php?modem_id="+modem_id,
        success: function(data) {
          if (data == 'online') {
            $(".loader").hide();
            $('#'+modem_id).animate({color: 'black'});
          }
        },
        error: function(){
            $(".loader").hide();
        }
      });
    });
  });
</script>

您需要在<img />标记中添加图片。

如果您想使用jQuery UI Progress Bar,那么您必须设置&#34;请求持续时间&#34;手动。请求可能在您设置的持续时间之前或您设置的持续时间之后完成。在这两种情况下,它都是糟糕的用户体验。

这是设置jQuery UI进度条的链接:http://jqueryui.com/progressbar/#label

您无法获得请求的确切持续时间(请求DB +请求服务器+处理+内存+ CPU ...很多因素),除非您正在加载一个Flash文件。 Flash有一种技术可以计算加载到舞台上的所有组件的大小,它可以为您提供精确的实时进度条。除非您正在构建Flash应用程序,否则使用它是没有意义的。

编辑2:

这是使用jQuery UI Progress Bar的解决方案:

    <div class="loader" style="display:none;">
    <div id="progressbar"><div class="progress-label">Loading...</div></div>
</div>

<script type="text/javascript">
$(function() {
    var progress_duration = 2000;
    var total_number_of_items = 15;

    $("#progressbar").progressbar({
        value: false,
        change: function() {
            var percent = $("#progressbar").progressbar("value") + "%";
            $(".progress-label").text(percent);
        },
        complete: function() {
            $(".progress-label").text("Complete");
        }
    });

    function calculateProgress(){
        var val = $("#progressbar").progressbar("value") || 0;
        var step = Math.round(100 / total_number_of_items);
        var new_val = val + step;
        if(new_val > 100) new_val = 100;
        $("#progressbar").progressbar("value", new_val);
        if(val < 99){
            setTimeout(calculateProgress, 80);
        }
    }

    function animateProgressBar(){
        setTimeout(calculateProgress, progress_duration);
    }

    $(".modem_row").each(function(){
        var modem_id = $(this).attr("id");
        $(".loader").show();
        $.ajax({
            url: "/modules/get_modem_state.php?modem_id="+modem_id,
            success: function(data) {
                if(data == 'online'){
                    animateProgressBar();
                    $('#'+modem_id).animate({color: 'black'});
                }
            },
            error: function(){

            }
        });
    });
});
</script>

这里有一些CSS代码:

.ui-progressbar {
    position: relative;
}
.progress-label {
    position: absolute;
    left: 50%;
    top: 4px;
    font-weight: bold;
    text-shadow: 1px 1px 0 #fff;
}

答案 1 :(得分:1)

一个简单的例子:

    .progress-bar{height:20px; width:400px;}
    .status{height:20px; background:green; width:0px; text-align:center;}
    #btn{paddding:10px; width:100px; background:red;cursor:hand;cursor:pointer;}

    <div>
        <div  id="btn" onclick="Call()">click here</div>
    </div>

    <div class="progress-bar">
       <div class="status"></div>
    </div>

    <table>
        <tbody>
        <tr id="row1" class="modem_row"><td> - </td></tr>
        <tr id="row2" class="modem_row"><td> - </td></tr>
        <tr id="row3" class="modem_row"><td> - </td></tr>
        <tr id="row4" class="modem_row"><td> - </td></tr>      
        <tr id="row5" class="modem_row"><td> - </td></tr>  
        </tbody>
    </table>

Javascript功能:

    function Call(){

    var nRows = $(".modem_row").length;
    if(nRows > 0){
    var width = $(".progress-bar").width();
    var unit = width/nRows;
    var unitPercent = 100/nRows;

    var $statusDiv = $(".progress-bar").children('.status').eq(0);
    var oldWidth = 0;
    var newWidth = 0;
    var percent = 0;

    var msTimer =0;
    var count = 1;   

    $(".modem_row").each(function(){
        msTimer += 800;//miliseconds
        setTimeout(function(){ //this code should be in ajax's success function:
                oldWidth = $statusDiv.width(); 
                newWidth = oldWidth + unit;
                percent = unitPercent*count;
                //here you can use animate() with jqueryUI.
                $statusDiv.width(newWidth).text(percent + " %");                    
                count++;
        }, msTimer);

    });//each

}//if

}

jsfiddle中测试。

定义进度条的宽度,脚本将检测它并计算必须增加的数量。

答案 2 :(得分:0)

感谢AiApaec,最后一个简单的工作栏: (修改后的js / html代码..)

<style>
  .progress-bar { height:10px; width:200px }
  .status { height:10px; background:silver; width:0px }
</style>

<div class="progress-bar">
  <div class="status"></div>
</div>

<script type="text/javascript">
  $(function() {
    var nRows = $(".modem_row").length;
    if ( nRows > 0) {
      var width = $(".progress-bar").width();
      var unit = width/nRows;
      var $statusDiv = $(".progress-bar").children('.status').eq(0);
      var oldWidth = 0;
      var newWidth = 0;
      var i = 0;

      $(".modem_row").each(function(){
        var modem_id = $(this).attr("id");
        $.ajax({
          url: "/modules/get_modem_state.php?modem_id="+modem_id,
          success: function(data) {
            oldWidth = $statusDiv.width(); 
            newWidth = oldWidth + unit;
            $statusDiv.width(newWidth);                    
            if ( ++i == nRows ) {
              $('.status').fadeOut();
            }
            if (data == 'online') {
              $('#'+modem_id).animate({color: 'black'});
            }
          }
        });
      });
    }
  });
</script>

我希望它会帮助别人。