MooToolsのForm.Validatorの足りないところを補う日本語環境向けaddAllThese。中身は殆どzeromailからの転載。
全角チェック、全てひらがな、全てカタカナ、全て全角数字、全て全角英数、日本語の有無、郵便番号、電話番号。
続きに郵便番号検索APIとの連携例と、Form.Validatorを搭載したメールフォームのデモがあります。
Form.Validator.addAllThese([ ['isJpOnly', { errorMsg:'全て半角英数の文字列は使用できません。', test: function(el){if(el.value.length == 0) return true; else return !el.get('value').test(/^[\x01-\x7e]+$/,'i');} } ], ['isNoAlp', { errorMsg:'全て全角で記入してください。', test:function(el){if(el.value.length == 0) return true; else return el.get('value').test(/^[^ -~。-゚]*$/);} } ], ['isHirakana', { errorMsg:'全てひらがなで記入してください。', test:function(el){if(el.value.length == 0) return true; else return el.get('value').test(/^[あ-ん]+$/,'i');} } ], ['isKatakana', { errorMsg:'全てカタカナで記入してください。', test:function(el){if(el.value.length == 0) return true; else return el.get('value').test(/^[ア-ン]+$/,'i');} } ], ['isZNum', { errorMsg:'全て全角数字で記入してください。', test:function(el){if(el.value.length == 0) return true; else return el.get('value').test(/^[0-9]+$/,'i');} } ], ['isZAlp', { errorMsg:'全て全角英数字で記入してください。', test:function(el){if(el.value.length == 0) return true; else return el.get('value').test(/^[0-9A-Z]+$/,'i');} } ], ['isKana', { errorMsg:'カタカナもしくはひらがなで記入してください。', test:function(el){if(el.value.length == 0) return true; else return el.get('value').test(/^[ア-ンあ-ん]+$/,'i');} } ], ['validate-zipcode', { errorMsg:'郵便番号の書式に誤りがあります。', test:function(el){if(el.value.length == 0) return true; else return el.get('value').test(/(^\d{3}\-\d{4}$)|(^\d{7}$)/);} } ], ['validate-tel', { errorMsg:'電話番号の書式に誤りがあります。', test:function(el){ var value = el.get('value'); if(value.length == 0) return true; if(el.get('value').test("-")){ if(value.test(/^(090|080|070)/)){ return value.test(/(^(090|080|070)(\-\d{4}\-\d{4})$)|(^[\d\-]{13}$)/); }else if(value.test(/^(0080|0120)/)){ return value.test(/(^0120(\-\d{2,3}\-\d{3,4}|[\d\-]{12})$)|(^0080\-\d{3}\-\d{4}$)/); }else{ return value.test(/(^\d{2,5}?\-\d{1,4}?\-\d{4}$|^[\d\-]{12}$)/); } }else{ if(value.test(/^(090|080|070)/)){ return value.test(/^(090|080|070)\d{8}$/); }else if(value.test(/^(0080|0120)/)){ return value.test(/(^0120\d{6}$)|(^0080\d{7}$)/); }else{ return value.test(/^\d{10}$/); } } } } ] ]);
電話番号の正規表現修正
郵便番号検索との連携
バリデータをクリアしたら郵便番号検索APIにリクエストを送信して住所を表示する。
APIは大抵JSONPなのでMoreのRequest.JSONPが必要。
下記サンプルはここの郵便番号検索APIを利用した場合のソースです。
HTMLはZeroMailのメールフォームから一部抜粋。
<tr> <th scope="row"><label id="zipcode">郵便番号</label></th> <td><input name="zipcode" type="text" id="zipcode" size="50" tabindex="4" class="validate-zipcode" /></td> </tr> <tr> <th scope="row"><label for="address">住所</label></th> <td><input name="address" type="text" id="address" size="50" tabindex="5" /></td> </tr>
['validate-zipcode', { errorMsg:'郵便番号の書式に誤りがあります。', test:function(el){ if(el.value.length == 0){ return true; }else if(el.get('value').test(/(^\d{3}\-\d{4}$)|(^\d{7}$)/)){ new Request.JSONP({ noCache:true, url: 'http://zipcloud.ibsnet.co.jp/api/search?zipcode='+el.get("value")+"&callback=Request.JSONP.request_map.request_0", onRequest:function(){ $$(".address-box").fade(0.3).setProperty('readonly','readonly'); }, onComplete: function(obj){ if($type(obj.results)=="array") $$(".address-box").set("value",obj.results[0].address1+obj.results[0].address2+obj.results[0].address3).removeProperty('readonly').fade(1); else $$(".address-box").fade(1).removeProperty('readonly'); } }).send(); return true; } } } ]
メールフォームへの実装例
CSSとXHTMLはZeroMailのデフォルトのやつです。