0Pricing
HTML Academy · レッスン

reportValidityとsetCustomValidity

ブラウザーのバリデーションUIを表示し、カスタムエラーメッセージを設定します

「reportValidityとsetCustomValidity」はCoddyKit上の無料HTML Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはHTML Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 HTML Academyコースには全4レッスンが含まれています。

組み込みUXのための2つのAPI

Constraint Validation APIには、ブラウザー組み込みのバリデーションUIを操作する2つのメソッドがあります。reportValidityはツールチップを表示し、setCustomValidityは独自のエラーメッセージを指定します。この2つを組み合わせることで、ネイティブの表示方法を維持しながらメッセージをカスタマイズできます。

reportValidityとcheckValidityの違い

checkValidity()はUIへの副作用なしにtrueまたはfalseを返します。reportValidity()も同じチェックを行いますが、さらに最初の無効なフィールドにフォーカスし、ブラウザーのバリデーションツールチップを表示します。ネイティブUXをそのまま利用したい場合はreportValidityを選びます。

document.forms.signup.addEventListener("submit", (e) => {
  if (!e.target.reportValidity()) {
    e.preventDefault();
    // browser already focused first invalid field and showed tooltip
  }
});

プログラムによるバリデーション

複数ステップのウィザードでは、次に進む前に各ステップのフィールドをバリデーションします。if (step.reportValidity()) { next(); }のように記述します。ブラウザーがエラー表示を処理し、ユーザーは対応が必要なフィールドにフォーカスされるため、フォーカス管理を自分で再実装する必要がありません。

setCustomValidityによるメッセージの上書き

デフォルトメッセージ(「このフィールドに入力してください」)は、目的のトーンに合わない場合があります。input.setCustomValidity("Username is required")を使うと、デフォルトメッセージが指定したテキストに置き換わります。メッセージを消去するまで、入力項目は無効として扱われます。

独自メッセージの消去

input.setCustomValidity("")は独自のメッセージを削除し、通常のバリデーションを再び有効にします。再度バリデーションを行うたびに呼び出してください。そうしないと、ユーザーが問題を修正した後も古い独自メッセージが残ります。

input.addEventListener("input", () => {
  if (input.value.length < 3) {
    input.setCustomValidity("Must be at least 3 characters");
  } else {
    input.setCustomValidity("");
  }
});

非同期バリデーション

ユーザー名の重複やクーポンの有効性など、サーバーサイドでチェックする場合は、非同期レスポンスの後にsetCustomValidityを使います。const ok = await checkUsername(value); input.setCustomValidity(ok ? "" : "Already taken");のように記述します。ブラウザーは新しいvalidityの状態を直ちに反映します。

独自のエラーUIとの組み合わせ

独自のエラー表示を使いながらvalidityの追跡機能も利用するには、invalidイベントを監視し、e.preventDefault()を呼び出してネイティブのツールチップを抑制します。input.addEventListener("invalid", (e) => { e.preventDefault(); showError(input, input.validationMessage); })のように記述します。

複数の独自制約

setCustomValidityで設定できる独自メッセージは、一度に1つだけです。複数のルールを適用するには、それぞれをチェックし、優先順位に従って最も関連性の高いメッセージをsetCustomValidityに渡します。最初に失敗したルールのメッセージが表示されます。

組み込みバリデーションとの重複を避ける

空の必須フィールドに独自メッセージを設定すると、独自のメッセージとデフォルトメッセージが競合する可能性があります。フィールドごとにどちらか一方の方法を選んでください。組み込み制約を無効にして(type="email"の代わりにtype="text"を使い、setCustomValidityでバリデーションする)、独自の方法にするか、組み込み機能だけを利用します。

フォームレベルの独自バリデーション

パスワード確認の一致など、複数フィールドにまたがるバリデーションでは、関連するフィールドにsetCustomValidityを適用します。confirmInput.setCustomValidity(confirmInput.value === passInput.value ? "" : "Passwords do not match")のように記述します。両方が一致するまでフォームは無効です。

国際化

組み込みメッセージは、ユーザーの言語に基づいてブラウザーがローカライズします。setCustomValidityで設定する独自メッセージは、自分で適切な言語にする必要があります。navigator.languageまたは独自のi18nの状態を読み取り、対応する翻訳を指定してください。

テスト

DevToolsを開き、無効になるすべての経路を試してください。空のまま送信する場合、入力が不完全な場合、形式が一致しない場合、非同期チェックに失敗する場合を確認します。正しいメッセージが表示されること、問題を修正するとメッセージが消えること、有効なフォームを送信すると処理が進むことを検証してください。無効な形式の値の貼り付けやブラウザーの自動入力などのエッジケースも、個別にテストする必要があります。

理解度チェック

input.setCustomValidity("Already taken")を呼び出した後、入力項目が再び有効になったことをブラウザーに伝えるにはどうすればよいですか。

まとめ

reportValidityはブラウザー組み込みのバリデーションUI(フォーカスとツールチップ)を表示するため、プログラムによるチェックに最適です。setCustomValidityはデフォルトメッセージを独自のテキストで上書きします。有効な状態に戻ったら空文字列で消去してください。invalidイベントをpreventDefaultとともに監視すると、エラー表示を完全に独自のものにできます。複数フィールドにまたがるバリデーション、非同期チェック、ローカライズされた独自メッセージに利用できます。

よくある質問

「reportValidityとsetCustomValidity」レッスンは無料ですか?

はい。「reportValidityとsetCustomValidity」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、HTML Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 HTML Academyコースには全4レッスンが含まれています。

「reportValidityとsetCustomValidity」で何を学びますか?

ブラウザーのバリデーションUIを表示し、カスタムエラーメッセージを設定します ブラウザで直接実行するハンズオンコードでHTML Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

HTML Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのHTML Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「reportValidityとsetCustomValidity」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このHTML Academyレッスンでコードを書いて実行できますか?

はい。すべてのHTML Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. FormData API
  2. Constraint Validation API
  3. reportValidityとsetCustomValidity
  4. フォームリセットイベントと状態管理
← HTML Academyに戻る