Jquery ajax() async false

У меня проблема.

for(a=1;a<10;a++){
    $(".div").append("<div id="+a+"></div>")
        $.ajax({
              url: "file.php",
              data: "a="+a,
              type: "POST",
              async: false,
              success: function(data) {
                $("#"+a).html(data);
              }
        });

}
 $("div").click(function(){
        alert("it works");
 });

проблема: я не помещал туда async: false данные из file.php были только в последнем div, поэтому с id 9 но теперь есть async: false - поэтому данные находятся в каждом div, так что это хорошо

но если я хочу щелкнуть, когда он загружается ajax, он не работает (только после завершения всех ajax-es)

как решить эту проблему? (возможно, ложь заключается в том, что я использую ajax. Я могу использовать getJSON ect..)

спасибо за помощь

Ответы

Ответ 1

Если вы хотите, чтобы пользователь мог использовать интерфейс во время выполнения вызова ajax, вы должны изменить async на true. Джеймс Аллардис отметил также, что в этом случае вам нужно использовать закрытие javascript, чтобы сохранить значение исходного id, когда возвращается вызов ajax. Для получения дополнительной информации о закрытии javascript проверьте how-do-javascript-closures-work, действительно хороший вопрос, найденный здесь в stackoverflow.

for(id = 1; id < 10; id++){
    $(".div").append("<div id='" + id + "'></div>");

    (function(id) {
        $.ajax({
            url: "file.php",
            data: "a=" + id,
            type: "POST",
            async: true,
            success: function(data) {
                $("#"+ id).html(data);
            }
        });
     }(id));
}

Ответ 2

Хорошим решением для этого является использование рекурсивной функции.

function appendDivs(limit, count) {
    count = count || 1;
    if (count <= limit) {
        $(".div").append("<div id=" + count + "></div>");
        $.ajax({
            url: "file.php",
            data: "a=" + count,
            type: "POST",
            async: true,
            success: function(data) {
                $("#" + count).html(data);
                appendDivs(limit, count + 1);
            },
            error: function(e) {
                alert('Error - ' + e.statusText);
                appendDivs(limit, count + 1);
            }
        });
    } else {
        return false;
    }
}
appendDivs(10);