jQuery Validate Pluginの解説とValidate 日本語環境用PluginとjQuery Form Pluginとの連携


前回、フォームをAJAXでうんちゃかするjQueryFormPluginのエントリーを書きましたけど、フォームと言えばValidateですよね。


ってことでjQueryValidatePluginについてもサラサラ見ていたので、こっちも日本語Document化したのを書いておく。
で、日本語化して書いていたら思ったよりも量が多くて少し適当な感が否めないような感じになっているかもしれません。
必要なさそうなところは一部飛ばしているしー、たまにおかしいところがあるかもしれませんが悪しからず。そんときはコメントくださーい。


あ、あとエラーメッセージ等のローカライズ版と日本語環境用のValidateメソッドを新たに追加するスクリプトも書きました。
デフォルトだと半角英数のみとかー、ひらがなのみとかーできないんでー


それから、もともとの目的のjQuery Form Pluginとの連携でAJAXなんちゃら〜に関することも書いときます。


jQuery Validate Pluginの解説

jQuery Validate Pluginの基本メソッド

■validate( options )

バリデートする任意のフォームを設定します。
詳細についてオプション値を設定することも出来ます。

//オプション値なし
$("#myform").validate();
//オプション値あり
var options = {rules : {
	comment: {
		required: true,
		minlength: 5
	}
}}
$("#myform").validate(options);


■valid()

バリデートの結果をtrue or falseで返す。
valid()を呼び出す前にvalidate()を呼び出しておく必要がある。

$("#myform").validate();
$("a.check").click(function() {
	alert("Valid: " + $("#myform").valid());
	return false;
});


■rules()

バリデートするフォームのエレメントに設定されているルールをオブジェクトデータとして取得します。
(エレメントが複数ある場合は最初に選択されたエレメント)

$("#myform input").rules();


■rules( "add", rules )

バリデートするフォームのエレメントに新しくルールを追加します。

$("#myinput").rules("add", {
 minlength: 2
});


■rules( "remove", [rules] )

バリデートするフォームのエレメントに設定されているルールを外します。

//全て外す
$("#myinput").rules("remove");
//minとmaxだけ外す
$("#myinput").rules("remove", "min max");


■removeAttrs( attributes )

バリデートするフォームのエレメントから属性値を外す?

$("#skip").click(function() {
	var rules = $("#myinput").removeAttrs("min max");
	$("#myform").submit();
	$("#myinput").attr(rules);
});
validate( )メソッドのオプション

■debug

trueの場合、デバッグモードになりフォームは送信されない。
内容はjavascriptのデバッグコンソールに出力される。
Firefox-Firebugの場合「console.log()」、Safariの場合「window.console.log()」

$(".selector").validate({
   debug: true
})


■submitHandler

フォーム内容がValidだった場合のコールバック関数を指定します。
指定されていない場合は、通常通りフォームが送信されます。

$(".selector").validate({
   submitHandler: function(form) {
       // do other stuff for a valid form
   	form.submit();
   }
})


■invalidHandler

フォーム内容がInvalidだった場合のコールバック関数を指定します。

$(".selector").validate({
    invalidHandler: function(form, validator) {
      var errors = validator.numberOfInvalids();
      if (errors) {
        var message = errors == 1
          ? 'You missed 1 field. It has been highlighted'
          : 'You missed ' + errors + ' fields. They have been highlighted';
        $("div.error span").html(message);
        $("div.error").show();
      } else {
        $("div.error").hide();
      }
    }
 })


■ignore

Validateを無視するエレメントをセレクタで指定します。

//class="ignore"はvalidateしない
$("#myform").validate({
   ignore: ".ignore"
})


■rules

Validateルールを指定します。
詳しい指定方法は下の方に記述します。

//nameは必須項目。emailは必須項目でメールアドレス形式かチェックする
$(".selector").validate({
   rules: {
     // simple rule, converted to {required:true}
     name: "required",
     // compound rule
     email: {
       required: true,
       email: true
     }
   }
})


■messages

各エレメントの各ルールに応じたエラーメッセージを個々に設定します。

$(".selector").validate({
   rules: {
     name: "required",
     email: {
       required: true,
       email: true
     }
   },
   messages: {
     name: "nameは必須項目です。",
     email: {
       required: "emailは必須項目です。",
       email: "emailの入力形式が正しくありません。"
     }
   }
})


■groups

