jQuery Validation Plugin
- HTML5 APIs
- UI ライブラリ
- テスト支援
- ドキュメント
- コード品質ツール
- バリデータ
- キー入力支援
- テストダブル
- ハイブリッドアプリケーション
- 継続的インテグレーション
- jQuery Validation Pluginとは
- 主な機能
- 基本的な使い方
- その他操作
- jQuery Validation Pluginでできないこと
- 使用する上で気を付けること
- hifiveとの連携
- jQuery Validation Pluginを使用したサンプル
jQuery Validation Pluginとは
FORM要素内の入力部品に入力された値が正しいかを、指定したルールに基づいてチェックを行うライブラリです。
主な機能
- Submitイベント時のバリデーションの実行
- 入力内容変更時のバリデーションの実行
- カスタムバリデータの追加・削除
- エラーメッセージの追加・削除
- フォームの先頭(指定可)にエラーメッセージを一括表示
- エラーメッセージを任意の位置(要素)に表示
- バリデーション後、Submitを実行させない (デバッグモード)
- フォーカスが当たったときに、表示中のエラー内容をクリアできる
- エラーメッセージをどの要素でラップするか
- 依存条件を指定できる
- 以下のタイミングをコールバックメソッドでフックすることができる
- 全体に対してバリデートを実行してエラーが見つかった場合
- Submitイベントをする直前
- 入力後直後にエラーのあるが見つかった場合
- 入力直後にエラーが解消された場合
基本的な使い方
- HTML
<form method="post" action="/regist" id="form1">
姓:<input type="text" name="firstname">
名:<input type="text" name="lastname">
<br>
<div>1.現在服用しているお薬はありますか?
<input type="radio" value="1" name="medicine_conf">ある
<input type="radio" value="0" name="medicine_conf">ない
<br>
<div>
※1.で「ある」と選択した方のみ。<br>
服用しているお薬の名称を全て入力して下さい。
</div>
<textaria name="medicine_name">
<p>
<input type="submit">
</form>
- JavaScript
rules: {
firstname: {
required: true
},
lastname: {
required: true
},
medicine_name: {
required: {
depends: '#medicine_conf[value="1"]:checked'
},
maxlength: {
param: 10000,
depends: '#medicine_conf[value="1"]:checked'
}
}
},
messages: {
firstname: {
required: '名を入力して下さい'
},
lastname: {
required: '姓を入力して下さい'
},
medicine_name {
required: 'お薬の名称を入力して下さい',
maxlength: '{0}字以下で入力して下さい'
}
}
});
validate()でバリデータを初期化します。
パラメータには、ルールやエラーメッセージ等のパラメータを指定することができます。
rulesプロパティには、バリデーションのルールを定義します。
messagesプロパティには、バリデーションエラー時に画面上に表示するメッセージを定義します。
rulesとmessagesに指定しているオブジェクトのキーは、INPUT要素のnameプロパティの値と一致させます。
初期化後は、submitイベントが発生することで、自動的にバリデーションが実行されます。
min, max, minlength, maxlength, range, rangelengthルールにdependsプロパティを指定する場合
これらのルールにdependsを指定する場合、範囲や上限下限の値はparamプロパティに指定します。(上記サンプルコードのmedicine_nameを参照)
メッセージを可変で表示したい場合
messagesプロパティ内の値に、メッセージ文字列を返す関数を指定します。
rules: {
mailaddress: {
required: true,
mail: true
}
},
messages: {
mailaddress: {
required: 'メールアドレスを入力して下さい',
mail: function(params, el) {
return $.validator.format('{0}は不正な値です', el.value);
}
}
}
});
デフォルトのバリデーションルール
デフォルトで用意されている、rulesプロパティに指定できるバリデーションルールの一覧
ルール名 | 内容 |
---|---|
required | 必須入力チェックを行う |
remote | バリデーション結果をサーバに問い合わせる |
入力値がメールアドレスのフォーマットであるか | |
url | 入力値がURLのフォーマットであるか |
date | 入力値が日付であるか |
dateISO | 入力値がISO形式の日付であるか |
number | 入力値が数字であるか |
digits | 入力値がクレジットカード番号のフォーマットであるか |
creditcard | 入力値がクレジットカード番号のフォーマットであるか |
equalTo | 入力値が指定した値と一致しているか |
maxlength | 入力値が指定した桁数以下か |
minlength | 入力値が指定した桁数以上か |
rengelength | 入力値が指定した桁数の範囲であるか |
renge | 入力値が指定した数字の範囲であるか |
max | 入力値が指定した数字以下であるか |
min | 入力値が指定した数字以上であるか |
dateの仕組み
既存ルールのdateは、入力値をjavaScriptのDate型で生成します。(newします。)
正しくDateオブジェクトが生成できた場合に真(true)を返し、invalidになった場合に偽(false)を返す仕組みです。
javaScriptのDate型は正しい日付ではない値でも、Dateオブジェクトが生成される場合があるので注意が必要です。(以下参照)
alert(d.toString()); //Thu Feb 01 2001 00:00:00 GTM+0900(東京(標準時))
また、実際には存在しない31日を入力すると自動で翌月の1日へ変換されます。(invalidにはなりません。)
alert(d.toString()); // The Oct 01 2013 00:00:00 GTM+0900(東京(標準時))
jQuery Validation Plugin Date
http://jqueryvalidation.org/date-method
dateISOの仕組み
dateISOは、入力値が以下正規表現に沿っている場合真(true)を返し、それ以外は偽(false)を返します。
//区切り文字は / または - であること。
/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/
この正規表現では以下が全て真(true)になり厳密な日付チェックができないので注意が必要です。
alert(/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/.test(date1)); // true
var date2 = '2013-09/06' //区切り文字に - と / が混在している
alert(/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/.test(date2)); // true
jQuery Validation Plugin dateISO
http://jqueryvalidation.org/dateISO-method/
その他操作
バリデーションルールの追加
validate()で初期化後、あとからバリデーションルールを追加するには、addClassRules()で定義します。
jQuery.validator.addClassRules(name, rules)
パラメータ名 | 型 | 説明 |
---|---|---|
name | String | 対象とする入力要素のname属性の値 |
rules | Object | バリデーションルール |
required: true,
email: true
});
jQuery.validator.addClassRules(rules)
パラメータ名 | 型 | 説明 |
---|---|---|
rules | Object | キーにnameを、値にバリデーションルールを持つオブジェクト |
mailAddress: {
required: true,
email: true
}
});
カスタムバリデータの追加
独自のバリデータを登録するには、addMethod()を使用して入力値を検証するためのメソッドを登録します。
jQuery.validator.addMethod(name, method [, message ])
パラメータ名 | 型 | 説明 |
---|---|---|
name | String | ルール名 |
method(value, element, params) | Function | 検証を行うためのロジック(値が有効な場合はtrueを無効な場合はfalseを返すこと) パラメータ value: 入力された値 element: バリデート対象の要素 params: ルール設定時に設定された値 (例えば、ルールに『rengelength: [10, 20]』(10以上20以下)と指定した場合、paramsには[10,20]の値が入ってくる |
message | String | バリデーションエラー時にデフォルトで表示するメッセージ |
以下のコードは入力値が整数であるかを検証しています。
return this.optional(element) || /^-?\d+$/.test(value);
}, "整数で値を入力して下さい");
日付の検証をカスタムバリデータで追加する例
既存ルールのdate, dateISOでは厳密なチェックを行うことは難しいので、日付の検証は
カスタムバリデータを追加することを推奨します。
例)入力された日付フォーマットが「yyyy/MM/dd」 かつ 正しい日付であることをチェックする
var PTN_YYYYMMDD = /^\d{4}\/\d{2}\/\d{2}$/;
var DATE_DELIMITER = '/';
var date = new Date(value);
var optional = this.optional(element);
if (optional) {
return optional;
}
// invalidな日付または、フォーマット通りに入力されていない場合はNGとなる
if (/Invalid|NaN/.test(date.toString()) || !PTN_YYYYMMDD.test(value)) {
return false;
}
// 入力値とnewDate.toStringを文字列比較する。
// 実際には無い日付(2013/04/31)をnewDateすると勝手に変換(2013/05/01)するのでその対策。
// なお、31日だけこの現象が起こる。32日以降はnewDateでもinvalid判定になる。
var m = '0' + (date.getMonth() + 1);
var d = '0' + date.getDate();
var newDateStr = date.getFullYear() + DATE_DELIMITER + m.slice(-2) + DATE_DELIMITER + d.slice(-2);
return newDateStr === value;
}, '正しい日付を入力してください。');
任意のタイミングによるバリデート
valid()を実行することで、Submitイベント以外のタイミングでもバリデーションを実行することができます。
ただし、valid()を実行するまえにvalidate()で初期化を行う必要があります。
<input type="text" name="firstname">
<input type="text" name="lastname">
</form>
<input type="button" id="btn1" />
$form.validate({
rules: {
firstname: {
required: true
},
lastname: {
required: true
}
},
messages: {
firstname: {
required: '名を入力して下さい。'
},
lastname: {
required: '姓を入力して下さい。'
}
}
});
$('#btn1').click(function() {
$form.valid();
});
「どちらか片方必須」な入力項目を作成する
rulesで指定するバリデーションメソッドにrequire_from_groupを指定すると、自宅電話番号と携帯電話番号の様な、両方の項目が必須では無いがどちらか片方は必須、という入力項目が作成できます。
<input type="text" class="input-group-phone" name="phoneHome">
<input type="text" class="input-group-phone" name="phoneMobile">
</form>
"rules": {
"phoneHome": {
// ".input-group-phone"フィールドが1つ以上入力されていればOK
"require_from_group": [1, '.input-group-phone']
},
"phoneMobile": {
"require_from_group": [1, '.input-group-phone']
}
}
});
※※※
require_from_groupは標準バリデーションではありません。利用する場合additional-methods.jsを読み込む必要があります。
特定の状況のみ検証を行う
他の入力項目の状況等に応じてValidationを有効にする場合、 dependsを指定するとその要素が入力値検証に成功した場合のみ、自分の入力値検証を行う。また、関数を指定すると、返り値でtrue/falseを判別して実行する/しないを切り替えることができる。
$(form).validate({
rules: {
text1: {
required: {
// あるチェックボックスがONの場合のみ
depends: function (element) {
return $('#checkbox').is(':checked');
}
}
},
text2: {
required: {
// text1の入力値検証に成功している場合のみ
depends: 'input[name="text1"]'
}
},
number1: {
required: true,
min: {
// dependsを設定し、かつ検証パラメーターも設定する場合
params: 15,
depends: 'input[name="text2"]'
}
}
}
});
全てのエラーメッセージをフォームの上に表示する
個々のフィールドの直後に表示されるエラーメッセージを一箇所に集約する場合、 errorLabelContainer を設定します。同時に wrapper を設定することでリスト表示が可能となります。
<form method="post" action="/regist" id="form1">
<input type="text" id="text1" name="text1">
<input type="text" id="text2" name="text2">
</form>
"rules": {},
"errorLabelContainer": $('#errors'),
"wrapper": 'li'
});
エラー表示時は以下の様なHTML構造になります。
<li><label for="text1" class="error">エラーメッセージ1</label></li>
<li><label for="text2" class="error">エラーメッセージ2</label></li>
</ul>
<form method="post" action="/regist" id="form1">
<input type="text" id="text1" name="text1">
<input type="text" id="text2" name="text2">
</form>
jQuery Validation Pluginでできないこと
- 1つの項目に2つ以上のエラーがあったときに、そのエラーを全て表示する
使用する上で気を付けること
チェックボックスにrangelength、maxlength, minlength指定しても、バリデーションが動作しない
専用のカスタムバリデータを作成する必要がある
input[type="checkbox"]またはinput[type="radio"]の要素の場合、1度submitを行わないと入力値を変更してもバリデータが実行されない
submitせずに最初からバリデートを実行したい場合は、checkboxのclickイベントやradioのchangeイベントを拾って、入力要素ごとにvalid()を呼ぶ必要がある。
hifiveとの連携
__readyのタイミングで、jQuery Validation Pluginのvalidate()を実行し初期化を行う。
その際、highlight、unhighlight、submitHandler、invalidHandler、successには、ownWithOrg()でラップしたコントローラのメソッドをハンドラに指定する。
h5.core.controller('body', {
__name: 'sample.plugin.validationSampleController',
__ready:function() {
this.$find('#form1').validate({
rules: {
...
},
messages: {
...
},
highlight: this.ownWithOrg(this.highLightArea),
unhighlight: this.ownWithOrg(this.unHighLightArea),
submitHandler: this.ownWithOrg(this.submitHandler),
invalidHandler: this.ownWithOrg(this.invalidHandler),
success: this.ownWithOrg(this.successHandler)
});
},
/**
* 入力項目でエラーがあったときに実行されるハンドラ
*/
highLightArea: function(orgThis, el, error, errorClass) {
...
},
/**
* エラーが解消されたときに実行されるハンドラ
*/
unHighLightArea: function(orgThis, el, error, errorClass) {
...
},
/**
* validateのチェックが通り、submitが行われるときに実行するハンドラ
*/
submitHandler: function(orgThis, form, ev) {
...
},
/**
* validateでエラーが1つでもあると実行されるハンドラ
*/
invalidHandler: function(orgThis, ev, validator) {
...
},
/**
* 入力項目でエラーが解消されるたびに実行されるハンドラ
*/
successHandler: function(orgThis, errMsgElement, inputElement) {
...
}
});
});
jQuery Validation Pluginを使用したサンプル
サンプルはこちら