7

作業中のプロジェクトのフレームワークとしてTwitterのBootstrapを使用しています。jQuery Validateプラグインを使用して簡単な連絡フォームを検証しようとしていますが、いくつかの問題が発生しています。

各フォームの入力の親divにErrorクラスまたはValidクラスを追加しようとしています。これが私のフォームコードです:

 <form id="msg-form" class="">
    <fieldset>
        <div class="input-prepend control-group pull-left">
            <span class="add-on">@</span>
            <input class="span3 required email" id="inputEmail" name="msg-email" type="text" placeholder="example@example.com">
        </div>
        <div class="input-prepend control-group pull-left">
            <span class="add-on"><i class="icon-user"></i></span>
            <input class="span3 required" id="inputName" name="msg-name" type="text" placeholder="Joe Bloggs">
        </div>
        <div class="input-prepend control-group">
            <span class="add-on" style="height: 53px;"><i class="icon-pencil"></i></span>
            <textarea class="span3 required" id="textarea" name="msg-comments" rows="2" style="height: 53px" placeholder="Just say hi, or tell us how we can help"></textarea>
        </div>
        <button type="submit" class="btn pull-right">Submit<i class="icon-chevron-right"></i></button>
    </fieldset>
</form> 

ご覧のとおり、私のdiv.control-groupは、クラスを追加したいdivです。ハイライト(ここで提案されているように、これは単に機能しませんでした)とerrorPlacement(以下を参照)を使用しようとしましたが、正しく実行していません。

理想的には、プラグインが提供する優れた機能を維持できるように、キーアップ時にクラスを追加/削除する必要があります。この単純なコードは機能しますが、クラスを削除せず、フォームの送信時にのみ機能します。

$("#msg-form").validate({
    errorPlacement: function(error, element) {
        $(element).parent('div').addClass('error');
    }
});

誰かがこれを達成するために私が使用すべきオプションを提案できますか?!

よろしくお願いします-必要に応じて追加の詳細を提供できます!

4

3 に答える 3

13

highlightおよびunhighlight関数を使用してみてください。

$("#msg-form").validate({
    highlight: function(element) {
        $(element).parent('div').addClass('error');
    },
    unhighlight: function(element) {
        $(element).parent('div').removeClass('error');
    }
});
于 2012-05-03T13:10:41.297 に答える
4

jquery検証を使用して検証エラーが発生した場合の親divへのクラスの追加に関する私の回答から、この質問に対する既存の回答に価値が追加されると信じているため...

バリデーター設定へのアクセス

settingsビジネスの最初の順序は、フォームのバリデーターでオブジェクトを変更することです。これは、次のいずれかの方法で実行できます。

  1. を呼び出すことにより、フォームがすべてのフォームにロードされる前jQuery.validator.setDefaults()
  2. オプションを渡してフォームを初期化する場合.validate([options])
  3. フォーム上でバリデーターオブジェクトを見つけて初期化した後、$("form").data("validator").settings

MVCを使用しているため、控えめな検証によってフォームが自動的に初期化されるため、オプション#2は問題外です。それでは、今後オプション3を使用しましょう。ここでの目標は、フォームの設定をカスタマイズできるようにすることだけです。

デフォルトの動作を上書きする

変更するデフォルトのメソッドはhighlight、であり、無効なフィールドunhighlight強調表示するか、強調表示オプションによって行われた変更を元に戻します。ソースコードによるデフォルトの動作は次のとおりです。

highlight: function( element, errorClass, validClass ) {
    if ( element.type === "radio" ) {
        this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
    } else {
        $( element ).addClass( errorClass ).removeClass( validClass );
    }
},
unhighlight: function( element, errorClass, validClass ) {
    if ( element.type === "radio" ) {
        this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
    } else {
        $( element ).removeClass( errorClass ).addClass( validClass );
    }
}

したがって、ここにもいくつかのオプションがあります。

  1. それらの関数を完全に置き換えて、自分で記述してください
  2. これらの関数をラップして通常のように呼び出しますが、前後に独自のカスタムコードを追加します。

オプション1-卸売りを交換

このルートはとても簡単です。そこに好きなものを書いてください。たぶんソースコードからシードするかもしれませんし、あなた自身のことをするかもしれません。

