Javascript Jquery在.each()循环中的ajax完成后运行代码
我想在多个ajax调用完成后运行代码。Javascript Jquery在.each()循环中的ajax完成后运行代码,javascript,jquery,ajax,each,Javascript,Jquery,Ajax,Each,我想在多个ajax调用完成后运行代码。.each()循环在所有复选框上调用.update(),它们的更改事件运行ajax代码 我有一组复选框,每个复选框在选中时发送一个ajax请求。顶部的复选框将更新所有子复选框以匹配顶部复选框 我调用了.change()函数以避免重复代码,因为它们的更改事件已经发送了ajax请求。on change代码隐藏子复选框,success函数使复选框再次可见 我想隐藏parent复选框,并仅在所有子项都使用多个ajax请求完成更新后才显示它 <head>
.each()
循环在所有复选框上调用.update()
,它们的更改事件运行ajax代码
我有一组复选框,每个复选框在选中时发送一个ajax请求。顶部的复选框将更新所有子复选框以匹配顶部复选框
我调用了.change()
函数以避免重复代码,因为它们的更改事件已经发送了ajax请求。on change代码隐藏子复选框,success函数使复选框再次可见
我想隐藏parent复选框,并仅在所有子项都使用多个ajax请求完成更新后才显示它
<head>
<script type="text/javascript" src="//code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>
<script>
$(document).ready(function () {
// Calls change event for all child checkboxes
// I want it to hide this checkbox until all child ajax calls are complete
$('#wrapper').on('change', '.parent-active', function () {
var checkbox = $(this);
checkbox.css('display', 'none').after('<img src="loading.gif"/>');
var data = $('#category-content');
var boxes = data.find('input[type=checkbox]');
boxes.each(function( index, box ){
if($(box).is(':checked') != $(checkbox).is(':checked')){
$(box).prop('checked', $(checkbox).is(':checked')).change();
}
});
checkbox.css('display', 'inline').next().remove();
});
// Hides checkbox, displays loading image, sends ajax, restores checkbox
$('#wrapper').on('change', '.child-active', function () {
var checkbox = $(this);
checkbox.css('display', 'none').after('<img src="loading.gif"/>');
$.ajax({
url: '/',
type: 'post',
complete: function (data) {
checkbox.css('display', 'inline').next().remove();
}
});
});
});
</script>
<div id="wrapper">
<table><tbody>
<tr><td>Parent</td><td><input type="checkbox" class="parent-active" id="parent-active-1"/></td></tr>
</tbody></table>
<div id ="category-content"><table><tbody>
<tr><td>Child 1</td><td><input type="checkbox" class="child-active" id="child-active-1"/></td></tr>
<tr><td>Child 2</td><td><input type="checkbox" class="child-active" id="child-active-2"/></td></tr>
<tr><td>Child 3</td><td><input type="checkbox" class="child-active" id="child-active-3"/></td></tr>
</tbody></table></div>
</div>
$(文档).ready(函数(){
//调用所有子复选框的更改事件
//我希望它隐藏此复选框,直到所有子ajax调用完成
$('#包装器').on('change','.parent active',函数(){
var复选框=$(此);
复选框.css('display','none')。在('')之后;
var数据=$(“#类别内容”);
var-box=data.find('input[type=checkbox]');
框。每个(函数(索引,框){
如果($(框).is(':checked')!=$(复选框).is(':checked')){
$(box).prop('checked',$(checkbox).is(':checked')).change();
}
});
css('display','inline').next().remove();
});
//隐藏复选框,显示加载图像,发送ajax,还原复选框
$(“#包装器”).on('change','child-active',函数(){
var复选框=$(此);
复选框.css('display','none')。在('')之后;
$.ajax({
url:“/”,
键入:“post”,
完成:功能(数据){
css('display','inline').next().remove();
}
});
});
});
父母亲
儿童1
儿童2
儿童3
问题是父复选框甚至没有显示正在加载的图像。.change()
调用会立即返回,并且父复选框会在您看到它被停用之前被还原。我希望在孩子们全部完成之前,家长复选框不可用
我试过使用.promise()
和.when()
但还没有找到解决方案
如何响应多个ajax请求
如果您想查看页面的精简版本,请选中jQuery Deferred,等待大量AJAX调用完成非常简单,例如:
var deferreds = [];
$sel.each(function() {
deferreds.push(
$.ajax(); // make AJAX call for element $(this)
);
});
$.when.apply($, deferreds).done(function() {
// all AJAX calls have complete
do_something();
});
例如,如果要预取所有图像
var deferreds = [];
$('img').each(function() {
deferreds.push(
$.ajax($(this).attr('src'));
);
});
$.when.apply($, deferreds).done(function() {
// all images are now prefetched
});
你能输入所有相关的代码吗?是的-我们错过了整个ajax代码谢谢!这看起来是一个很好的开始,但我仍然无法将其用于排队
.change()
调用。在我的简化代码中,一个简单的.ajax()可以工作,但实际上我正在发布有关复选框状态的数据,并更新数据库。我更愿意将ajax调用保留在“子活动”更改事件处理程序中。如何才能使.change()函数在ajax调用完成时才被视为“完成”?或者我应该为此单独提出一个问题?谢谢