リアルタイムフォームバリデーション jQuery.validation.js

お知らせ(10.08.06):
jQuery.validation.jsはアップデート・修正対応などを終了しました。
仕様などを変更したバリデーションプラグインを公開したので、そちらの方を参考にしてください。(validation.jsにはあるのにexValidationでは実装していない機能もありますが、基本的に実装は行いません)
どんなフォームにも使えるjQueryのフォームバリデーションプラグイン: exValidation

validation.jsサンプル

jQuery.validation.jsはフォーム入力のイライラを軽減して、Webブラウジングとかショッピングをもっと快適にするためのjQueryプラグインです。(もちろんサーバサイドでのチェックは必須ですが…)

jQuery.validation.jsのサンプルを見てみる

トピックス

特徴

フォームバリデーションのライブラリはたくさん存在しますが
jQuery.validation.jsの特徴として

  • リアルタイムでエラーを表示することで間違いを少なくする
  • クリーンなHTMLで使える
  • フォームのデザイン(HTMLの構成)に依存しない
  • エラーチップのデザイン・位置を変更できる
  • エラー文、ダイアログに表示する文章を変更できる
  • 複数のフォームがある場合 フォーム毎に設定を変更できる
  • ダイアログと透明レイヤーの透過度を変更できる
  • AjaxZip2.0と併用できる

などがあります。(詳細は導入方法拡張に記述。)

ダウンロード

jQuery.validation.jsはjQueryのプラグインなので
以上が必要になります。(サンプルファイルにはjQuery1.4が含まれています。)

ソース単体
jQuery.validation.js
jQuery.validation.min.js
サンプルファイル(AjaxZip2.0同梱)
validation.zip

導入方法

1.JSファイルを読み込む



2.input要素にクラスを割り振る(checkbox、radio、複数項目以外)

HTMLファイルのinput要素に以下のクラスを割り振ることで
適用する項目を決めることができます。

  • required – 必須項目
  • retype-対象にするID – 再入力チェック
  • email – メールアドレスチェック (*081114 mail から email に変わりました
  • hankaku – 全角禁止
  • tel – 電話番号(形式チェックはなし)
  • numonly – 数字のみ
  • zip – 郵便番号(形式チェックはなし)

また、適用させる項目はrequiredとhankakuは他の項目と同時に含めることが出来ます。
例えば下記のようにクラスにemail, hankaku, requiredを指定した場合は


必須項目・メールアドレスチェック・全角禁止になります。
またクラスに記述する順序は任意で構いません。
ところでjQuery.validation.jsを導入する場合、input要素には固有のidが必須になります。
またvalue属性も必須になります。

特殊なタイプのチェック形式は以下のようになります。カッコ内はあってもなくても可

メールアドレス:*@*.*
電話番号:*(-)*(-)*
郵便番号:***(-)****

電話番号…微妙なんですよね…

3.checkbox、radio、複数項目の場合

checkbox、radio、複数項目をチェックする場合は
spanなどのインライン要素(*1)でグループを明示した上で
ここではspan要素としますが span要素にid、classを割り当てます。

  • group – 複数項目のチェック
  • check – checkbox ひとつ以上が選択されるとクリア
  • radio – radio いずれかが選択されるとクリア

例えば、メールアドレスを@前と後で分ける場合は


@

といったように分けるのが一般的なので
これをチェックする場合は以下のようになります。


ポイントは上にも記述していますが、
複数のinput要素をまとめるspanを用意してそのspan要素にid、classを割り当てます

classはgroupが必須になり、あとはinput単体で指定するものが使えます
なので今回の場合はclassには group, required, hankaku, email が入ることになります。

以下はradioボタンの例です。


      
  •   

radio、checkboxは例外になり
必須項目としてしかチェック出来ないのでclassにrequiredは必要ありません

上記の例ではグループ化がspan要素ではなくul要素になっていますが
CSSでinline指定(*1)すれば大丈夫です。
要はdisplayプロパティがinline(inline-blockでも可)であればなんでも大丈夫です。

*1) 幅を持たせたブロック要素でも可
ブロック要素は幅初期値が親に対して100%になるので エラーチップが画面から見切れます。

4.select要素を対象にする場合

select要素を対象にする場合は


のようにvalueが空のoption要素を含めます。value属性を指定しないとvalidationは行われません。
初期値には必ず空のvalue属性を指定してください。(初期値にはselected属性を指定することが推奨されています)
select要素は選択されているoptionが変わった場合にvalidationが行われます。

5.再入力をチェックする場合

メールアドレスやパスワードなど
再入力を促す項目がある場合、それもvalidationの対象にすることができます。
たとえば、


の後に


といった再入力項目があるとします。
この項目は先のメールアドレス入力項目 input#mail と同じものを入力してもらうので


