完成所有ajax请求后如何附加表

I want to check domain availability with php and ajax request. Requests will be sent to "whois.apitruck.com" API like this: "whois.apitruck.com/domain.com". For each domain, a request is sent. I want to append table after complate all ajax request but this not work!

$(document).ready(function () {
    $("#submit").click(function () {
        var domain = $('#domains').val().split("
");
        var all_suffix = ["com","net","org","ir","biz","info","us","name","pro","eu","in","me","tv","cc"];
        var counter = 0;
        var TableDataString = '<table class="table table-bordered table-striped table-responsive domain-table"><thead><tr><th>ID</th><th>Domain Name</th><th>.Com</th><th>.Net</th><th>.Org</th><th>.Ir</th><th>.Biz</th><th>.Info</th><th>.Us</th><th>.Name</th><th>.Pro</th><th>.In</th><th>.Me</th><th>.Tv</th><th>.Cc</th></tr></thead><tbody>';
        var domain_count = domain.length;

        $.each(domain, function (i, val) {
            //increase i counter
            counter++;
            TableDataString += '<tr><td>'+ counter +'</td><td>'+ val +'</td>';

            $('input[type=checkbox]:checkbox:checked').each(function () {
                    var flag = '';
                    var suffix = $(this).val();
                        $.ajax({
                            type: "POST",
                            url: "includes/ajax/ajax.php",
                            dataType: "json",
                            data: {domain: val, suffix: suffix},
                            success: function (msg) {
                                flag = msg.suc;
                            },
                            error: function (err) {
                                $('#domain_tables').html(err.error);
                            }
                        });//end $.ajax

                    if(flag){TableDataString += '<td><i class="fa fa-times"></i></td>';}else{TableDataString += '<td><i class="fa fa-check"></i></td>';}    
            });//end get each suffix  
            TableDataString += '</tr>';
        });//end each domain

        TableDataString += '</tbody></table>';
        if(counter === domain_count){
            $(document).ajaxComplete(function(){
                $('#domain_tables').append(TableDataString);
            });
        }
    });
});

I am used a flag and check this after $.ajax. The display problem solved. But for each ajax request echo a new table, If that display one table for all ajax request. How to append table after complate all ajax request?! Another problem is that check flag does not work properly! why?!

  1. You're using .append() on your $('#domain_tables'), so that each time a new table is generated. You should empty the #domain_tables div before making another AJAX request(s) queue.
  2. You're not checking which check-boxes are checked and which are not, so that you only create <td> elements for chechbox:checked.
  3. Even if you add all necessary <td> elements, these generated in AJAX success callback will be added at the end of the table, because your loop runs faster than AJAX request (simply saying). You have to state which <td> element belong to which AJAX request.

I'd go this way:

$(document).ready(function () {
    $("#submit").click(function () {

        // check if anything is selected:
        if(!$('#domains').val() || !$('[type="checkbox"]:checked').length){
            return false;
        }
        // disable the button:
        var btn = $(this).prop('disabled', true);

        var domain = $('#domains').val().split("
");
        var counter = 0;
        // an indicator to state when the button should be enabled again:
        var ajaxQueue = 0;
        var Table = '<table class="table table-bordered table-striped table-responsive domain-table"><thead><tr><th>ID</th><th>Domain Name</th><th>.Com</th><th>.Net</th><th>.Org</th><th>.Ir</th><th>.Biz</th><th>.Info</th><th>.Us</th><th>.Name</th><th>.Pro</th><th>.Eu</th><th>.In</th><th>.Me</th><th>.Tv</th><th>.Cc</th></tr></thead><tbody>';

        // create the td elements, but do not perform AJAX requests there:
        $.each(domain, function (i, val) {
            counter++;
            Table += '<tr><td>'+ counter +'</td><td>'+ val +'</td>';
            $('input[type=checkbox]').each(function () {
                if($(this).is(':checked')){
                    ajaxQueue++;
                    // if checkbox is checked make td element with specified values and a "load-me" class:
                    Table += '<td class="load-me" data-domain="'+val+'" data-suffix="'+$(this).val()+'"><small>loading...</small></td>';
                }else{
                    Table += '<td><span class=text-muted><i class="fa fa-minus"></i></span></td>';
                }
            });
            Table += '</tr>';
        });

        // Replace HTML of the 'domain_tables' div and perform AJAX request for each td element with "load-me" class:
        $('#domain_tables').html(Table+'</tbody></table>').find('td.load-me').each(function(){
            var td = $(this);
            $.ajax({
                type: "POST",
                url: "includes/ajax/ajax.php",
                dataType: "json",
                data: {domain: td.attr('data-domain'), suffix: td.attr('data-suffix')},
                success: function (msg) {
                    // decrease ajaxQueue and if it's 0 enable button again:
                    ajaxQueue--
                    if(ajaxQueue === 0){
                        btn.prop('disabled', false);
                    }
                    if(msg.suc == false){
                        td.html('<span class=text-danger><i class="fa fa-times"></i></span>');
                    }else{
                        td.html('<span class=text-success><i class="fa fa-check"></i></span>');
                    }
                },
                error: function (err) {
                    $('#domain_tables').html(err.error);
                }
            });
        });
    });
}); 

My final answer is look like this:

$(document).ready(function () {
$("#submit").click(function () {
    var domain = $('#domains').val().split("
");
    var all_suffix = ["com","net","org","ir","biz","info","us","name","pro","eu","in","me","tv","cc"];
    var counter = 0;
    var TableDataString = '<table class="table table-bordered table-striped table-responsive domain-table"><thead><tr><th>ID</th><th>Domain Name</th><th>.Com</th><th>.Net</th><th>.Org</th><th>.Ir</th><th>.Biz</th><th>.Info</th><th>.Us</th><th>.Name</th><th>.Pro</th><th>.In</th><th>.Me</th><th>.Tv</th><th>.Cc</th></tr></thead><tbody>';
    var domain_count = domain.length;

    $.each(domain, function (i, val) {
        //increase i counter
        counter++;
        TableDataString += '<tr><td>'+ counter +'</td><td>'+ val +'</td>';

        $('input[type=checkbox]:checkbox:checked').each(function () {
                var flag = false;
                var suffix = $(this).val();
                    $.ajax({
                        type: "POST",
                        url: "includes/ajax/ajax.php",
                        dataType: "json",
                        data: {domain: val, suffix: suffix},
                        success: function (msg) {
                            flag = msg.suc;
                            if(flag){TableDataString += '<td><i class="fa fa-times"></i></td>';}else{TableDataString += '<td><i class="fa fa-check"></i></td>';}  
                            TableDataString += '</tr>';
                        },
                        error: function (err) {
                            $('#domain_tables').html(err.error);
                        }
                    });//end $.ajax


        });//end get each suffix  

    });//end each domain


    if(counter === domain_count){
        TableDataString += '</tbody></table>';
        $('#domain_tables').append(TableDataString);
    }
});

});

I think this will solve your last two mentioned problem.