Kodokon kodokon.com

高度なフォームとネイティブのバリデーション

required、pattern、inputmode、そしてConstraint Validation APIを活用し、外部ライブラリなしで堅牢なフォームを作ります。

10 分 · 3 問

このレッスンを Kodokon で開く

ブラウザには完全なバリデーションエンジンが備わっているのに、多くのチームが習慣でそれをJavaScriptで再実装しています。構成要素はこうです: required(必須フィールド)、形式を検証する型(emailurldate)、minlength/maxlength、数値のための min/max/step、そして正規表現を受け取る pattern。重要な点: pattern暗黙的にアンカーされます。正規表現が ^$ で囲まれているかのように、値全体が一致しなければなりません。標準化された値(postal-codeemailtel)を使って autocomplete を付け加えましょう。これはUXでもありアクセシビリティでもあります。

HTML
<label for="zip">Postal code</label>
<input id="zip" name="zip" type="text"
       required pattern="[0-9]{5}"
       inputmode="numeric"
       autocomplete="postal-code">
ネイティブのバリデーション: 形式、必須、適したキーボード

inputmode 属性はしばしば誤解されています。これは何も検証しません。モバイルのシステムに、どの仮想キーボードを表示するか(numerictelemaildecimalsearch)を伝えるだけです。だからこそ type="text" + inputmode="numeric" + pattern の組み合わせが、数字コードに推奨されるパターンなのです。type="number" の挙動を引き継ぐことなく、適切なキーボードが得られます。

CSS
input:user-invalid {
  border: 2px solid #b3261e;
}
input:user-valid {
  border: 2px solid #1b5e20;
}
:user-invalid はユーザーが操作した後にだけ効く

CSS側では、:invalid よりも :user-invalid を優先しましょう。前者はページの読み込みと同時に適用され、ユーザーがまだ触れてもいないフィールドを赤く塗ってしまいます。JavaScript側では、Constraint Validation APIが道具立てを仕上げます。checkValidity() がチェックを起動し、validity オブジェクトが正確な原因(patternMismatchvalueMissingtooShort)を明らかにし、setCustomValidity() を使えばブラウザの一般的なメッセージを自分のものに置き換えられます。

JAVASCRIPT
const zip = document.querySelector("#zip");
zip.addEventListener("input", () => {
  if (zip.validity.patternMismatch) {
    zip.setCustomValidity("Enter 5 digits.");
  } else {
    zip.setCustomValidity("");
  }
});
バリデーションAPIによるカスタムメッセージ

理解度チェック

このレッスンの要点をしっかり覚えているか確認しましょう。

  1. inputmode="numeric" は正確には何をしますか?
    • 数字以外の入力をすべて拒否する
    • フィールドの値を数値に変換する
    • 何も検証せず、モバイルで数字キーボードを提案する
  2. pattern="[0-9]{5}" のとき、値 "abc12345" は受け入れられますか?
    • はい。連続する5桁の数字を含んでいるから
    • いいえ。patternは値全体の一致を要求するから
    • はい。フィールドがrequiredでなければ
  3. エラーのスタイル付けで、なぜ :invalid より :user-invalid を優先するのですか?
    • :user-invalid はユーザーが操作した後にだけ適用される
    • :invalid は最近のブラウザでサポートされていない
    • :user-invalid は無効化されたフィールドも検証する