[英]Ajax complete is fired before success is ready, how can one prevent this behaviour?
我有一个AJAX请求,该请求获取插入到DOM中的HTML块。 发生这种情况时,我正在显示微调器加载gif。
我希望微调器在从ajax请求接收的数据插入DOM的确切时间隐藏。
问题在于,在HTML实际插入DOM 之前 ,javascript开始执行完整的部分。 因此,对于最终用户,微调框消失了,过了一会儿,DOM弹出了。
$('#mySpinner').show();
$.ajax({
success: function(data) {
$('#myElement').html(data);
},
complete:(){
$('#mySpinner').hide(); // This is called when the success part is still executing
}
});
编辑:我并不是说完成是成功之前被解雇的。 我的意思是说,在成功准备就绪之前,必须先完成工作。 因此,发生的顺序是:
$('#myElement').html(data);
叫做 $('#mySpinner').hide()
被称为 $('#mySpinner').hide()
完成 $('#myElement').html(data);
完成了 然后执行以下操作:
$('#mySpinner').show();
$.ajax({
success: function(data) {
$('#myElement').html(data);
$('#mySpinner').hide();
}
});
但是您描述的行为并不与jQuery Doc内联,因为complete
的行为仅应在success
和error
之后发生……您可以在jsFiddle中重现此错误行为吗? 可能是问题出在其他地方...
html()
同步运行,但是当执行下一条语句时,浏览器仍然可以呈现。 您可以尝试添加一个简单的setTimeout,以使浏览器有时间显示添加的内容:
$('#mySpinner').show();
$.ajax({
success: function(data) {
$('#myElement').html(data);
setTimeout(function() {
$('#mySpinner').hide();
}, 0);
},
error: function() {
$('#mySpinner').hide();
}
});
另一个选择是将特定元素添加到添加的html中,并且仅在该元素存在时才继续:
function waitForDom(el, cb) {
if ($(el).length) {
$(el).remove();
cb();
return;
}
setTimeout(function() {
waitForDom(el, cb);
}, 10);
}
$('#mySpinner').show();
$.ajax({
success: function(data) {
$('#myElement').html(data + '<div id="waitForDom"></div>');
waitForDom("waitForDom", function() {
$('#mySpinner').hide();
});
},
error: function() {
$('#mySpinner').hide();
}
});
您可以简单地将微调器隐藏在ajax代码的成功部分中:
$('#mySpinner').show();
$.ajax({
success: function(data) {
$('#myElement').html(data);
$('#mySpinner').hide();
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.