div セレクターでエラー バブルのスタイルを設定できる理由は、Chrome 11/12 のバグであり、新しいバージョンで修正する必要があります。Chrome 12 (および Safari6 ではおそらく) でエラー バブルのスタイルを設定する疑似クラスがいくつかあります (::-webkit-validation-bubble など)。次のドキュメントで、疑似要素セレクターといくつかのスタイリング例を含む完全な HTML 構造を見つけることができます。
これは、HTML5 フォーム制約の検証に対する Webkit 拡張であり、非標準であることに注意してください。HTML5 検証をサポートするすべてのブラウザーでエラー メッセージのスタイルを設定する方法を使用する場合は、JavaScript を使用する必要があります。
これの重要な原則は、ハンドラーを無効なイベントに追加し (注: 無効なイベントはバブリングしません)、デフォルトの相互作用を防止する必要があるということです。これにより、ブラウザーのネイティブ エラー バブルが削除され、すべての HTML5 ブラウザーでスタイル設定可能なカスタム UI を実装できるようになります。
//Note: that we use true for useCapture, because invalid does not bubble
document.addEventListener('invalid', function(e){
//prevent the browser from showing his error bubble
e.preventDefault();
//now you can implement your own validation UI (showError is a Custom method which has to be implemented by you
showError(e.target, $.prop(e.target, 'validationMessage');
}, true);
上記のコードは、現在のフォーム内のすべての無効な要素に対して showError を呼び出します。最初の無効な要素に対してのみこれを行いたい場合は、次のことができます。
document.addEventListener('invalid', (function(){
var isFirst = true;
return function(e){
//prevent the browser from showing his error bubble
e.preventDefault();
//now you can implement your own validation UI
if(isFirst){
showError(e.target, $.prop(e.target, 'validationMessage');
//set isFirst to false
isFirst = false;
//reset isFirst to true, so user can try to submit invalid forms multiple times
setTimeout(function(){
isFirst = true;
}, 9);
}
};
})(), true);
サイトで jQuery を使用している場合は、webshims libを使用することをお勧めします。webshims lib は、すべてのブラウザー (IE6 を含む) で HTML5 制約の検証を実装し、単純なカスタムのスタイル設定可能な検証メッセージを生成するための単純な拡張機能を提供します。JS コードは次のようになります。
$(document).bind('firstinvalid', function(e){
$.webshims.validityAlert.showFor( e.target );
//prevent browser from showing native validation message
return false;
});
によって生成される HTML 構造は$.webshims.validityAlert.showFor
次のようになります。
<span class="validity-alert" role="alert">
<span class="va-arrow"><span class="va-arrow-box"></span></span>
<span class="va-box">Error message of the current field</span>
</span>