HTML5になってフォームバリデーションも強化されていますが、さらにJavaScriptやCSSなどから使うこともできます。
ご注意
ブラウザサイドのバリデーションは「ブラウザごとに対応・非対応がありうる」ということや「ユーザーレベルで書き換えが可能」ということもあるので、あくまで「サーバ送信せずにエラーをユーザーに伝えられる」、入力補助の機能と考えてください。サーバサイドのバリデーションに代わるものではありません。
HTMLサイド
制約のかかる<input type>
HTML5では指定できる<input>
のtype
も増えましたが、ものによっては指定できる値が決まっている(さらには、専用の入力フォームが用意される)ものがあります。
-
color
…#abcdef
形式での色指定 -
date
…日付 -
datetime-local
…日時 -
email
…メールアドレス -
month
…年月 -
number
…数値 -
range
…スライダーで目分量指定する値 -
time
…時間 -
url
…URL -
week
…週
専用のフォームが出てくるタイプではバリデーション以前に不適当な値の入力すらできませんが、email
やurl
はフリー入力なので不適当な入力も可能となってしまいます。
バリデーション属性
text
を筆頭として、入力フォームに特定の値を入力させるためのバリデーションをかけることができます。
-
required
…入力を必須にする -
pattern
…入力パターンの指定(text
など自由に入力できる系のみ) -
maxlength
…最長の長さの指定(自由に入力できる系のみ) -
minlength
…最短の長さの指定(自由に入力できる系のみ) -
max
…最大値(数値や日付系のみ) -
min
…最小値(数値や日付系のみ) -
step
…値の刻み(数値や日付系のみ)
これらのバリデーションに引っかかった場合、フォームのsubmit
は失敗します。ただし、iOS 10.2以下では、バリデーション自体は働くものの、送信が止まらないので要注意です。
CSS
バリデーションと関連したCSSセレクタが4つあります。
-
:required
…入力必須の入力要素にかかる -
:optional
…入力必須でない入力要素にかかる -
:valid
…バリデーションをクリアした入力要素にかかる -
:invalid
…バリデーションに失敗した入力要素にかかる
これらを使うことで、入力状況によってスタイルを変えることができます。
JavaScript
セレクタ
上で書いたCSSセレクタを、JavaScriptからも使って、たとえば:invalid
なフォーム要素をかき集める、というようなことができます。ただし、このセレクタはjQueryでは正式サポートしていないので要注意です。ネイティブなquerySelectorAll
などを使いましょう。
メソッド
<input>
や<form>
にある.checkValidity()
を呼び出すと、手動でバリデーションを回すことができます。また、setCustomValidity
で、JavaScriptからフォームをinvalid
にしてしまうことができます。
イベント
バリデーションに失敗した入力フォームは、invalid
イベントを起こします。ただ、このイベントはバブリングしないので、「フォームでまとめて取りたい」ような場合には、キャプチャを使う(formElement.addEventListener('invalid', function(){...}, true);
と第3引数にtrue
を入れる)必要があります。