我在使用JavaScript上传表单并监控进度时遇到了问题。问题在于XMLHttpRequest进度事件的行为很奇怪。当真正的上传没有完成时,它会过快地达到100%,有时候甚至只是刚开始,这是通过Chrome开发工具和系统监视器进行监控的。
因此,尽管计算出的进度为100%,但我必须等待很长时间才能发送文件,同时页面似乎被卡住了。我已经阅读过杀毒软件可能是原因,但这并不是这种情况。我没有安装杀毒软件,并关闭了防火墙。我尝试使用chrome、firefox在Windows和Ubuntu以及诸如jQuery表单插件等库,但都出现了相同的行为。
有人能解释这种奇怪的行为吗?XMLHttpRequest进度事件中的loaded属性实际上计算了什么?
非常感谢您的帮助。我感觉自己像一天撞在了墙上。
以下是一个重现此问题的小代码片段:
因此,尽管计算出的进度为100%,但我必须等待很长时间才能发送文件,同时页面似乎被卡住了。我已经阅读过杀毒软件可能是原因,但这并不是这种情况。我没有安装杀毒软件,并关闭了防火墙。我尝试使用chrome、firefox在Windows和Ubuntu以及诸如jQuery表单插件等库,但都出现了相同的行为。
有人能解释这种奇怪的行为吗?XMLHttpRequest进度事件中的loaded属性实际上计算了什么?
非常感谢您的帮助。我感觉自己像一天撞在了墙上。
以下是一个重现此问题的小代码片段:
<?php
echo "Hello!";
if(isset($_FILES['file'])){
echo " File received";
return;
}
?>
<form method='post' action='' enctype='multipart/form-data'>
<input type='file' name='file' />
<input type='submit'>
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
$('form').submit(function(e){
e.preventDefault();
ajax = new XMLHttpRequest();
ajax.onreadystatechange = function ()
{
console.log("READY STATE CHANGED");
console.log(ajax);
};
ajax.upload.addEventListener("progress", function (event) {
var percent = (event.loaded / event.total) * 100;
console.log(percent);
});
ajax.open("POST", $(this).attr('action'), true);
ajax.send(new FormData(this));
return false;
});
});
</script>
echo " File received";
在event.total
等于event.loaded
的时候被调用吗?progress
事件会分派已传输的字节,但不会监视一旦发送到网络上的字节。 - guest271314progress
事件大约每50ms分派一次。progress
事件不是实时分派的,如果自上次调用这些子子步骤以来不到50ms,则终止这些子子步骤。如果上传侦听器标志已设置,则在XMLHttpRequestUpload
对象上触发一个名为progress
的进度事件,其中包含请求体传输的字节数和请求体总字节数。https://xhr.spec.whatwg.org/#xmlhttprequestupload。 - guest271314