入力項目のvalidateをグループとしてまとめます(TELなど複数の入力欄に分かれたものに単一のメッセージを表示する)。
グループのエラーメッセージはerrorPlacementで指定できます。

$("#myform").validate({
  groups: {
    username: "fname lname"
  },
  errorPlacement: function(error, element) {
	  //fnameかlnameのエラーの場合、#lastnameの後に表示
     if (element.attr("name") == "fname"  || element.attr("name") == "lname" )
       error.insertAfter("#lastname");
	 //それ以外の場合はエレメントの後に表示
     else
       error.insertAfter(element);
   },
   debug:true
 })


■onsubmit

Valid時のデフォルトフォーム送信についてtrue or falseで指定する。
デフォルトはtrue


■onfocusout

入力項目からフォーカスアウトにしたときに自動的にValidateするかtrue or falseで指定します。
デフォルトはtrue


■onkeyup

キーボードのキーが押されたときに自動的にValidateするかtrue or falseで指定します。
デフォルトはtrue


■onclick

チェックボックスやラジオボタンでクリックされた時点で自動的にValidateするかtrue or falseで指定します。
デフォルトはtrue


■focusInvalid

フォームがInvalidの時に自動的にInvalidの項目にフォーカスするかをtrue or falseで指定します。
デフォルトはtrue


■focusCleanup

Invalidだった入力項目にフォーカスしたときにerrorClassを外してメッセージを非表示にするかどうかをtrue or falseで指定します。
デフォルトはfalse


■errorClass

errorClassとして挿入されるClassNameを再設定します。
デフォルトは"error"

$(".selector").validate({
   errorClass: "invalid"
})


■validClass

validClassとして挿入されるClassNameを再設定します。
デフォルトはvalid

$(".selector").validate({
   validClass: "success"
})


■errorElement

エラーメッセージのマークアップタグを再指定します。
デフォルトは"label"

$(".selector").validate({
   errorElement: "em"
})


■wrapper

Validate時のエラーメッセージをリストのようにまとめて表示する場合、個々のエラーメッセージのマークアップタグを指定します。
(errorLabelContainerを指定時のみ使用)


■errorLabelContainer

Validate時のエラーメッセージをリストのようにまとめて表示する場合のエレメントを指定します。
Invalidの場合のエレメントが表示されます。

//Javascript
$("#myform").validate({
   errorLabelContainer: "#messageBox",
   wrapper: "li",
   submitHandler: function() { alert("Submitted!") }
})
//Html
<ul id="messageBox"></ul> 
 <form id="myform" action="/login" method="post"> 
   <label>Firstname</label> 
   <input name="fname" class="required" /> 
   <label>Lastname</label> 
   <input name="lname" title="Your lastname, please!" class="required" /> 
   <br/>
   <input type="submit" value="Submit"/>
 </form>


■errorContainer

Invalid時に表示するエレメントを指定します(それ以外の時は非表示)。

$("#myform").validate({
   errorContainer: "#messageBox1, #messageBox2",
   errorLabelContainer: "#messageBox1 ul",
   wrapper: "li", debug:true,
   submitHandler: function() { alert("Submitted!") }
})


■showErrors

オリジナルのメッセージ表示コールバック関数を指定します。
コールバック関数には引数として、errorMap, errorListが渡されます。
これ以外にデフォルトのエラーメッセージも表示したい場合はthis.defaultShowErrors()を呼び出す必要があります。

$(".selector").validate({
   showErrors: function(errorMap, errorList) {
		$("#summary").html("Your form contains "
                                   + this.numberOfInvalids() 
                                   + " errors, see details below.");
		this.defaultShowErrors();
	}
 })


■errorPlacement

エラーメッセージを表示する場所を指定します。
デフォルトではエレメントのすぐ後に挿入されます。

//エレメントの後のtdに挿入する
$("#myform").validate({
  errorPlacement: function(error, element) {
     error.appendTo( element.parent("td").next("td") );
   },
   debug:true
 })


■success

Stringを設定した場合、Valid時に表示するメッセージのClassNameを設定します。
functionを設定した場合、Valid時に表示するメッセージに関する関数を設定します。

//stringの場合
$("#myform").validate({
   success: "valid",
   submitHandler: function() { alert("Submitted!") }
})
//functionの場合
$("#myform").validate({
   success: function(label) {
     label.addClass("valid").text("Ok!")
   },
   submitHandler: function() { alert("Submitted!") }
})


■highlight

Validate時にInvalidの入力項目に対する警告アニメーション等を関数で設定します。

