0

これが私のスニペットjqueryコードです。実際には、送信フォームでフィールドが空かどうかを確認し、ユーザー名が存在する場合は確認ダイアログを表示します。

<script type="text/javascript">
jQuery(function(){ 

    $("#form").submit(function(){
        var isFormValid = true;
        if ($.trim($("#telephone").val()).length == 0){
            isFormValid = false;
        alert("Empty telephone!");
        }
    elseif(check_field() == 1){
            if(confirm('Delete?')){
        isFormValid = true;
    }else{
        isFormValid = false;
    }
        return isFormValid;
}); 

function check_field(){  
    var field = $('#field').val();  
    $.post("check_field.php", { field: field }, function(result){ 
        //if the result is 1  
        if(result == 1){  
            return 1;  
        }else{   
            return 0;  

        }  
    });
} 

 }); 
 </script>
4

3 に答える 3

1

古典的な間違いですが、ajax関数でコールバックを行う必要があります。これは、関数が実行されたときに、ajaxの投稿がまだ行われていないためです。

function check_field(callback){  
    var field = $('#field').val();  
    $.post("check_field.php", { field: field }, function(result){ 
        //if the result is true
        callback(result == 1);
    });
} 

そして、次のようなものです。

$("#form").submit(function(e){
    e.preventDefault() // prevent the form from submitting... yet
    var $form = $(this);
    check_field(function(result) {
        if(result && confirm('Delete?')) { 
            $form.submit(); // now submit it
         }
    });
});

非同期プログラミングの世界へようこそ!

于 2012-11-07T20:49:40.030 に答える
1

$.post呼び出しは非同期であるため、内部の return ステートメントは実際にはcheck_field関数内からまったく戻りません。サーバーが応答すると、内部関数が呼び出されます。

基本的に、元のcheck_field関数は POST 要求を発行し、サーバーの応答を待たずに処理を続行し、制御フローを元のサブミット ハンドラーに戻します。

代わりに行う必要があるのは、POST からの非同期応答を待ってから、返された検証が成功した場合に送信をトリガーすることです。

非常に単純な実装は次のようになります。

jQuery(function(){ 

    $("#form").on('submit', function(ev){
        ev.preventDefault();

        var $form = $(this),
            field = $('#field').val();

        $.post("check_field.php", { field: field }, function(result){
            if (result==1 && confirm('Delete?'))
                $form.off().submit();
        });
    });
});

: コードを更新しました。submitイベントでトリガーされるようになったため、送信ボタンのクリックとenterキーの使用の両方で機能します。

于 2012-11-07T20:52:02.720 に答える
0

データ型に注意する必要があります。1は「1」または「1」と等しくありません。それは...ですか?!"typeof"値のデータ型を見つけるために使用します。また、値を返すだけでは、プロセスを続行できません。これは非同期呼び出しです。あなたはそれについて読むべきです。

乾杯

于 2012-11-07T20:49:07.043 に答える