Javascript Jquery在.each()循环中的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>

我想在多个ajax调用完成后运行代码。
.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调用完成时才被视为“完成”?或者我应该为此单独提出一个问题?谢谢