0

私はもともとreturn true/falseajax コールバックに を持っていましたが、おそらく呼び出すのに適切なコンテキストではないことに気付いたので、関数を次のように書き直しましたが、まだ機能していません。送信変数もコールバック関数から引き継がれていませんか? 確認 ( if .btn-danger) は機能していますが、送信を押して確認が不要な場合だけではありません)

$('#form').submit(function(e){
    var submit = false;
    if($('.btn-danger').length){
        submit = true;
    } else {
        $.ajax({
            url: base_path+"ajax/myajaxfile",
            type: "post",
            data: {
                data1 : $("#amount").val(),
                data2 : $("option:selected").val()
            },
            dataType: "json",
            success: function(data) {
                if (data.needconfirmation === 'true'){
                        $('#edit-submit').val("Confirm");
                        $('#edit-submit').removeClass("btn-primary");
                        $('#edit-submit').addClass("btn-danger");
                        $('#payment-form').after('<span class="warning"> Do you really wanna?</span>');
                } else {
                    submit = true;
                }
            },
            error: function(data) {
                alert("an error has occurred");
            }
        });
    }
    if (submit){
        return true;
    } else {
        return false;
    }
});
4

3 に答える 3

1

あなたの問題は、ajax呼び出しがデフォルトで非同期であるということだと思います。したがって、success関数が呼び出される前に関数の戻り値が評価されているため、submit変数はまだfalseです。

ajax呼び出しを同期させる必要があります。

async: false

またはおそらくそれを再構築することをお勧めします。

于 2012-06-18T22:34:15.157 に答える
0

$.ajax非同期であるため、コードの残りの部分は成功コールバックが発生する前に続行されるため、設定submit = trueは関数の最後のチェックに影響しません。

確認(.btn-dangerの場合)は機能していますが、送信を押して確認が不要な場合だけではありません

確認が必要かどうかはどうやってわかりますか? をチェックする場所にチェックを追加することもできます.btn-danger

また、次のようにするだけで、コードの最後のビットをクリーンアップできます

return submit;
于 2012-06-18T22:37:36.590 に答える
0

初めて AJAX を実行する際に最も混乱する側面の 1 つは、非同期部分です。通常の Javascript (まあ、少なくとも通常の jQuery) では、送信を次のように処理します。

$('#form').submit(function(e){
    var submit = /*Figure out if it was a success or not*/;
    if (submit){
        return true;
    } else {
        return false;
    }
});

イベントが送信をトリガーし、それが有効かどうかを判断し、続行するかしないかを決定します。

ただし、AJAX 送信では、「成功したかどうかを判断する」ステップは、通常の流れの外で発生します。つまり、やりたいことは常に false を返すことです。続行するかどうかまだわからないので、続行しないでください。あなたの AJAX コールバック (AJAX 呼び出しのオプションの "success:" 関数) は、"理解する" コードがうまくいくかどうかであり、あなたの現在のコードは "success = true" で正しい考えを持っています ... それが解決するまでには、元の送信関数はすでに終了しています (false が返されます)。

したがって、次に行う必要があるのは、成功ハンドラーを変更して実行することです...送信時に通常発生することは何でも。これは非表示フォームの form.submit() と同じくらい簡単かもしれませんし、もっと複雑かもしれません。私はあなたのアプリを知りません。うまくいけば、これで基本的な考え方が得られます。

于 2012-06-18T22:40:56.113 に答える