JQuery запрос на отправку дважды - PullRequest
0 голосов
/ 13 марта 2012
$("#classesLink").click(function(event) {
    $("#globalUserContent").children().slideUp("normal", function() {
        $.ajax({
            type: "POST",
            url: "classes.php?token="+randString+"",
            success: function (msg) {
                $("#globalUserContent").html(msg);
            },
            error: function (msg) {
                $("#globalUserContent").html(msg);
            }
        });            
    });
    return false;
});

У меня есть вышеуказанный код, и когда я нажимаю кнопку .classesLink и проверяю запросы firebug, он показывает, что он отправляется дважды, что-то не так с ним?

Ответы [ 2 ]

5 голосов
/ 13 марта 2012

Этот ...

$("#globalUserContent").children()

... вероятно, соответствует 2 элементам, поэтому обработчик запускается дважды.


Вместо этого вы можете использовать setTimeout.

$("#globalUserContent").children().slideUp("normal");

setTimeout(function() {
        $.ajax({
            type: "POST",
            url: "classes.php?token="+randString+"",
            success: function (msg) {
                $("#globalUserContent").html(msg);
            },
            error: function (msg) {
                $("#globalUserContent").html(msg);
            }
        });
}, 600);
2 голосов
/ 13 марта 2012

Как заметил @amе не я.$("#globalUserContent") имеет двух дочерних элементов, поэтому обратный вызов запускается дважды по одному для каждого дочернего элемента. Используйте это:

$("#classesLink").click(function(event) {
    $.when($("#globalUserContent").children().slideUp("normal"))
     .then(function() {
        $.ajax({
            type: "POST",
            url: "classes.php?token="+randString+"",
            success: function (msg) {
                $("#globalUserContent").html(msg);
            },
            error: function (msg) {
                $("#globalUserContent").html(msg);
            }
        });            
    });
    return false;
});

Это выполнит запрос callback-ajax, когда эффект slideUp закончится, и неЖесткий код задержки setTimeout в коде.

Если вы жестко закодировали 600 в коде, код может прерваться, если продолжительность "normal" изменится однажды, или кто-то изменил эффект длительности slideUpно не изменила задержку тайм-аута.

Но вы можете поместить задержку продолжительности в переменную, чтобы вы изменили ее в одном месте - @am not, я предлагаю.

when docs :

Описание: Предоставляет способ выполнения функций обратного вызова на основе одного или нескольких объектов, обычно отложенных объектов, представляющих асинхронные события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...