【发布时间】:2018-04-19 18:55:48
【问题描述】:
我有一个 Html 输入文件,可以上传图片,并使用 ajax 沙子到 asp.net MVC 控制器,一切正常。
但我无法更新简单的进度条。
这是简单的Html,
<input type="file" multiple="multiple" id="file_upload" />
<br />
<input type="button" id="upload" name="upload" value="Upload" class="btn btn-primary btn-block" />
<br />
<div class="outter">
<div class="inner" id="progress"></div>
</div>
<br />
在我的 javascript 中,我将请求拆分为一次上传 10 张图片,如下所示,
<script>
var counter = 0;
$("#upload").click(function () {
var fileUpload = $("#file_upload").get(0);
var files = fileUpload.files;
var devide = devider(files.length);
for (var x = 0; x < devide; x++) {
var fileData = new FormData();
for (var i = 0; i < files.length / devide; i++) {
if (counter < files.length) {
fileData.append(files[counter].name, files[counter]);
counter++;
}
}
$.ajax({
type: "POST",
url: "/Upload/GetFiles",
data: fileData,
cache: false,
contentType: false,
processData: false,
async: false,
success: function (result) {
console.log(result);
},
error: function (xhr, status, error) { console.log('Error:' + error); },
timeout: 0
});
}
});
function devider(number) {
var count = 0;
for (var i = 0; i < number; i+=10) {
count++;
}
return count;
}
</script>
我只需要在每次上传文件时更新<div id="progress"> 的宽度,这可能意味着在第二个 for 循环中。
但我不能,因为它处于循环中,它没有更新 HTML?
附言我知道 setInterval 但我不知道如何在这种情况下实现它!?
【问题讨论】:
-
async: false,是它似乎没有更新 html 的原因。它可能正在更新 html,但由于您正在使用同步 ajax 请求锁定浏览器,因此在所有 ajax 完成之前它不会呈现更改。 -
-
重做逻辑,这样就不会有问题了。进度条不能用于同步代码。
-
@KevinB 即使
async: true,在循环完成之前它也不会更新 HTML :( 我在下面提到我认为 for 循环正在阻塞页面。 -
是的,for循环也必须去。
标签: javascript html ajax