デモ:バリデータのフルオプション

jQuery toolsによる「バリデータのフルオプション」の動作デモです。

サンプルです。不正な値を入力して送信ボタンを押すと・・・

サンプル登録フォーム
e-メール *
URL *
名前 *
年齢
時間
承諾しますか?
|

サンプルコード

HTMLのサンプル

<form id="exampleForm">
<fieldset>
	<p>サンプルです。不正な値を入力して送信ボタンを押すと・・・ </p>
	<table>
	<caption>サンプル登録フォーム</caption>
	<tr>
	<th>e-メール *</th>
	<td><input type="email" name="email" required="required" /></td>
	</tr>
	<tr>
	<th>URL *</th>
	<td><input type="url" name="url" required="required" /></td>
	</tr>
	<tr>
	<th>名前 *</th>
	<td><input type="text" name="name" pattern="[a-zA-Z ]{5,}" maxlength="30" /></td>
	</tr>
	<tr>
	<th>年齢</th>
	<td><input type="number" name="age" size="4" min="5" max="50" /></td>
	</tr>
	<tr>
	<th>時間</th>
	<td><input type="time" name="time" /></td>
	</tr>
	<tr>
	<th>承諾しますか?</th>
	<td><input type="checkbox" required="required" />	</td>
	</tr>
	</table>
	<button type="submit">送信</button> | <button type="reset">リセット</button>
</fieldset>
</form>

CSSのサンプル

#example{
	padding: 10px 20px;
}
#exampleForm caption{
	font-weight: bold;
}
#exampleForm table{
	margin-bottom: 10px;
	border-bottom: solid 1px #ccc;
	border-left: solid 1px #ccc;
}
#exampleForm th,
#exampleForm td{
	padding: 5px;
	border-top: solid 1px #ccc;
	border-right: solid 1px #ccc;
}
#exampleForm th{
	background: #eee;
}
#exampleForm td input[type=text],
#exampleForm td input[type=url],
#exampleForm td input[type=email]{
	width: 300px;
}
.error{
	display:none;
	position: absolute;
	background: #f63;
	padding: 2px 10px;
	color: #fff;
	border: solid 1px #ccc;
	border-radius:2px;
	-moz-border-radius: 2px;
	-webkit-border-radius: 2px;
	-ms-border-radius: 2px;
	-webkit-box-shadow: #999 2px 2px 2px;
	-moz-box-shadow: #999 2px 2px 2px;
	box-shadow: #999 2px 2px 2px;
}
.invalid{
	background: #ffe;
}

Javascriptのサンプル

