我自己也遇到了类似的问题,我在 XMLHttpRequest 上的 progress 事件的事件处理函数只执行了一次 -- 上传完成后。
问题的原因很简单——在谷歌浏览器(可能还有其他浏览器,我没有测试)中,progress 事件只有在上传运行了一两秒时才会连续触发.换句话说,如果您的上传很快完成,那么您很可能只会获得一个 100% progress 事件。
这是一个代码示例,其 progress 事件仅在 100% 完成时触发一次 (https://jsfiddle.net/qahs40r6/):
$.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;
console.log("Upload ", Math.round(percentComplete*100) + "% complete.");
}
}, false);
return xhr;
},
type: 'POST',
url: "/echo/json/",
data: {json: JSON.stringify(new Array(20000))}
});
控制台输出:
Upload 100% complete.
但是如果你在数组的大小上添加一个额外的零(将有效负载大小增加 10 倍——https://jsfiddle.net/qahs40r6/1/):
$.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;
console.log("Upload ", Math.round(percentComplete*100) + "% complete.");
}
}, false);
return xhr;
},
type: 'POST',
url: "/echo/json/",
data: {json: JSON.stringify(new Array(200000))}
});
然后你得到progress事件的正常进展:
Upload 8% complete.
Upload 9% complete.
Upload 19% complete.
Upload 39% complete.
Upload 50% complete.
Upload 81% complete.
Upload 85% complete.
Upload 89% complete.
Upload 100% complete.
此行为取决于您的 Internet 连接速度,因此您的里程会有所不同。例如,如果您使用第一个示例并使用 Chrome 开发人员工具来减慢与模拟“Slow 3G”的连接速度,那么您将看到一系列progress 事件。
同样,如果您在本地开发并将数据上传到本地 Web 服务器,您可能永远不会看到 progress 事件,因为上传会立即完成。