var valSettings = $("form").data("validator").settings
valSettings.highlight = function(element, errorClass, validClass) { ... }
valSettings.unhighlight = function(element, errorClass, validClass) { ... }

オプション2-ラップ関数

これは邪魔にならないので、ほとんどの場合おそらく好ましいでしょう。

最終的にはの値を置き換えるためvalSettings.highlight、元の関数のクリーンな元のバージョンにアクセスする必要があります。自分で保存するか、グローバルデフォルトから1つ取得することができます

// original highlight function
var highlightOriginal = $("form").data("validator").settings.highlight;
var highlightDefaults = $.validator.defaults.highlight

JavaScript関数のラッピングに関しては、ここここ、およびここにいくつかの例があります)。これらの1つを解析した例を次に示します。これthisは、関数呼び出し間でコンテキストをバインドし、渡される引数のアリティを維持し、戻り値を保持するのに役立ちます。

function wrap(functionToWrap, beforeFunction) {
    return function () {
        var args = Array.prototype.slice.call(arguments),
        beforeFunction.apply(this, args);
        return functionToWrap.apply(this, args);
    };
};

次に、呼び出しが行われるたびに起動する追加の動作をすばやく定義する必要もあります。divこの場合、要素に最も近い親を見つけて、次のようにクラスを更新しましょう。

function highlightDecorator(element, errorClass, validClass) {
    $(element).closest("div").addClass(errorClass).removeClass(validClass);
}

それをすべてまとめる (私がそこで何をしたかを見てください)

$(function () {
  var valSettings = $("form").data("validator").settings
  valSettings.highlight = wrap($.validator.defaults.highlight, highlightDecorator)
  valSettings.unhighlight = wrap($.validator.defaults.unhighlight, unhighlightDecorator)
});

function wrap(functionToWrap, beforeFunction) {
  return function () {
    var args = Array.prototype.slice.call(arguments);
    beforeFunction.apply(this, args);
    return functionToWrap.apply(this, args);
  };
};

function highlightDecorator(element, errorClass, validClass) {
  $(element).closest("div").addClass(errorClass).removeClass(validClass);
}
function unhighlightDecorator(element, errorClass, validClass) {
  $(element).closest("div").addClass(validClass).removeClass(errorClass);
}

したがって、上記のすべての関数を組み合わせると、次のようになります。

スタックスニペットとjsFiddleでの作業デモ

$(function () {
  var valSettings = $("form").data("validator").settings
	valSettings.highlight = wrap($.validator.defaults.highlight, highlightDecorator)
  valSettings.unhighlight = wrap($.validator.defaults.unhighlight, unhighlightDecorator)
});

function wrap(functionToWrap, beforeFunction) {
  return function () {
    var args = Array.prototype.slice.call(arguments);
    beforeFunction.apply(this, args);
    return functionToWrap.apply(this, args);
  };
};

function highlightDecorator(element, errorClass, validClass) {
  $(element).closest("div").addClass(errorClass).removeClass(validClass);
}
function unhighlightDecorator(element, errorClass, validClass) {
  $(element).closest("div").addClass(validClass).removeClass(errorClass);
}
input.input-validation-error  {
  border: solid 1px red;
}
.input-validation-error label {
  color: red;
}
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.16.0/jquery.validate.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.6/jquery.validate.unobtrusive.min.js"></script>
    
<form action="/Person" method="post">
  
  <div class="required">
    <label for="Name">Name <em>*</em></label>           
    <input id="Name" name="Name" type="text" value="" 
           data-val="true" data-val-required="The Name field is required."/>
    <span class="field-validation-valid" 
          data-valmsg-for="Name" data-valmsg-replace="true"></span>
  </div>
  
  <input type="submit" value="Save" />
  
</form>

于 2017-07-28T18:41:17.323 に答える
0

私は間違っているかもしれませんが、.parent()ではなく.parents('div.control-group')が必要なようです。これにより、BootStrapsのフォームの色が赤に変更されずに間違ったdivに.errorが追加されます。

これは、JQuery Validateが強調表示しようとしている入力が、.errorが有効になるためにBootStrapが必要とする.control-groupの2つ下にあるためです。

$("#form").validate({
    highlight: function(element, errorClass, validClass){
    $(element).parents("div.control-group").addClass(errorClass).removeClass(validClass);
},

お役に立てれば

于 2013-02-20T21:10:46.473 に答える