のようにクラスに retype-対象にする項目のID を含めます。
今回は対象にする項目(メールアドレス入力項目)のIDはmailとなっているので retype-mail としています。

再入力チェックは複数項目の場合も有効で、
単純に3と組み合わせるだけです。


の再入力項目は


@

となります。

6.入力文字数をチェックする場合

パスワードなどの項目に入力文字数の制限をかけたいときは


のようにclassに

  • minX
  • maxX (Xはともに任意の数字)

を含ませます。もちろんmin・maxどちらか一方だけを指定でき、
また他のすべてのチェックと併用することができます。
ただし複数項目のメールアドレスは 文字列に@を含めるので1文字多く数えられます。
(メールアドレスに入力文字数制限を使うことはないと思うのでそのままにしてます。)

7.アクティベート

最後に任意のJSファイルで以下のように実行します。

$(function(){
  $(".validate").validation();
});

対象にするform要素は

$("対象にするform要素").validation();

で決定します。
form要素全てに適用する場合は

$("form").validation();

classに”validation”を含むform要素全てに適用する場合は

$(".validation").validation();

idに”validation”を含むform要素のみに適用する場合は

$("#validation").validation();

となります。

拡張

特徴でも記述したようにjQuery.validation.jsはなるべく汎用性を持たせるために
さまざまな拡張プロパティがあります。

表示メッセージを変更する場合

たとえば、必須項目とメールアドレスチェックの文章を変えたいときは

$(".validate").validation({
  msgs: {
    required: "This field is required",
    mail: "Enter the valid E-mail address"
  }
});

