私は Bhuvan Rikka のコメントに賛成票を投じるつもりでしたが、あなたのコードに対する Wirey のいじりを見た後、それは Hindenberg にペンキを塗る必要があることに同意するのと同じようなものだったと思います。
マークアップ、スクリプト、および使いやすさには、注意が必要な問題がいくつかあります。
- フォームが送信されないように、ID を修正して「false を返す」ようにします。Bhuvan Rikka のコメントを参照してください。
e.returnValue = false
- ID について: ID を意味のあるものにしてください。入力フィールドの名前が、realupload_1、p_name、p_price、realupload_2、p_desc ではなく、eBookFile、eBookName、eBookPrice、Thumbnail、Description に変更されました。
- フォーム マークアップ: 送信する必要のないフィールドには ID を指定しないでください。同様に、テキスト ラベルを入力テキスト フィールドにしないでください。
- その一連の elseif で検証を連鎖させることは、ユーザビリティーに関する大きな問題であり、検証エラーを表示するためにアラートを使用することでさらに悪化します。一度にすべてのエラーを表示します。念のため、アラートは使用しないでください。
- カスタムメイドの検証は素晴らしく、拍手を送ります。jQuery を使用していて、髪の毛を引っ張って車輪を再発明するのに 2 時間を費やしたくない場合は、Validate プラグインを使用してください。
次の変更を加えて、wirey のフィドルを拡張しました。
- HTML をクリーンアップしました。多くの!
- ASPNETCDNの Validate プラグインをリンクしました。
- デフォルト値を処理する「defaultInvalid」メソッドで検証プラグインを拡張しました。
- フォームは jQuery 検証プラグインを使用するようになりました。さまざまなフォーム要素に「required」および「defaultInvalid」CSS クラスを追加しました。
- 検証エラーのスタイルを追加しました。
それを試してみてください。最初の無効なフィールドのメッセージを表示するポップアップの代わりに、すべての無効なフィールドを表示できることに注目してください。
これがクリーンアップされた HTML です。
<form id="add_upload" action="/echo/json/" method="post" enctype="multipart/form-data">
<div class="standard-white-row upload-ebook-row">
<!-- The label is no longer an input. Removed ID from label -->
<div class="fakeupload">Select your ebook file…</div>
<input id="eBookFile" type="file" class="realupload required defaultInvalid" />
</div>
<div class="standard-white-row">
<div class="field-ebook-name">
<input id="eBookName" name="eBookName" type="text" value="eBook Name" class="required defaultInvalid" />
</div>
<div class="field-ebook-price">
<input id="eBookPrice" name="eBookPrice" type="text" value="0.00" class="required defaultInvalid" />
</div>
</div>
<div class="standard-white-row upload-preview-img-row">
<!-- The label is no longer an input. Removed ID from label -->
<div class="fakeupload">Select your thumbnail image…</div>
<input id="thumbNail" name="thumbNail" type="file" class="realupload required defaultInvalid" />
</div>
<div class="standard-white-row">
<textarea id="Description" name="Description" cols="" rows="" class="required defaultInvalid">Description…</textarea>
</div>
<div class="standard-white-row standard-white-submit">
<input id="submitButton" type="submit" value="Add ebook" />
</div>
<div class="errorSummary incomplete"></div>
</form>
フォーム検証関数については、まずhttp://ajax.aspnetcdn.com/ajax/jquery.validate/1.9/jquery.validate.min.jsで Validate プラグインにリンクし、次に defaultInvalid メソッドで検証を拡張します。
// Validation extension to invalidate a field if the value is the default.
// Add the 'defaultInvalid' css class to inputs with a default value.
jQuery.validator.addMethod("defaultInvalid", function (value, element) {
return !(element.value == element.defaultValue);
});
最初の検証方法では、無効なフィールドの横に検証エラーが表示されます。
2 番目の (そしてコメントアウトされた) 検証メソッドは、検証エラーをフォームの下の要約に入れます。
$(document).ready(function () {
// Invalid fields will receive the 'errorHilite' css class
// error message will be inline adjacent to the invalid field
$('#add_upload').validate({
keyup: false,
onfocusout: false,
onclick: false,
errorElement: "span",
errorClass: "errorHilite"
});
// Invalid fields will receive the 'errorHilite' css class.
// Error messages are summarized in the element specified by errorLabelContainer.
/*
$('#add_upload').validate({
errorLabelContainer: $(".errorSummary"),
keyup: false,
onfocusout: false,
onclick: false,
errorElement: "div",
errorClass: "errorHilite"
});
*/
});
その他のオプションについては、Validate API リファレンスをご覧ください。