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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- FormData API
- Constraint Validation API
- reportValidityとsetCustomValidity
- フォームリセットイベントと状態管理