0
$("#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ボタンをクリックしてファイアバグのリクエストを確認すると、2回送信されていることが示されていますが、何か問題がありますか?

4

2 に答える 2

5

これ...

$("#globalUserContent").children()

...おそらく2つの要素に一致しているため、ハンドラーは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);
于 2012-03-12T21:05:26.403 に答える
2

@amが指摘したように、私はそうではありません。$("#globalUserContent")子が2つあるため、コールバックは子ごとに1つずつ2回起動します。これを使用します。

$("#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 requstが実行され、コードの遅延がslideUpハードコーディングされません。setTimeout

コードをハードコーディングすると、期間がいつか変更されるか、誰かが期間の影響を変更したがタイムアウト遅延を変更しなかった600場合に、コードが破損する可能性があります。"normal"slideUp

ただし、duration-delayを変数に入れて、1か所で変更することもできます。@amは提案ではありません。

when ドキュメント

説明:1つ以上のオブジェクト(通常は非同期イベントを表す遅延オブジェクト)に基づいてコールバック関数を実行する方法を提供します。

于 2012-03-12T21:09:28.773 に答える