【问题标题】:Showing download progress percentage for JSON data显示 JSON 数据的下载进度百分比
【发布时间】:2015-11-20 13:36:00
【问题描述】:
$.ajax({
    url: 'https://www.udacity.com/public-api/v0/courses',
    xhr: function () {
        console.log('xhr');
        var xhr = new XMLHttpRequest();
        xhr.addEventListener('loadend', uploadComplete, false);

        function uploadComplete(event) {
            console.log('uploadComplete');
        }
        xhr.addEventListener("progress", function (evt) {
            console.log(evt.percentComplete);
            console.log([evt.lengthComputable, evt.loaded, evt.total]);
            // if (evt.lengthComputable) {
            var percentComplete = (evt.loaded / evt.total) * 100;
            console.log(percentComplete + "p")
            //}
        }, false);
        return xhr;
    },
    success: function (response) {
        console.log("success")
    }
});

对于上面的代码,我在控制台中得到的输出如下:

script.js:15 [false, 22463, 0]
script.js:18 Infinityp
script.js:14 undefined
script.js:15 [false, 53062, 0]
script.js:18 Infinityp
script.js:14 undefined
script.js:15 [false, 85830, 0]
script.js:18 Infinityp
script.js:14 undefined
script.js:15 [false, 124733, 0]
script.js:18 Infinityp
script.js:14 undefined
......

为什么 evt.lengthComputable 显示为 false 而 evt.total 显示为 0 ? P.S:URL 有内容长度标头。

还有其他方法可以跟踪 JSON 数据的实时下载进度吗?

【问题讨论】:

  • URL 有 content-length 标头”——它不应该在“url”中。你是如何指定内容长度的?
  • 该 URL 具有内容长度标头。我认为 evt.total 会自动从 content-length 标头中选择。如何指定?

标签: javascript jquery ajax json


【解决方案1】:

根据this SO answer,您应该将eventlisteners 添加到xhr 对象的upload 属性中。所以你的代码应该是这样的:

$.ajax({
    url: 'https://www.udacity.com/public-api/v0/courses',
    xhr: function () {
        console.log('xhr');
        var xhr = new XMLHttpRequest();
        xhr.upload.addEventListener('loadend', uploadComplete, false); // <-- CHANGED LINE

        function uploadComplete(event) {
            console.log('uploadComplete');
        }
        xhr.upload.addEventListener("progress", function (evt) { // <-- CHANGED LINE
            console.log(evt.percentComplete);
            console.log([evt.lengthComputable, evt.loaded, evt.total]);
            var percentComplete = (evt.loaded / evt.total) * 100;
            console.log(percentComplete + "p")
        }, false);
        return xhr;
    },
    success: function (response) {
        console.log("success")
    }
});

【讨论】:

  • 你试过这个代码吗?我试过了,percentComplete 没有显示在控制台上。我刚刚收到 xhr 和成功消息。
  • xhr.upload.addEventListener("progress", function (evt) 这行应该改成 xhr.addEventListener("progress",function(evt)
猜你喜欢
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多