$(document).ready(function() {
	// オリジナルのバリデート
	$.tools.validator.fn("[type=time]", function(el, value) {
		return /\d\d:\d\d/.test(value) ? true : {en:"invalid",ja:"時間の指定が不正です"};
	});
	// エラーメッセージのローカライズ
	$.tools.validator.localize("ja", {
		":email"     : "e-mailアドレスを正しく入力してください",
		":number"    : "数値を正しく入力してください",
		"[max]"      : "最大値[$1]",
		"[min]"      : "最小値[$1]",
		"[required]" : "必須項目です",
		"[pattern]"  : "パターンが不正です"
	});
	
/*
	$("[name=password]").oninvalid(function(event, errorMessage) {
		// get handle to the API
		var api = $(this).data("validator");
		
	});
*/
	
	// エフェクトのカスタマイズ・
	$.tools.validator.addEffect("wall", function(errs, event) {
		var conf = this.getConf();
	
		// エラー要素を繰り返し
		$.each(errs, function(i, err) {
				
			// 設定していたエラークラスを指定
			var input = err.input;
			input.addClass(conf.errorClass);
			
			// エラーハンドラを取得
			var msg = input.data("msg.el"); 
			
			// もしなければ生成
			if (!msg) { 
				msg = $(conf.message).addClass(conf.messageClass).appendTo(document.body);
				input.data("msg.el", msg);
			}  
			
			// エラーメッセージを一度クリア
			msg.css({visibility: "hidden"}).find("span").remove();
			
			// エラーメッセージを表示
			$.each(err.messages, function(i, m) { 
				$("<span/>").html(m).appendTo(msg);			
			});
			
			// 幅を調整
			if (msg.outerWidth() == msg.parent().width()) {
				msg.add(msg.find("p")).css({display: "inline"});		
			}
			
			// メッセージを挿入するためのポジションを取得  (trigger, el, conf)
			var pos = getPosition(input, msg, conf);
			msg.css({visibility: "visible", position: "absolute", top: pos.top, left: pos.left }).slideDown(conf.speed);
			
			// 要素の位置を取得
			function getPosition(trigger, el, conf) {	
				
				// get origin top/left position 
				var top = trigger.offset().top, 
					 left = trigger.offset().left,	 
					 pos = conf.position.split(/,?\s+/),
					 y = pos[0],
					 x = pos[1];
				
				top  -= el.outerHeight() - conf.offset[0];
				left += trigger.outerWidth() + conf.offset[1];
				
				// adjust Y		
				var height = el.outerHeight() + trigger.outerHeight();
				if (y == "center") 	{ top += height / 2; }
				if (y == "bottom") 	{ top += height; }
				
				// adjust X
				var width = trigger.outerWidth();
				if (x == "center") 	{ left -= (width  + el.outerWidth()) / 2; }
				if (x == "left")  	{ left -= width; }	 
				
				return {top: top, left: left};
			}	
		});
	}, function(inputs)  {
		// 非表示の動作
		var conf = this.getConf();
		inputs.removeClass(conf.errorClass).each(function() {
			var msg = $(this).data("msg.el");
			if (msg) { msg.slideUp("fast"); }
		});
	});


	$("#exampleForm").validator({
		grouped: false,             // その要素のエラーメッセージを1回で表示させるかどうかを指定できます
		effect: "wall",             // エフェクトの種類・デフォルトでは"default"のみ、カスタムエフェクトを追加できる。
		errorClass: "invalid",      // エラーの時にinput要素に付与されるクラス名
		
		// どんなときにバリデートするか?
		inputEvent: "keyup",        // 値を入力するときにどのタイミングでバリデートするか?。change, blur, keyup, null 
		errorInputEvent: "blur",    // 値の再チェックのタイミング。change, blur, keyup, null
		formEvent: "submit",        // バリデートのタイミング。 submit, null

		// エラーメッセージに関する指定
		lang: "ja",                 // エラーメッセージの言語(デフォルトはen)
		message: "<div/>",          // エラーメッセージ要素のDOM構造
		messageAttr: "data-message", // 上書きするエラーメッセージの属性名name
		messageClass: "error",      // エラーメッセージ要素のクラス名e
		offset: [10, 0],            // エラーメッセージ要素のオフセット値 
		position: "center right",   // エラーメッセージ要素のポジション
		singleError: false,         // バリデートを1つの要素のみにするか?
		speed: "normal",             // メッセージのフェードイン速度
		onBeforeFail: function (){
			// フィールド単位でエラーがあれば
		},
		onBeforeValidate: function (){
			var inputs = this.getInputs();
			$.each(inputs, function(i, e) {

			});
		},
		onFail: function (){
			// バリデートの結果、エラーが1つでもあるならば
			$("[type=submit]").attr("disabled","disabled");
		},
		onSuccess: function (e,obj){
			// バリデートの結果、エラーがないときは
			$("[type=submit]").attr("disabled","");
			
			/* jQueryオブジェクトとしてパラメータの取得も可能
			alert("success:\n"+
				obj.eq(0).val()+"\n"+
				obj.eq(1).val()+"\n"+
				obj.eq(2).val()
			);
			*/
			return false;
		}
	});
	
	$("[type=reset]").click(function (){
		$("[type=submit]").attr("disabled","");
	});
});