如何在加载时显示进度条,使用 ajax

IT技术 javascript php jquery ajax
2021-01-20 12:42:51

我有一个下拉框。当用户从下拉框中选择一个值时,它会执行查询以从数据库中检索数据,并使用 ajax 在前端显示结果。这需要一点时间,所以在这段时间里,我想显示一个进度条。我已经搜索过,并且发现了许多关于为上传创建进度条的教程,但我不喜欢任何教程。有人可以为我提供一些有用的指导吗?

我的ajax代码:

<script>
$(function() {
    $("#client").on("change", function() {
      var clientid=$("#client").val();

        $.ajax({
            type:"post",
            url:"clientnetworkpricelist/yourfile.php",
            data:"title="+clientid,
            success:function(data){
             $("#result").html(data);
            }
        });

    });
});
</script>
6个回答

链接描述了如何使用 jquery 向 xhr 对象添加进度事件侦听器。

$.ajax({
    xhr: function() {
        var xhr = new window.XMLHttpRequest();

        // Upload progress
        xhr.upload.addEventListener("progress", function(evt){
            if (evt.lengthComputable) {
                var percentComplete = evt.loaded / evt.total;
                //Do something with upload progress
                console.log(percentComplete);
            }
       }, false);
       
       // Download progress
       xhr.addEventListener("progress", function(evt){
           if (evt.lengthComputable) {
               var percentComplete = evt.loaded / evt.total;
               // Do something with download progress
               console.log(percentComplete);
           }
       }, false);
       
       return xhr;
    },
    type: 'POST',
    url: "/",
    data: {},
    success: function(data){
        // Do something success-ish
    }
});
这不再适用于 jQuery 1.9.3+。它在完成 1% 时进入事件侦听器一次,并且再也不会命中它。有任何想法吗?
2021-03-24 12:42:51
var percentComplete = evt.loaded / evt.total; 实际上是:var percentComplete = (evt.loaded / evt.total) * 100;
2021-03-27 12:42:51
乘以percentComplete100后,这对我有用。感谢您的解决方案。
2021-04-07 12:42:51
您可以使用 jquery 尝试使用超时的加载程序。在 ajaxstart 上设置计时器并在 ajaxStop 上停止
2021-04-11 12:42:51
它不工作。什么是upload这里xhr.upload.addEventListener?
2021-04-13 12:42:51
<script>
$(function() {
    $("#client").on("change", function() {
      var clientid=$("#client").val();
     //show the loading div here
    $.ajax({
            type:"post",
            url:"clientnetworkpricelist/yourfile.php",
        data:"title="+clientid,
        success:function(data){
             $("#result").html(data);
          //hide the loading div here
        }
    }); 
    });
});
</script>

或者你也可以这样做:

$(document).ajaxStart(function() {
        // show loader on start
        $("#loader").css("display","block");
    }).ajaxSuccess(function() {
        // hide loader on success
        $("#loader").css("display","none");
    });
@prime,将它分配给一个变量。
2021-03-15 12:42:51
@Suvash 他要求显示请求的实时完成进度的进度条,而不是您回答的加载程序。
2021-03-18 12:42:51
如果在同一页面上运行其他 ajax 请求怎么办?我们如何对特定的 ajax 请求执行此操作。
2021-04-01 12:42:51

基本上你需要加载图片 从这里免费下载一个http://www.ajaxload.info/

$(function() {
    $("#client").on("change", function() {
      var clientid=$("#client").val();
      $('#loadingmessage').show();

    $.ajax({
            type:"post",
            url:"clientnetworkpricelist/yourfile.php",
        data:"title="+clientid,
        success:function(data){
             $('#loadingmessage').hide();
             $("#result").html(data);
        }
    }); 
    });
});

在 html 正文上

<div id='loadingmessage' style='display:none'>
       <img src='img/ajax-loader.gif'/>
</div>

也许这可以帮助你

+1 Ajax 请求非常简单直接。为我工作。未使用下载图像选项,因为我正在使用通用应用程序的进度控制。
2021-03-22 12:42:51
简单的。没有麻烦,单行解决方案。
2021-03-31 12:42:51

这是一个在 Razor 中使用 MVC 和 Javascript 对我有用的示例。第一个函数通过 ajax 在我的控制器上调用一个动作并传递两个参数。

        function redirectToAction(var1, var2)
        {
            try{

                var url = '../actionnameinsamecontroller/' + routeId;

                $.ajax({
                    type: "GET",
                    url: url,
                    data: { param1: var1, param2: var2 },
                    dataType: 'html',
                    success: function(){
                    },
                    error: function(xhr, ajaxOptions, thrownError){
                        alert(error);
                    }
                });

            }
            catch(err)
            {
                alert(err.message);
            }
        }

使用 ajaxStart 启动您的进度条代码。

           $(document).ajaxStart(function(){
            try
            {
                // showing a modal
                $("#progressDialog").modal();

                var i = 0;
                var timeout = 750;

                (function progressbar()
                {
                    i++;
                    if(i < 1000)
                    {
                        // some code to make the progress bar move in a loop with a timeout to 
                        // control the speed of the bar
                        iterateProgressBar();
                        setTimeout(progressbar, timeout);
                    }
                }
                )();
            }
            catch(err)
            {
                alert(err.message);
            }
        });

当过程完成时关闭进度条

        $(document).ajaxStop(function(){
            // hide the progress bar
            $("#progressDialog").modal('hide');
        });

$(document).ready(function () { 
 $(document).ajaxStart(function () {
        $('#wait').show();
    });
    $(document).ajaxStop(function () {
        $('#wait').hide();
    });
    $(document).ajaxError(function () {
        $('#wait').hide();
    });   
});
<div id="wait" style="display: none; width: 100%; height: 100%; top: 100px; left: 0px; position: fixed; z-index: 10000; text-align: center;">
            <img src="../images/loading_blue2.gif" width="45" height="45" alt="Loading..." style="position: fixed; top: 50%; left: 50%;" />
</div>