web-dev-qa-db-ja.com

jQueryは、デフォルトの検証エラーメッセージ表示(Css)のようなポップアップ/ツールチップをオーバーライドします

デフォルトのエラーメッセージラベルをラベルではなくdivで上書きしようとしています。 この投稿 も見て、その方法を理解しましたが、CSSの制限に悩まされています。これらの例のいくつかのようにこれをどのように表示できますか:

例#1(Dojo) -エラー表示を表示するには、無効な入力を入力する必要があります
例#2

エラーラベルをdiv要素にオーバーライドするコードの例を次に示します

$(document).ready(function(){
            $("#myForm").validate({
                rules: {
                    "elem.1": {
                        required: true,
                        digits: true
                    },
                    "elem.2": {
                        required: true
                    }
                },
                errorElement: "div"
            });                  
        });

今私はCSSの部分で迷っていますが、ここにあります:

div.error {
        position:absolute;
        margin-top:-21px;
     margin-left:150px;
     border:2px solid #C0C097;
        background-color:#fff;
        color:white;
        padding:3px;
        text-align:left;
        z-index:1;
        color:#333333;
     font:100% arial,helvetica,clean,sans-serif;
     font-size:15px;
     font-weight:bold;  
    }

更新:

さて、このコードを使用していますが、画像とポップアップ上の配置が境界線よりも大きくなっています。これは高さが動的になるように調整できますか?

if (element.attr('type') == 'radio' || element.attr('type') == 'checkbox') {
   element = element.parent();

   offset = element.offset();
   error.insertBefore(element)
   error.addClass('message');  // add a class to the wrapper
   error.css('position', 'absolute');
   error.css('left', offset.left + element.outerWidth());
   error.css('top', offset.top - (element.height() / 2)); // Not working for Radio, displays towards the bottom of the element. also need to test with checkbox
} else {
   // Error placement for single elements
   offset = element.offset();
   error.insertBefore(element)
   error.addClass('message');  // add a class to the wrapper
   error.css('position', 'absolute');
   error.css('left', offset.left + element.outerWidth());
   error.css('top', offset.top - (element.height() / 2));
}

cssは以下と同じです(cssコード)

HTML

<span>
<input type="radio" class="checkbox" value="P" id="radio_P" name="radio_group_name"/>
<label for="radio_P">P</label>
<input type="radio" class="checkbox" value="S" id="radio_S" name="radio_group_name"/>
<label for="radio_S">S</label>
</span>
69
Phill Pafford

errorPlacement オプションを使用して、小さなcssでエラーメッセージの表示を上書きできます。 cssだけでは、必要な効果を得るのに十分ではないからです。

$(document).ready(function(){
    $("#myForm").validate({
        rules: {
            "elem.1": {
                required: true,
                digits: true
            },
            "elem.2": {
                required: true
            }
        },
        errorElement: "div",
        wrapper: "div",  // a wrapper around the error message
        errorPlacement: function(error, element) {
            offset = element.offset();
            error.insertBefore(element)
            error.addClass('message');  // add a class to the wrapper
            error.css('position', 'absolute');
            error.css('left', offset.left + element.outerWidth());
            error.css('top', offset.top);
        }

    });
});

Leftおよびtopのcss属性を使用して、要素の上下左右にエラーメッセージを表示できます。たとえば、上部にエラーを表示するには:

    errorPlacement: function(error, element) {
        element.before(error);
        offset = element.offset();
        error.css('left', offset.left);
        error.css('top', offset.top - element.outerHeight());
    }

等々。その他のオプションについては、 cssに関するjQueryドキュメント を参照してください。

これが私が使用したcssです。結果は、希望どおりになります。できるだけ少ないCSSで:

div.message{
    background: transparent url(msg_arrow.gif) no-repeat scroll left center;
    padding-left: 7px;
}

div.error{
    background-color:#F3E6E6;
    border-color: #924949;
    border-style: solid solid solid none;
    border-width: 2px;
    padding: 5px;
}

必要な背景画像は次のとおりです。