//Invalidの要素をフェードアウト・インする
$(".selector").validate({
  highlight: function(element, errorClass) {
     $(element).fadeOut(function() {
       $(element).fadeIn()
     })
  }
})


■unhighlight

highlightによって変更された要素がValid時に行われるアニメーション等を関数で設定します。

$(".selector").validate({
  highlight: function(element, errorClass) {
     $(element).addClass(errorClass);
     $(element.form).find("label[for=" + element.id + "]")
                    .addClass(errorClass);
  },
  unhighlight: function(element, errorClass) {
     $(element).removeClass(errorClass);
     $(element.form).find("label[for=" + element.id + "]")
                    .removeClass(errorClass);
  }
});
jQuery Validate Pluginの拡張セレクタ


■:blank

入力項目が空白のエレメントオブジェクトを選択する。
(入力がスペースだけのエレメントも含まれる)

$("input:blank").css("background-color", "red");


■:filled

入力項目に値が含まれているエレメントオブジェクトを選択する。
(入力がスペースだけのエレメントは含まれない)

$("input:filled").css("background-color", "blue");


■:unchecked

:checkedの逆でcheckされていないエレメントオブジェクトを選択する。

function countUnchecked() {
	var n = $("input:unchecked").length;
	$("div").text(n + (n == 1 ? " is" : " are") + " unchecked!");
}
countUnchecked();
$(":checkbox").click(countUnchecked);
jQuery Validate Pluginのユーティリティ

■jQuery.validator.format( template, [argument], [argumentN...] )

templateで設定した文字列の{n}を[argument]で置き換える。

$("button").click(function () {
	var str = "Hello {0}, this is {1}";
	alert("'" + str + "'");
	str = jQuery.validator.format(str, "World", "Bob");
	alert("'" + str + "'");
});
//結果は以下のようになる
//alert('Hello {0}, this is {1}');
//alert('Hello World, this is Bob');
jQuery Validate PluginのValidatorオブジェクトのメソッド

■form( )

バリデートするフォームの結果をtrue or falseで返します。

result=$("#myform").validate().form();


■element( element )

バリデートするエレメントの結果をtrue or falseで返します。

result=$("#myform").validate().element( "#myselect" );


■resetForm( )

バリデートするフォームをリセットします。
バリデート時に追加されたclassなども外されます(バリデートエラーを表示させない)。

var validator = $("#myform").validate();
validator.resetForm();


■showErrors( errors )

オリジナルのエラーメッセージを表示します。
引数には表示するエレメントのnameをkey、メッセージをvalueとしたオブジェクトを指定します。

var validator = $("#myform").validate();
validator.showErrors({"firstname": "I know that your firstname is Pete, Pete!"});


■numberOfInvalids( )

validateした結果がfalseの項目数を返します。

var validator = $("#myform").validate({
  invalidHandler: function() {
    $("#summary").text(validator.numberOfInvalids() + " field(s) are invalid");
  }
});
jQuery Validate Pluginの基本設定関数

■setDefaults( defaultOptions )

Validateオブジェクトにデフォルトで設定するオプション値を設定します。

jQuery.validator.setDefaults({ 
    debug: true 
});


■addMethod( name, method, [message] )

オリジナルのValidationメソッドを追加します。引数はそれぞれ以下の通り。
・name … オリジナルメソッドの名前を指定します。
・method … オリジナルのValitation関数を指定します。関数には引数としてvalue(フォームの入力値), element(Validateするエレメント), [params](任意のパラメータ配列)が与えられます。
・message … Validate時のメッセージを指定します。jQuery.validator.format()で[params]の値を入れることも可能です。

//ドメインvalidate
jQuery.validator.addMethod("domain", function(value, element) { 
  return this.optional(element) || /^http:\/\/mycorporatedomain.com/.test(value); 
}, "Please specify the correct domain for your documents");
//2つの和の値と等しいかvalidate
jQuery.validator.addMethod("math", function(value, element, params) { 
 return this.optional(element) || value == params[0] + params[1]; 
}, jQuery.format("Please enter the correct value for {0} + {1}"));


■addClassRules( name, rules )

ValidateClassに対して個々にルールを設定します。

//class="name"のエレメントにclass="required" minlength="2"を追加する
jQuery.validator.addClassRules("name", {
  required: true,
  minlength: 2
});


■addClassRules( rules )

Validateルールを追加します。

