最初に検証を行い、次に ajax を介して送信するフォームがあります。ここでは、データベースに既に存在する可能性のあるユーザー名など、いくつかのフィールドがチェックされます。問題の要素の直後に、これらのエラー状態のいずれかを表示したいと考えています。フォーム要素は次のようになります。
<span class="inputRow">
<span class="formLabel">
<label for="user_name">User Name</label>
</span>
<span class="formInput">
<input id="user_name" name="user_name" class="inputText required" title="User Name" tabindex="3" type="text" value="<?= $user_name ?>" >
<span class="formError"><span id="user_msg"></span></span>
</span>
</span>
次のような典型的な検証/エラー配置コードがあります。
errorPlacement: function(error, element)
{
if (element.attr("name") == "user_name" )
error.insertBefore("#user_msg");
else
error.insertAfter(element);
},
});
フォームを送信するために、次のような送信ハンドラーがあります。
submitHandler: function(form) {
$.ajax({
type:'POST',
url: 'add_user.php',
data:$('#reg_form').serialize(),
success: function(response) {
if (response.status == "error") {
if (!response.hasOwnProperty('user_name'))
$("#user_msg").text("");
else if (response.user_name.length > 0)
$("#user_msg").text(response.user_name);
}
}
});
},
返される応答は JSON 配列であり、エラー メッセージを正常に取得できます。これは、フォームを初めて送信するときにすべてうまく機能します。ユーザー名が重複している場合は正しく表示され、ユーザー名が入力されていない場合も正しく表示されます。問題は、フォームを送信して、ファイルに重複したユーザー名に関する応答を受け取ったときに発生します。次に、user_name フィールドをクリアしてフォームを再度送信しようとすると、ユーザー名が重複しているというメッセージが表示されたままになり、ユーザー名が必要であるというメッセージも表示されます。
私には、errorPlacement 関数が error.insertBefore("#user_msg") を使用するため、これらの表示方法に競合があるように見えますが、ajax 関数からの戻り値は $("#user_msg").text() を使用します。そのため、insertBefore() は以前の text() 値を削除しませんが、errorPlacement からテキストを表示する他の方法は見つかりませんでした。エラー オブジェクトからテキスト値を取得できますか? もしそうなら、どのように?または、これらの両方を同じように機能させるより良い方法はありますか?