とします。
msgsが持つプロパティの初期値は

  • required: “必須項目です”
  • retype: “直前の項目と同じ内容を入力してください”
  • email: “正しいEメールアドレスを入力してください” (*081114 mail から email に変わりました
  • hankaku: “全角文字は使えません”
  • tel: “数字と’-'(ハイフン)以外は使えません”
  • numonly: “数字のみで入力してください”
  • zip: “正しい郵便番号を入力してください”
  • check: “ひとつ以上を選択してください”
  • radio: “いずれかを選択してください”
  • min: “文字以上で入力してください”
  • max: “文字以内で入力してください”
  • submit: “必須項目を正しく入力してください”

です。実際に記述するときは順不同で構いません。
このうちrequiredからzipはエラーチップに表示される文章で
submitのみダイアログに表示される文章となっています。
これらのプロパティに含まれる文章にはHTMLタグを使うことが出来ます。

サンプルではダイアログのメッセージ(msgs.submit)に

$(".validate").validation({
  msgs: {
    submit: "入力が完了していない必須項目があります。
必須項目は全て入力してください。"   } });

といったようにstrongタグと改行を含ませています。

チップの位置を変更する

チップは各input要素を基準にして表示位置が決定されます。
初期設定でチップはinput要素の右に表示されるようになっていますが
初期位置を

  • 上: “top”
  • 右: “right”
  • 下: “bottom”

から選択することができ、初期値からの位置を細かく指定することができます。
例えば、チップをinput要素の下、さらに10px下方へ配置する場合は以下のようにします。

$(".validate").validation({
  extension: {
    position: "bottom",
    top: 10,("10px")
    left: 0
  }
});

ここで注意するのは、inputの幅と高さはpaddingとborderを含まない点です。

input {
  border: solid #DFDFDF 3px;
  padding: 3px;
  width: 200px;
  height: 20px;
}

といった指定がされている場合、チップはinput要素に12px分重なることになります。
チップ位置の初期値はそれぞれ

  • position: “right”
  • top: 0
  • left: 15(px)

になります。

AjaxZip2.0を使う

AjaxZip2.0を使う場合は以下のようjquery.jsとjQuery.validation.jsの間でAjaxZip2.jsを読み込み




チップと同じextension内に

$(".validate").validation({
  extension: {
    AjaxZip2: true
  }
});

とします。
AjaxZip2.0の詳しい使い方・設定などはKawa.netのページを参照してもらいたいのですが
対象にするinputのid name属性を同じextension内で指定します。

$(".validate").validation({
  extension: {
    AjaxZip2: true,
    zip: "zip",
    zip2: "zip2",
    pref: "pref",
    addr1: "addr",
    addr2: "addr2",
    addr3: "addr3" (strtに相当)
  }
});

それぞれの初期値は

  • AjaxZip2: false
  • zip: “zip”
  • zip2: null
  • pref: “pref”
  • addr1: “addr”
  • addr2: null
  • addr3: null

になりますので、構成要素が以下のような




郵便番号・都道府県・都道府県以下の住所の場合はzip~addr3の設定は必要ありません。

ダイアログの設定

必須項目が未入力または正しく記入されていないまま(エラーチップが表示されている状態)で
submitボタンを押すとダイアログが表示されますが(必須項目でなければダイアログは表示されません)

  • matOpacity: グレーアウトのレイヤーの透過度
  • dialogOpacity: ダイアログの透過度
  • duration: 表示する速さ
  • closeTitle: 閉じるボタンのtitle属性

を変更することができます。これらを変更するには、

$(".validate").validation({
  dialog: {
    duration: "fast",
    matOpacity: 0.6,
    dialogOpacity: 0.9,
    closeTitle: "このメッセージを閉じる"
  }
});

のように記述します。上記が初期値になります。
ちなみにcloseボタンはマウスホバー時に”hover”がクラスに追加されるので
CSSを使ってロールオーバーイメージを指定することができます。(サンプルでは指定済み)

ダイアログを使わずにSUBMITボタンを押せなくする

ダイアログを使いたくない場合は

$(".validate").validation({
  extension: {
    dialog: false,
    submit: "#submit"
  }
});

のように extension のプロパティで指定することで
エラーチップが表示されている場合は、SUBMITボタンをDISABLEDにできます。

submitプロパティではSUBMITボタンを指定します。
FORM要素内で使っているSUBMITボタンのIDが”SUBMIT”なら
上記のように、submit: “#submit” で指定できます。

jQueryの要素指定と同じ方法で指定できるので

submit: "input[type='submit']"

submit: "input[type='submit'],input[type='image']"

などのようにも指定できます。

上記複数の項目を同時に指定する場合

メッセージ、チップ・AjaxZip2.0、ダイアログを同時に設定する場合は
以下のようにそれぞれをカンマで区切って記述します。

$(".validate").validation({
  msgs: {
    submit: "入力が完了していない必須項目があります。
必須項目は全て入力してください。
"   },   extension: {     position: "bottom",     top: 15,     left: 0,     AjaxZip2: true,     zip: "zip",     zip2: "zip2",     pref: "pref",     addr1: "addr",     addr2: "addr2",     addr3: "addr3"   },   dialog: {     duration: "fast",     matOpacity: 0.6,     dialogOpacity: 0.9,     closeTitle: "このメッセージを閉じる"   } });

フォームの項目をリセットする

入力したデータをリセットする場合は、通常通り


という項目をform要素に含めればよいのですが、a要素などのclickイベントにresetをバインドしている場合は、validationがうまく動作しないので、$.validationResetFuncメソッドを使います。

$('a#reset').click(function(){
  $.validationResetFunc();
  return false;
});

更新履歴・追記

10.03.08
画面読込時に一度クリックしないと色々できないバグを修正しました。
10.01.24
リセットボタンの処理を追加しました。
email、zipの正規表現を修正しました。
09.04.20
dialogを使わずにsubmitボタンがdisabledになるだけのオプションを追加しました。
AjaxZip2の実装でトリガーになる属性をNAMEではなくIDにしてしまっていたところを修正しました。
Safariで必須項目の表示が最初に表示されていなかったので修正しました。
Webkit系で読み込み後、一度クリックしないとフォームの要素が反応しないバグはjQueryをアップデートすることで解消されます。
09.02.03
select要素のグループ化に対応しました。
09.01.09
入力文字数をチェックできるようになりました。
08.12.16
郵便番号を分割した際にAjaxZip2が使えなくなってたので修正しました。
郵便番号のチェックを***(-)****にしました。(日本はこの形式しかないし。。どうでしょう…)
どうでもいいことですけど、未圧縮JSファイルのコメントを削るのをやめました。
08.12.13
checkbox、radio、複数項目を対象に含むことができるようになりました。
IE6でエラーダイアログを表示したときにselect・object要素が前面にくる現象に対処しました。
08.11.14
再入力項目をvalidation対象に含むことができるようになりました。
08.11.13
select要素をvalidation対象に含むことができるようになりました。
08.08.28
input[type="hidden"]を対象に含めてたのが原因でした。。
08.08.28
一定条件下(主にかも)でtextareaのoffset.leftが取得できずにエラーが発生するバグがあります。。。修正済(@08.08.28)
動作環境
Windows: IE6, IE7, Firefox3, Opera9.5, Safari3, Chromeで確認

何か役に立つことがあったらシェアしてみてください

Comments: 92 - Leave a comment

  1. ryo

    先ほど、ご質問をさせて頂いたのですが、
    ajaxzip2.js内の91行目を
    var jarea = array[2];
    に変更する事で、解消されました。
    大変失礼いたしました。

  2. ryo

    はじめまして。
    とても素晴らしいですね。
    早速使用させて頂きたく思っております。
    そこで、ご質問なのですが、Ajaxzip2.0を使用して、住所を表示させる時に、市区までしか表示できず、町村が表示されないのですが、いかがしたらよろしいでしょうか?
    よろしくお願い致します。

  3. じろーさん

    参考になる質問がありましたが、以前の質問のリンクが切れていたものですから質問させて下さい。>過去の質問内容
    >tatamix June 3rd, 2009 12:00:43
    >チェックボックスAがcheckedの時に、テキストエリアXを必須にする、というようなフォーム間の依存関係なんかは定義できるのでしょうか?

    ●質問●
    チェックボックスAがチェックされている時(=1)はテキストエリアXを必須に

    チェックボックスAがはずれている時(=” “)はテキストエリアXの必須をなしにして セレクトメニューY を必須とすると言う様なことは可能でしょうか?

    お時間ありましたらよろしくお願いします。

    1. nori

      取り急ぎリンク修正しましたが、その記事でも大丈夫そうですか?内容を見る限り大丈夫だと思います。

      https://5509.me/log/checkifvalidation

  4. miconear

    はじめまして、こんばんは。

    「リアルタイムでフォーム入力をチェックすることはできないのか?」
    と思い検索していましたらこちらに辿り着きました。
    早速利用させてもらっています!感謝感激です!

    そこで質問なのですが、姓名を全角カタカナのみで入力させたいのですが可能でしょうか?

    お手数掛けて申し訳御座いませんが宜しくお願い致します。

    1. nori

      こんばんは。

      カタカナの件ですが、exValidationでは標準対応しているのですがそちらではだめですか?

      オプションのfirstValidateをtrueにすればこのvalidationプラグインと同じような動きになるはずですので。

  5. jou

    >> noriさん

    もちろん使わせて貰います!
    丁寧にどうもありがとうございましたー。

Cancel to reply

Leave a comment

Trackbacks: 14

Trackback URL for this entry
Listed below are links to weblogs that reference
リアルタイムフォームバリデーション jQuery.validation.js from 5509
  1. pingback from validation.js « moto-mono

    [...] Newer [...]

  2. pingback from tirolstar has been renewal !! « moto-mono

    [...] Older [...]

  3. trackback from moto-mono

    validation.js をアップデートしました

    要望のあった

    select要素のチェック
    再入力項目のチェック

    を追加しました。サンプルで確認できます。
    併せて メールアドレスチェックで指定するクラスが mail から …

  4. pingback from validation.jsをアップデートしました 2 « moto-mono

    [...] 使い方はjQuery.validation.jsの記事に追記しています。 [...]

  5. pingback from jQuery.validation.jsのアップデート | 5509

    [...] で使い方の抜粋を載せておきます。 詳しくはjQuery.validation.jsの記事を参照してください。 [...]

  6. pingback from jQuery.validation.jsとAjax Username Checkerを組み合わせて使う | 5509

    [...] リアルタイムフォームバリデーション jQuery.validation.jsselectボックスをシンプルなプルダウンに拡張するjQuery.selectable.jsAutoPagerizeをWordPressで WP-AutoPagerizeプラグインAutoPagerizeプルダウンで都 [...]

  7. pingback from [j-Query]リアルタイムでチェックできる「jQuery.validation.js」 « graphix-design.jp

    [...] リアルタイムでチェックできる「jQuery.validation.js」 [...]

  8. pingback from jQuery.validation.jsのアップデート | 5509

    [...] jQuery.validation.js [...]

  9. pingback from CSS Nite in OSAKA, Vol.14に参加させて頂きました。 | 5509

    [...] jQuery.validation.js [...]

  10. pingback from jQuery.validation.jsを使ったフォームでチェックによって必須項目の分岐を行う | 5509

    [...] via: https://5509.me/2008/08/22/realtimeformvalidation.html#comments [...]

  11. pingback from [php] [js] JQuery.Validation.jsをちょこっと改造 - 雑記帳

    [...] リアルタイムフォームバリデーション jQuery.validation.js – 5509 [...]

  12. pingback from ITキヲスク | 2009年8/9~8/15の週間ブックマーク

    [...] リアルタイムにフォーム内容を精査する「jQuery.validation.js」 [...]

  13. pingback from [Ajax][UI]画像スライダー・郵便番号検索・バリデーション « vanillate

    [...] リアルタイムフォームバリデーション jQuery.validation.js :: 5509 https://5509.me/2008/08/22/realtimeformvalidation.html [...]

  14. pingback from html5について語ってみたい » 今更ですが

    [...] ちなみに、5509さんのところのを使用させていただこうと思っていて……。サーバーで自動で生成されるcgiメールフォームにくっつけて使用させていただこうと思っていたのですが、動か [...]

Author

nori
nori
- UI Engineer
Location
- ,