コアポイント:
pattern
およびrequired
を使用して、フォーム要素の有効な入力範囲を定義できます。ブラウザがこれらのプロパティをサポートしていない場合、その値はJavaScriptの互換性ポピュレーターの基礎として使用できます。 aria-invalid
属性を使用して、フィールドが無効であるかどうかを示すことができます。このプロパティはアクセシビリティ情報を提供し、CSSフックとして使用して、無効なフィールドを視覚的に示すことができます。 instantValidation()
フィールドをテストし、実際の検証を実行し、aria-invalid
属性を制御してフィールドのステータスを示します。この関数は、onchange
イベントにバインドして、リアルタイムフォームの検証を提供できます。 HTML5は、ブラウザーベースのフォーム検証を実装するためのいくつかの新しいプロパティを導入します。 pattern
プロパティは、テキストエリア要素とほとんどの入力タイプの有効な入力範囲を定義する正規表現です。 required
属性フィールドが必要かどうかを指定します。これらのプロパティをサポートしていない古いブラウザの場合、互換性フィラーの基礎としてその値を使用できます。また、それらを使用して、より興味深い拡張機能、つまりリアルタイムフォームの検証を提供することもできます。
通常の閲覧動作を混乱させ、ユーザー操作を妨げないように、検証を乱用しないことに注意する必要があります。たとえば、 tabキーを使用して無効なフィールドを離れることができないいくつかのフォームを見てきました-JavaScriptが使用され(より正確には虐待されています)、有効になるまでフィールド内に留まるように焦点を当てます。これはユーザーエクスペリエンスにとって非常に不利であり、アクセシビリティガイドラインに直接違反しています。
この記事では、あまり侵襲性の低い実装方法を紹介します。それは完全なクライアントの検証でさえありません - それはアクセス可能な方法で実装されたわずかなユーザーエクスペリエンスエンハンスメントであり、スクリプトをテストしたとき、それはFirefoxの現在のネイティブの実装とほぼ同じことがわかりました!
基本コンセプト
Firefoxの最新バージョンでは、必要なフィールドが空であるか、その値がパターンと一致しない場合、フィールドは次の図に示すように赤い境界を表示します。
もちろん、これはすぐには起こりません。これが発生した場合、必要なフィールドごとにボーダーがデフォルトで表示されます。代わりに、これらの境界線は、フィールドとやり取りした後にのみ表示されます。これは、基本的には(正確ではありませんが)
したがって、
トリガーイベントとしてonchange
を使用します。または、フィールド内の値を入力または貼り付ける限り発射するoninput
イベントを使用できます。しかし、これは本当に「瞬時」です。なぜなら、迅速に連続して入力しながら簡単に繰り返しトリガーできるため、ちらつき効果が発生し、一部のユーザーに退屈または気を散らすことができます。そして、とにかく、oninput
はプログラミング入力からトリガーされず、onchange
はトリガーされます。サードパーティのプラグインからのオートコンプリートなどの操作を処理するためにそれが必要になる場合があります。
htmlとcss
を定義します私たちの実装を見てみましょう。
<form action="#" method="post"> <fieldset> <legend><strong>Add your comment</strong></legend> <p> <label for="author">Name <abbr title="Required">*</abbr></label> <input aria-required="true" id="author" name="author" pattern="^([- \w\d\u00c0-\u024f]+)$" required="required" size="20" spellcheck="false" title="Your name (no special characters, diacritics are okay)" type="text" value="" > </p> <p> <label for="email">Email <abbr title="Required">*</abbr></label> <input aria-required="true" id="email" name="email" pattern="^(([-\w\d]+)(\.[-\w\d]+)*@([-\w\d]+)(\.[-\w\d]+)*(\.([a-zA-Z]{2,5}|[\d]{1,3})){1,2})$" required="required" size="30" spellcheck="false" title="Your email address" type="email" value="" > </p> <p> <label for="website">Website</label> <input id="website" name="website" pattern="^(http[s]?:\/\/)?([-\w\d]+)(\.[-\w\d]+)*(\.([a-zA-Z]{2,5}|[\d]{1,3})){1,2}(\/([-~%\.\(\)\w\d]*\/*)*(#[-\w\d]+)?)?$" size="30" spellcheck="false" title="Your website address" type="url" value="" > </p> <p> <label for="text">Comment <abbr title="Required">*</abbr></label> <textarea aria-required="true" cols="40" id="text" name="text" required="required" rows="10" spellcheck="true" title="Your comment" ></textarea> </p> </fieldset> <fieldset> <input name="preview" type="submit" value="Preview"> <input name="save" type="submit" value="Submit Comment"> </fieldset> </form>
属性を持つフィールドには、新しい入力タイプをサポートしていない支援技術のフォールバックセマンティクスを提供するためのrequired
属性もあります。 aria-required
属性も定義します。これは、フィールドが無効であるかどうかを示すために使用します(HTML5には同等の属性はありません)。 aria-invalid
プロパティは明らかにアクセシビリティ情報を提供しますが、赤い境界線を適用するためのCSSフックとして使用することもできます。
aria-invalid
input[aria-invalid="true"], textarea[aria-invalid="true"] { border: 1px solid #f00; box-shadow: 0 0 4px 0 #f00; }
(IE8など)をサポートしていないことはありません。 box-shadow
box-shadow
を追加します 静的コードができたので、スクリプトを追加できます。まず、基本的な
関数が必要です:
addEvent()
function addEvent(node, type, callback) { if (node.addEventListener) { node.addEventListener(type, function(e) { callback(e, e.target); }, false); } else if (node.attachEvent) { node.attachEvent('on' + type, function(e) { callback(e, e.srcElement); }); } }
属性を備えていることをテストするだけです。
pattern
最初の2つの条件は冗長のように見えるかもしれませんが、要素のrequired
および
function shouldBeValidated(field) { return ( !(field.getAttribute("readonly") || field.readonly) && !(field.getAttribute("disabled") || field.disabled) && (field.getAttribute("pattern") || field.getAttribute("required")) ); }
属性に対してdisabled
readonly
を返します(ポイント属性は、スクリプトを介して状態セットのみに一致します)。 readonly="readonly"
readonly
これらのユーティリティが発生したら、フィールドをテストする主な検証関数を定義し、必要に応じて実際の検証を実行できます。
undefined
したがって、フィールドが必要であるが値がない場合、またはパターンと値があるが、値はパターンと一致しない場合、フィールドは無効です。
パターンは既に正規表現の文字列形式を定義しているため、文字列を
コンストラクターに渡すだけで、その値をテストできる正規表現オブジェクトが作成されます。ただし、Regex自体が空の文字列を考慮する必要がないように、値が空でないことを確認するために、値を事前テストする必要があります。function instantValidation(field) { if (shouldBeValidated(field)) { var invalid = (field.getAttribute("required") && !field.value) || (field.getAttribute("pattern") && field.value && !new RegExp(field.getAttribute("pattern")).test(field.value)); if (!invalid && field.getAttribute("aria-invalid")) { field.removeAttribute("aria-invalid"); } else if (invalid && !field.getAttribute("aria-invalid")) { field.setAttribute("aria-invalid", "true"); } } }
フィールドが無効かどうかを判断したら、ステータスを示すためにそのaria-invalid
プロパティを制御できます - それをまだプロパティを持っていない無効なフィールドに追加するか、プロパティを削除した有効なフィールドからで。とてもシンプル!最後に、これが機能するためには、検証関数をonchange
イベントにバインドする必要があります。このように簡単にする必要があります:
ただし、これが機能するためには、イベントがバブルアップする必要があります(イベントデリゲートとして一般的に知られているテクノロジーを使用)が必要ですが、インターネットエクスプローラー8以前では、
<form action="#" method="post"> <fieldset> <legend><strong>Add your comment</strong></legend> <p> <label for="author">Name <abbr title="Required">*</abbr></label> <input aria-required="true" id="author" name="author" pattern="^([- \w\d\u00c0-\u024f]+)$" required="required" size="20" spellcheck="false" title="Your name (no special characters, diacritics are okay)" type="text" value="" > </p> <p> <label for="email">Email <abbr title="Required">*</abbr></label> <input aria-required="true" id="email" name="email" pattern="^(([-\w\d]+)(\.[-\w\d]+)*@([-\w\d]+)(\.[-\w\d]+)*(\.([a-zA-Z]{2,5}|[\d]{1,3})){1,2})$" required="required" size="30" spellcheck="false" title="Your email address" type="email" value="" > </p> <p> <label for="website">Website</label> <input id="website" name="website" pattern="^(http[s]?:\/\/)?([-\w\d]+)(\.[-\w\d]+)*(\.([a-zA-Z]{2,5}|[\d]{1,3})){1,2}(\/([-~%\.\(\)\w\d]*\/*)*(#[-\w\d]+)?)?$" size="30" spellcheck="false" title="Your website address" type="url" value="" > </p> <p> <label for="text">Comment <abbr title="Required">*</abbr></label> <textarea aria-required="true" cols="40" id="text" name="text" required="required" rows="10" spellcheck="true" title="Your comment" ></textarea> </p> </fieldset> <fieldset> <input name="preview" type="submit" value="Preview"> <input name="save" type="submit" value="Submit Comment"> </fieldset> </form>
。これらのブラウザを無視することを選択できますが、特に問題を解決しやすい場合は、それは残念だと思います。コードがもう少し複雑であることを意味します。入力とテキストの領域要素のコレクションを取得し、それらを繰り返してonchange
イベントを個別にバインドする必要があります。
onchange
結論と見通しonchange
input[aria-invalid="true"], textarea[aria-invalid="true"] { border: 1px solid #f00; box-shadow: 0 0 4px 0 #f00; }
このスクリプトが実装された後、実際にほんの数ステップで完全な互換性フィラープログラムを完了することができます。このようなスクリプトはこの記事の範囲を超えていますが、それをさらに開発したい場合、すべての基本的なモジュールは、フィールドを検証する必要があるかどうかをここにテストします。 、およびバインディングトリガーイベント。 私は認めなければなりません、それが本当に価値があるかどうかはわかりません!すでにこの拡張機能(IE7およびすべての最新のブラウザで動作している)があり、サーバー側の検証を実装する以外に選択肢がないことを考慮して、
およびのブラウザのサポートがあると考えてください提出前の検証に使用しました - これらすべてを念頭に置いて、別の互換性フィラーを追加する必要がありますか?
required
(リアルタイム検証に関するFAQセクションはここに追加できます。コンテンツは元のドキュメントのFAQセクションと同じです)
以上がJavaScriptを使用したインスタントフォーム検証の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。