我自己也遇到了类似的问题,我的事件处理函数progress
只XMLHttpRequest
执行了一次——上传完成时。
问题的原因很简单——在谷歌浏览器中(可能还有其他浏览器,我没有测试),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
事件,因为上传会立即完成。