【问题标题】:How to make real progress bar of jQuery Ajax load request?如何制作 jQuery Ajax 加载请求的真实进度条?
【发布时间】:2015-06-23 15:17:11
【问题描述】:

我需要的是一个动画进度条(就像 youtube 上的那个),但请不要使用插件!

我的 ajax 请求如下所示:

$.ajax({
    xhr: function() {
        var xhr = new window.XMLHttpRequest();
        //Download progress
        xhr.addEventListener("progress", function(evt) {
            if (evt.lengthComputable) {
                console.log(evt);
                var percentComplete = evt.loaded / evt.total * 100;
                //Do something with download progress
                // this is a static animation but i'm not able to make it work with the precentComplete that i have.
                $({
                    property: 0
                }).animate({
                    property: 105
                }, {
                    duration: 4000,
                    step: function() {
                        var _percent = Math.round(this.property);
                        $('#progress').css('width', _percent + "%");
                        if (_percent == 105) {
                            $("#progress").addClass("done");
                        }
                    },
                    complete: function() {
                        alert('complete');
                    }
                });
            }
        }, false);
        return xhr;
    },
    type: method,
    url: rest_api,
    headers: headers,
    timeout: 10000,
    dataType: 'json',
    data: http_content,
    beforeSend: function(xhr) {
        // do stuff
    },
    success: function(data, status, xhr) {
        // do stuff
    },
    error: function(xhr, e) {
        // do stuff
    }
});

所以,我已经制作了一个动画,但我无法将其链接为真实动画,这是一个静态动画,但我无法使其与我在进度事件中拥有的 precentComplete 一起工作。

有什么想法吗?我需要通过工作 sn-p 或示例对这个 XHR2 进行更多说明,以便更好地理解。

动画长这样:jsFiddle

【问题讨论】:

  • 我不确定您想要的进度,但 xhr 请求的进度是发送数据(上传)的进度。所以这真的只适用于大输入。对于小的输入,它会立即跳到 100%。
  • 我想要的是下载数据不上传的进度,比如youtube 的东西,直到它通过 AJAX 获取数据。

标签: javascript jquery css ajax html


【解决方案1】:

我的第一个尝试是在“进度”事件处理程序之外定义进度条,然后只在事件处理程序内设置宽度属性。

$.ajax({
    xhr: function() {
        var xhr = new window.XMLHttpRequest();
        var progressBar = $("#progress");

        //Download progress
        xhr.addEventListener("progress", function(evt) {
            if (evt.lengthComputable) {
                console.log(evt);
                var percentComplete = /* compute it */;
                progressBar.style("width", percentComplete + "%");
            }
        }, false);
        return xhr;
    },
    ...
});

似乎不是每个浏览器都可以让您轻松跟踪下载进度,您可以在此处找到有关如何实际计算进度的更多信息:AJAX Page Download progress

【讨论】:

  • 它不是动画的,当我从代码中得到它时,它会改变一次宽度,当它是 100% 时,至少这是我在尝试上面的代码时得到的......并且带有 XHR 的 AJAX 可以获得进度跟踪:dave-bond.com/blog/2010/01/JQuery-ajax-progress-HMTL5,但我只是不知道如何以该百分比实现动画,因为我需要时间来制作动画......
  • 你的css样式提供动画,只要设置宽度,它就会动画。查看更新的小提琴:jsfiddle.net/bgb9mj36/1
  • 如果它似乎立即发生变化,请检查您的 progress 事件。也许你在完成后只得到一个事件?或者您可能希望增加 CSS 中的转换时间。
  • 我实际上不知道,这就是我在堆栈上询问的原因...我看到很多插件可以做到这一点,但我想要一个纯代码...
  • 更新小提琴:jsfiddle.net/bgb9mj36/4。您可以在控制台中显示它们,而不是在 div #events 中显示事件。无论如何,这个小提琴应该列出所有进度事件以及是否可以为它们计算进度。在小提琴中,情况并非如此,因为下载的文件太小了,XHR 是在瞬间完成的。我已经对代码进行了一些更新,以便您仍然可以看到一些动画。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 2015-11-13
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 2020-04-20
相关资源
最近更新 更多