alt text
(ソース: scriptiny.com

オプションまたはフィールドのグループの後にエラーメッセージを表示する場合。次に、1つのコンテナ内のすべての要素を「div」または「fieldset」にグループ化します。たとえば、すべてのグループに特別なクラスを追加します。そして、以下をerrorPlacement関数の先頭に追加します:

errorPlacement: function(error, element) {
    if (element.hasClass('group')){
        element = element.parent();
    }
    ...// continue as previously explained

特定のケースのみを処理する場合は、代わりにattrを使用できます。

if (element.attr('type') == 'radio'){
    element = element.parent();
}

これで、親要素の横にエラーメッセージが表示されます。

親要素の幅を100%未満に変更する必要がある場合があります。


私はあなたのコードを試してみましたが、私にとっては完璧に機能しています。プレビューは次のとおりです。 alt text

行に収まるように、メッセージのパディングを非常にわずかに調整しました。

div.error {
    padding: 2px 5px;
}

これらの数値を変更して、上/下または左/右のパディングを増減できます。エラーメッセージに高さと幅を追加することもできます。それでも問題が解決しない場合は、スパンをdivに置き換えてみてください

<div class="group">
<input type="radio" class="checkbox" value="P" id="radio_P" name="radio_group_name"/>
<label for="radio_P">P</label>
<input type="radio" class="checkbox" value="S" id="radio_S" name="radio_group_name"/>
<label for="radio_S">S</label>
</div>

そして、コンテナに幅を与えます(これは非常に重要です)

div.group {
    width: 50px; /* or any other value */
}

空白ページについて。私が言ったように、私はあなたのコードを試しましたが、それは私のために働いています。問題を引き起こしているのは、コード内の他の何かかもしれません。

186
Nadia Alramli

jQuery BeautyTips を使用して、あなたが話している小さなバブル効果を実現します。 Validationプラグインを使用していないのであまり役に立ちませんが、BeautyTipsのスタイル設定と表示は非常に簡単です。調べてください。単純にCSSルールほど単純ではありません。canvas要素を使用して、IEでNiceを再生するために追加のjavascriptファイルを含める必要があるためです。

3

残念ながら、初心者の評判についてコメントすることはできませんが、画面が空白になる問題の解決策があります。または、少なくともこれでうまくいきました。 errorPlacement関数内でラッパークラスを設定する代わりに、ラッパータイプを設定するときにすぐに設定します。

$('#myForm').validate({
    errorElement: "div",
    wrapper: "div class=\"message\"",
    errorPlacement: function(error, element) {
        offset = element.offset();
        error.insertBefore(element);
        //error.addClass('message');  // add a class to the wrapper
        error.css('position', 'absolute');
        error.css('left', offset.left + element.outerWidth() + 5);
        error.css('top', offset.top - 3);
    }

});

このようにすることで、バリデーターはすべての要素ではなく、どのdiv要素を削除するかを知ることができると想定しています。私のために働いたが、なぜだかよくわからないので、誰かがそれを精巧に作って他の人を助けてくれるかもしれない。

2
user269036

いくつかのこと:

まず、デフォルトでチェックされているフィールドの1つだけを持っている可能性があるため、ラジオフィールドセットの検証エラーは本当に必要ないと思います。ほとんどの人は、何かを修正してから何かを提供したいと考えています。例えば:

   Age: (*) 12 - 18 | () 19 - 30 | 31 - 50 

人はデフォルトにしたくないので、正しい答えに変更される可能性が高くなります。空白の場合は、「あなたのビジネスはどれも」と考えてスキップする可能性が高くなります。

第二に、位置決めプロパティなしであなたが望んでいると思う効果を得ることができました。エラーに十分なスペースを確保し、エラーがその領域に収まることを確認するために、フォーム(またはフォームのdiv)にpadding-rightを追加するだけです。次に、「error」と呼ばれる事前設定されたcssクラスがあり、おおよそ入力フィールドの高さの負のマージン上部と、左からパディング右までの距離について左マージンを持つように設定します。開始する必要があります。私はこれを試しましたが、それは素晴らしいことではありませんが、3つのプロパティで動作し、フロートや絶対値を必要としません:

   <style type="text/css">
    .error {
        width: 13em; /* Ensures that the div won't exceed right padding of form */
        margin-top: -1.5em;  /*Moves the div up to the same level as input */
        margin-left: 11em;   /*Moves div to the right */
        font-size: .9em;     /*Makes sure that the error div is smaller than input */
    }

   <form>
   <label for="name">Name:</label><input id="name" type="textbox" />
   <div class="error"><<< This field is required!</div>
   <label for="numb">Phone:</label><input id="numb" type="textbox" />
   <div class="error"><<< This field is required!</div>
   </form>
2
Anthony

その答えは本当に助けになりました。私の場合、いくつかの要素を除外し、それらのエラーdivに特別な制限を設けなければなりませんでした。

errorPlacement:function(error,element) {
    if (element.attr("id") == "special_element") {
        // special align
    } else { // default error scheme
        error.insertAfter(element);
    }
}
2
Rodrigo

.validateメソッドに次のcssを追加して、cssまたは機能を変更します

 errorElement: "div",
    wrapper: "div",
    errorPlacement: function(error, element) {
        offset = element.offset();
        error.insertAfter(element)
        error.css('color','red');
    }
1
ajaysoni98292

ラベルをdivに置き換える必要がある理由について何らかの理由を提供できれば、それは確かに役立つでしょう...

また、参考になるサンプルを貼り付けていただけますか( http://dpaste.com/ または http://Pastebin.com/

0
weisjohn