jQuery.validator.addClassRules({
  name: {
    required: true,
    minlength: 2
  },
  zip: {
    required: true,
    digits: true,
    minlength: 5,
    maxlength: 5
  }
});
Validateルールに設定できるデフォルトのメソッド

■required( )

入力項目を必須にします。

$("#myform").validate({
  rules: {
    field: "required"
  }
});


■required( dependency-expression )

引数に指定したエレメントが選択された場合に、入力項目を必須にします。

//detailsチェックボックスがチェックされていたら入力必須にする
$("#myform").validate({
  rules: {
    details: {
      required: "#other:checked"
    }
  }, debug:true
});
$("#other").click(function() {
  $("#details").valid();
});


■required( dependency-callback )

引数に指定した関数がtrueを返した場合に、入力項目を必須にします。

//ageが13より小さい場合入力必須にする
$("#myform").validate({
  rules: {
    age: {
      required: true,
      min: 3
    },
    parent: {
      required: function(element) {
        return $("#age").val() < 13;
      }
    }
  }
});
$("#age").blur(function() {
  $("#parent").valid();
});


■remote( options )

Ajaxで別のファイルに接続し、返り値がfalse, undefined or nullの場合invalidとなる。

//check-email.phpの結果でvalidate
$("#myform").validate({
  rules: {
    email: {
      required: true,
      email: true,
      remote: {
        url: "check-email.php",
        type: "post",
        data: {
          username: function() {
            return $("#username").val();
          }
        }
      }
    }
  }
});


■minlength( length )

入力可能な最小の文字数を設定します。

//3文字以上
$("#myform").validate({
  rules: {
    field: {
      required: true,
      minlength: 3
    }
  }
});


■maxlength( length )

入力可能な最大の文字数を設定します。

//4文字以下
$("#myform").validate({
  rules: {
    field: {
      required: true,
      maxlength: 4
    }
  }
});


■rangelength( range )

入力可能な文字数の指定を配列でします。

//2文字以上6文字以下
$("#myform").validate({
  rules: {
    field: {
      required: true,
      rangelength: [2, 6]
    }
  }
});


■min( value )

入力可能な最小の数字を設定します。

//13以上の数字の場合OK
$("#myform").validate({
  rules: {
    field: {
      required: true,
      min: 13
    }
  }
});


■max( value )

入力可能な最大の数字を設定します。

//23以上の場合OK
$("#myform").validate({
  rules: {
    field: {
      required: true,
      max: 23
    }
  }
});


■range( range )

入力可能な数字の幅の指定を配列でします。

//13以上23以下の場合OK
$("#myform").validate({
  rules: {
    field: {
      required: true,
      range: [13, 23]
    }
  }
});


■email( )

Emailアドレスの形式で入力されているかチェックします。

$("#myform").validate({
  rules: {
    field: {
      required: true,
      email: true
    }
  }
});


■url( )

URLの形式で入力されているかチェックします。

$("#myform").validate({
  rules: {
    field: {
      required: true,
      url: true
    }
  }
});


■date( )

日付の形式で入力されているかチェックします。

//「2009/12/11」など
$("#myform").validate({
  rules: {
    field: {
      required: true,
      date: true
    }
  }
});


■dateISO( )

ISO日付形式で入力されているかチェックします。

//「20091211T104523+0900」など
$("#myform").validate({
  rules: {
    field: {
      required: true,
      dateISO: true
    }
  }
});


■number( )

数字のみが入力されているかチェックします(小数点・マイナスもOK)。

$("#myform").validate({
  rules: {
    field: {
      required: true,
      number: true
    }
  }
});


■digits( )

数字のみが入力されているかチェックします(整数のみ)。

$("#myform").validate({
  rules: {
    field: {
      required: true,
      digits: true
    }
  }
});


■creditcard( )

クレジットカード番号が入力されているかチェックします。

//「446-667-651-00」など
$("#myform").validate({
  rules: {
    field: {
      required: true,
      creditcard: true
    }
  }
});


■accept( [extension] )

fileフォームで指定した拡張子のファイルが選択されているかチェックします(「|」区切りで入力)。

//画像(GIF, JPG, PNG)のみ
$("#myform").validate({
  rules: {
    field: {
      required: true,
      accept: "gif|jpeg|jpg|png"
    }
  }
});


■equalTo( other )

他の項目と入力されている内容が等しいかチェックします(確認のため二度入力する項目など)。

