2016-05-14 9 views
0

私は少し問題があります。フォームが提出されたら、私はそれについていくつかのことを確認するつもりはなく、何か間違っていたら、それが送信されないようにして、クライアント側でエラーを表示したい。フォームが提出し続ける以外はすべて正常に動作しているようです。それは送信する前に分割された秒間、クライアント側でエラーを表示します。.preventDefault()が条件文で機能していません

$('#register').on('submit', function (e) { 
e.preventDefault(); 

var username = $("#register-username"), 
    name = $("#register-name"), 
    email = $("#register-email"), 
    password = $("#register-password"), 
    confirmPassword = $("#register-confirmPassword"); 

checkUsername(function (res) { 
    if (res) { 
     checkEmail(function (res) { 
      if (res) { 
       this.submit(); 
      } else { 
       clearErrors(); 
       email.toggleClass('input-error'); 
      } 
     }); 
    } else { 
     clearErrors(); 
     username.toggleClass('input-error'); 
    } 
}); 
}); 



function checkEmail(callback) { 
    $.get("/checkEmail/" + $('#register-email').val(), function (data) { 
     if (data == undefined) { 
     callback(true); 
     } else { 
     callback(false); 
     } 
    }); 
} 

function checkUsername (callback) { 
    $.get("/checkUsername/" + $('#register-username').val(), function (data) { 
    if (data == undefined) { 
     callback(true); 
    } else { 
     callback(false); 
    } 
    }); 
} 

function clearErrors() { 
    var arr = [ 
    $("#register-username"), 
    $("#register-name"), 
    $("#register-email"), 
    $("#register-password"), 
    $("#register-confirmPassword") 
    ]; 

    arr.forEach(function(el) { 
    el.removeClass('input-error'); 
    }); 
} 

更新: は今、私はちょうど自分自身を混乱させています。 checkUsername()は私のサーバからundefinedを返します。私は事実を知っていますが、何とかcheckUsername()が呼び出された 'else'ステートメントに到達しています。残りのコードを追加しました。いくつかの混乱をクリアする必要があります。

+0

あなたのコードを質問に入れてください。私たちはあなたの問題が何であるかを見直すために現地を離れてはいけません。現在および将来の読者の皆様には、質問は自己完結型でなければなりません。 – charlietfl

答えて

5

preventDefaultの呼び出しは、匿名コールバック関数checkUsernameに渡されます。匿名関数が非同期に呼び出された場合、イベントをキャンセルするには遅すぎます。

+0

提出の防止にどのように対処すべきかについてご意見はありますか?私が最終的にそれを提出する必要があるので、私はそれが発生したときにそれを提出することを妨げることはできません。 – Popatop15

+0

@ Popatop15外部関数の本体( 'on'に渡したもの)の中で' e.preventDefault() 'を呼び出す必要があります。それは 'checkEmail'に完全に渡って渡された場合にのみ実際に送信するべきです。 –

+0

コールバック関数が非同期に呼び出されていることを確認できますか?それは答えを変えます。 –

0

現在のサブミットイベントを停止するために検証からfalseを戻し、コールバックが正常に返ってから成功した場合にポストリクエストを手動で送信する必要があります。

検証がサーバーから返された後にコールバックが実行されているので、実際に要求が行われたかどうかに影響を与えることができます。他のソリューションは、すでにこの時点でサーバーに要求を送信して以来、もはや有効ではない元の送信イベントがどのように発生するかを変更しようとします。

$('#register').on('submit', function (e) { 

    var username = $("#register-username"), 
     name = $("#register-name"), 
     email = $("#register-email"), 
     password = $("#register-password"), 
     confirmPassword = $("#register-confirmPassword"); 

    checkUsername(function (res) { 
     if (res) { 
      checkEmail(function (res) { 
       if (res) { 
        $.post('{insert form action here}', $(this).serialize()); 
       } else { 
        clearErrors(); 
        email.toggleClass('input-error'); 
       } 
      }); 
     } else { 
      clearErrors(); 
      username.toggleClass('input-error'); 
     } 
    }); 

    return false; 
}); 

あなたは{insert form action here}を置き換えるために、そして$(this).actionはそれの場所で働くかもしれないでしょうが、私はよく分かりません。だから、

$('#register').on('submit', function (e) { 
    e.preventDefault();// prevent jQuery submit 

    // after all validation passes 
    this.submit();// submit native method won't trigger jQuery handler again 

}) 
+0

関数が実行される前に検証された戻り値 – Popatop15

+0

検証を返す前に非同期呼び出しが終了するのを待つ手段を追加する必要があるためです。それは、検証関数が要求を出す前に、検証された関数が戻るようにします。 私たちが代わりに行うことができるのは、手動送信を使用せず、単にコールバックでリクエストを送信することです。私はこの解決法を編集してそうする。 –

1

は、非同期コードに示されていないため、効果的な方法は、すべての検証が

何かのように通過するときに提出するハンドラを提出jQueryのためpreventDefaultを使用し、ネイティブ使用することです私はcharlietflのソリューションから構築し、変数にネイティブフォームを割り当て、それをanon関数の中で送信しました。

$('#register').on('submit', function (e) { 
    e.preventDefault() 
    var username = $("#register-username"), 
    name = $("#register-name"), 
    email = $("#register-email"), 
    password = $("#register-password"), 
    confirmPassword = $("#register-confirmPassword"), 
    form = document.getElementById('register'); 



    $.get("/checkUsername/" + username.val(), function (data) { 
    if (data) { 
     clearErrors(); 
     username.toggleClass('input-error'); 
    } else { 
     $.get("/checkEmail/" + email.val(), function (data) { 
      if (data) { 
       clearErrors(); 
       email.toggleClass('input-error'); 
      } else { 
       form.submit(); 
      } 
     }); 
    } 
    }); 
}); 

これは機能します。

+0

@ Popatop15コールバックが実際に非同期である場合、これはあなたがする必要があります。 –

+0

これを試してみます。 – Popatop15

+0

@JackA。そうです。それは非同期の問題のようです。 – charlietfl

関連する問題