submitHandler は、フォームが初めて送信されるまで起動しません。ユーザーが初めてフォームに入力するときにユーザー名の一意性を確認したい場合は、別の関数が必要になります。"{taken:false}"
以下の例では、指定されたユーザー名がデータベースに存在するかどうかを確認するために SQL クエリを実行し、ユーザー名が一意であるかのような json 文字列を返すページがあると想定しています。
$('#yourForm [name="username"]').on('blur',function(){
var username = $(this).val();
$.get('check/username.php',{username:username},function(data) {
if(data.taken) {
// highlight the field and indicate that the username is already taken
}
},'json');
}
への呼び出しの詳細は、$.get
バックエンドの設定方法によって異なります。しかし、一般的に、プロセスは次のようになります。
- ユーザーがユーザー名を入力します
- ユーザーがフィールド外でぼかす
- ユーザー名の一意性を確認するために、サーバーに対して $.get または $.ajax 呼び出しが行われます。
- サーバーからの応答がユーザー名が一意ではないことを示している場合は、検証を処理し (フィールドを強調表示する、Xアイコンを追加するなど)、次のいずれかを行います。
- ユーザー名が一意になるまでフォームの送信を禁止する、または
- フォームを送信して、ユーザー名が重複している場合にエラーを返す
アップデート
検証プラグイン用の新しいルールを作成する場合は、次のようにすることができます。
function isUsernameUnique(username,field) {
var unique = false;
$.ajax({
url: 'path/to/usernameCheck/',
data: { username: username },
async: false,
success: function(data) { unique = data.unique; }
});
return unique;
}
$.validator.addMethod(
'uniqueUsername',
isUsernameUnique,
'That username is already in use. Please choose a unique username.'
);
次に、フォームの検証関数で:
$('#yourForm').validate({
...
rules: {
username: { uniqueUsername: true }
...
}
...
});
そして、blur
ユーザー名フィールドの別の関数:
$('[name="username"]').on('blur',function(){
var unique = isUsernameUnique($(this).val(),$(this));
if(!unique) {
// handle error
}
});
これにより、送信前の検証と検証プラグインの両方に同じ関数を再利用できます。ただし、ここには 2 つの問題があります。
1 - 最初の送信後、$.fn.validate() はユーザー名フィールドを積極的に検証します。つまり、ユーザー名フィールドでのblur
イベントは不要になります。おそらく、最初の送信後に無効にして、不要な ajax 呼び出しを防ぐことができます
blur
2 -イベント ハンドラーで独自のエラー処理を行う必要があるため、100% DRY ではありません。