$("#myform").validate({
  rules: {
    password: "required",
    password_again: {
      equalTo: "#password"
    }
  }
});

Validate 日本語環境用Plugin


Validate 日本語環境用Pluginっていうのは、冒頭にも書いたとおり、エラーメッセージ等の日本語ローカライズJSと「ひらがなのみ」等の日本語環境用ValidateメソッドJSを合わせたものです。
言わば、PluginのPlugin。


日本語ローカライズJSはこんな感じ。

jQuery.extend(jQuery.validator.messages, {
	required: "必須項目です",
	maxlength: jQuery.format("{0} 文字以下を入力してください"),
	minlength: jQuery.format("{0} 文字以上を入力してください"),
	rangelength: jQuery.format("{0} 文字以上 {1} 文字以下で入力してください"),
	email: "メールアドレスを入力してください",
	url: "URLを入力してください",
	dateISO: "日付を入力してください",
	number: "有効な数字を入力してください",
	digits: "0-9までを入力してください",
	equalTo: "同じ値を入力してください",
	range: jQuery.format(" {0} から {1} までの値を入力してください"),
	max: jQuery.format("{0} 以下の値を入力してください"),
	min: jQuery.format("{0} 以上の値を入力してください"),
	creditcard: "クレジットカード番号を入力してください"
});


で、日本語環境用Validateメソッドがこんな感じ。これは入らないヤツは消してOK。

//全角ひらがな・カタカナのみ
jQuery.validator.addMethod("kana", function(value, element) {
	return this.optional(element) || /^([ァ-ヶーぁ-ん]+)$/.test(value);
	}, "全角ひらがな・カタカナを入力してください"
);

//全角ひらがなのみ
jQuery.validator.addMethod("hiragana", function(value, element) {
	return this.optional(element) || /^([ぁ-ん]+)$/.test(value);
	}, "全角ひらがなを入力してください"
);

//全角カタカナのみ
jQuery.validator.addMethod("katakana", function(value, element) {
	return this.optional(element) || /^([ァ-ヶー]+)$/.test(value);
	}, "全角カタカナを入力してください"
);

//半角カタカナのみ
jQuery.validator.addMethod("hankana", function(value, element) {
	return this.optional(element) || /^([ァ-ン゙゚]+)$/.test(value);
	}, "半角カタカナを入力してください"
);

//半角アルファベット(大文字・小文字)のみ
jQuery.validator.addMethod("alphabet", function(value, element) {
	return this.optional(element) || /^([a-zA-z\s]+)$/.test(value);
	}, "半角英字を入力してください"
);

//半角アルファベット(大文字・小文字)もしくは数字のみ
jQuery.validator.addMethod("alphanum", function(value, element) {
	return this.optional(element) || /^([a-zA-Z0-9]+)$/.test(value);
	}, "半角英数字を入力してください"
);

//郵便番号(例:012-3456)
jQuery.validator.addMethod("postnum", function(value, element) {
	return this.optional(element) || /^\d{3}\-\d{4}$/.test(value);
	}, "郵便番号を入力してください(例:123-4567)"
);

//携帯番号(例:010-2345-6789)
jQuery.validator.addMethod("mobilenum", function(value, element) {
	return this.optional(element) || /^0\d0-\d{4}-\d{4}$/.test(value);
	}, "携帯番号を入力してください(例:010-2345-6789)"
);

//電話番号(例:012-345-6789)
jQuery.validator.addMethod("telnum", function(value, element) {
	return this.optional(element) || /^[0-9-]{12}$/.test(value);
	}, "電話番号を入力してください(例:012-345-6789)"
);

これをまとめたファイルがjquery.validate.japlugin.jsなので、以下のような感じで読み込めばOK。

<script type="text/javascript" src="./js/jquery.js"></script>
<script type="text/javascript" src="./js/jquery.validate.js"></script>
<script type="text/javascript" src="./js/jquery.validate.japlugin.js"></script>
jQuery Validate PluginとjQuery Form Pluginの連携


ようやくjQuery Form Pluginとの連携についてですが、すごく簡単。
Pluginファイルを読み込んで、validate(option)のオプション値のsubmitHandlerでajaxSubmit()を呼び出せばOKです。
ValidatorはデフォルトでValid時にフォームを送信してしまうのでonsubmit: falseを指定しておくといいんじゃないかと思います。

$(".selector").validate({
   submitHandler: function(form) {
   	$(form).ajaxSubmit();
   },
   onsubmit: false
})