jQuery Validate-非表示フィールドの検証を有効にします


186

jQuery検証プラグイン1.9の新しいバージョンでは、デフォルトで非表示フィールドの検証は無視されます。textarea入力フィールドにCKEditorを使用していますが、フィールドを非表示にしてiframeに置き換えます。フィールドはありますが、非表示フィールドの検証は無効になっています。検証プラグインバージョン1.8.1では、すべてが期待どおりに動作します。

だから私の質問は、v1.9検証プラグインで非表示フィールドの検証を有効にする方法です。

この設定は機能しません:

$.validator.setDefaults({ ignore: '' });


「非表示フィールドの検証を無視」のリンクは無効です。
Beepye 2016

検証はデフォルトでで動作します<input type="text" name="myfield" id="myfield" required="required" style="display: none;">。設定を変更したり特別なことをしたりする必要はありませんでした。
squarecandy 2018

回答:


328

プラグインの作成者は、「引用符なしの角括弧」を使用する必要があると述べています、[]

http://bassistance.de/2011/10/07/release-validation-plugin-1-9-0/

リリース:Validation Plugin 1.9.0: "...別の変更により、非表示要素を含むフォームの設定が簡単になります。これらはデフォルトで無視されます(オプション「ignore」にはデフォルトで「:hidden」が含まれています)。理論的には、これは既存の設定が壊れる可能性があります。実際にそうなる可能性は低いですが、ignore-optionを“ []”(引用符なしの角括弧)に設定することで修正できます。

すべてのフォームでこの設定を変更するには:

$.validator.setDefaults({ 
    ignore: [],
    // any other default options and/or rules
});

(関数.setDefaults()内にある必要はありませんdocument.ready

または1つの特定のフォーム:

$(document).ready(function() {

    $('#myform').validate({
        ignore: [],
        // any other options and/or rules
    });

});

編集

一部の非表示フィールドの検証を有効にして、他のフィールドを無視する方法については、この回答を参照してください。


編集2

「これは機能しません」というコメントを残す前に、OPがjQuery Validateプラグインについて尋ねているだけであり、彼の質問はASP.NET、MVC、またはその他のMicrosoftフレームワークがこのプラグインの通常の動作をどのように変更できるかとは関係ないことに注意してください予想される行動。Microsoftフレームワークを使用している場合、jQuery Validateプラグインのデフォルトの機能は、Microsoftのunobtrusive-validationプラグインによって上書きされます。

unobtrusive-validationプラグインで苦労している場合は、代わりにこの回答を参照してください:https : //stackoverflow.com/a/11053251/594235


26
たぶん、反対投票者は私にいくつかの建設的なフィードバックを与えることができます。それ以外の場合、答えは完全に自己完結型で、適切に供給され、コード例を示し、プラグインの作成者によると技術的に正しいです。
Sparky

1
@StijnVanBael、いや、それは間違っています。jsfiddle.net/F4w92/1を参照してください。 また、jerickの回答に関する2番目のコメントも参照してください。
Sparky 2013

4
まあ@Sparkyは言った。ダウン投票はおそらく一種の復讐のある、私は同じ..遭遇した
オマール・

1
ライブラリはHTTPSではなくHTTPでロードされるため、JSFiddleは機能しなくなりました。更新されたバージョン:jsfiddle.net/F4w92/31
hotips

1
これは最新バージョンを使用している場合は機能しないため、私も反対票を投じました。使用する必要がありました:$( "form")。data( "validator")。settings.ignore = ""; @James bellowからの他の回答
Mark Homer

71

これは、ASP.NET MVC3サイト内で機能しました。誰にでも役立つ場合に備えて、控えめな検証などをセットアップするためにフレームワークを残しました。

$("form").data("validator").settings.ignore = "";

2
また、デフォルトの動作を変更するのではなく、特定の状況で実行できることを意味するので、これも気に入っています。
Steve Owen、

5
.validate()を使用してオプションを変更することが機能しなかったので、私はこの方法でそれをしなければなりませんでした。
Farinha 14

1
これは控えめな検証のための正しい解決策です。他のすべての解決策を試しましたが、控えめな方法を使用しない場合でも機能します。控えめに使用している場合は、ここが適切な場所です。
HakanFıstık2016年

ブートストラップアコーディオンで動作する控えめな検証にもこのメソッドを使用する必要がありました
bsod_

これに変更すると、フォームは検証されません。控えめな.netコアを使用している
Offir Pe'er

64

必ず入れて

 $.validator.setDefaults({ ignore: '' });

内部ではありません$(document).ready


2
すばらしい答えです。ドキュメントへのリンクは、学習するのに適していますが、正直な答えの方が価値があります。OPは順調でしたが、$(document).readyの外に置くのがコツです。
Kevin Zych 2013

3
@KevinZych、どうやら、$.validator.setDefaults()DOM対応のハンドラーの内部と外部のどちらに配置しても、まったく違いはありません。このjsFiddleこのjsFiddleと比較します。
Sparky

興味深い@Sparky、あなたのフィドルは素晴らしい証拠です。戻って、このソリューションを使用して修正したコードを確認し、DOM対応ハンドラー内にある必要があるという結論に達した理由を確認する必要があります。他の理由があったに違いありません。
Kevin Zych 2013

Justinは、doc ready内で実行すると問題が発生する理由を説明しています。ただし、ドキュメントの準備が整う前に、ドキュメントの準備が整っていない外部のものが実行されることを保証するのが難しいため、この回答は適切な選択肢ではありません。Doc.readyは、それ以外のスクリプトが実行されるのを待ちません。個人的なことは何もありませんが、これは信頼できる答えではありません。
AaronLS 2013

最後に私は答えを持っています..どうもありがとう
sp9

29

だから私はこれがうまくいかない理由をもう少し深く掘り下げるつもりです。なぜなら私はハハを知らずに夜眠ることができない種類の人だからです。2013年1月29日に公開されたjQuery validate 1.10とMicrosoft jQuery Unobtrusive Validation 2.0.20710.0を使用しています。

jQuery ValidateでsetDefaultsメソッドを検索することから始めて、縮小化されていないファイルの261行でそれを見つけました。この関数が実際に行うことは、json $.validator.defaultsValidateで定義されている他のデフォルトとともに、ignoreプロパティが ":hidden"に設定されて初期化されている既存のjson設定をマージすることだけです。したがって、この時点で無視をオーバーライドしました。次に、このデフォルトプロパティが参照されている場所を確認します。

コードをトレースして、どこ$.validator.defaultsが参照されているかを確認したところ。これは、フォームバリデーターのコンストラクターによってのみ使用されていることに気づきました。jQueryの検証された非縮小ファイルの170行目です。

// constructor for validator
$.validator = function( options, form ) {
    this.settings = $.extend( true, {}, $.validator.defaults, options );
    this.currentForm = form;
    this.init();
};

この時点で、バリデーターは設定されたデフォルト設定をマージしてフォームバリデーターにアタッチします。検証、強調表示、非強調表示などを実行しているコードを見ると、それらはすべて、validator.settingsオブジェクトを使用して、ignoreプロパティを取得しています。したがって、setDefaultsメソッドで無視を設定する場合は、$( "form")。validate()が呼び出される前に発生する必要があることを確認する必要があります。

Asp.net MVCと邪魔にならないプラグインを使用している場合は、validateがdocument.readyで呼び出されていることをJavaScriptで確認するとわかります。 スクリプト、jquery検証、そして邪魔にならない後に実行されるdocument.readyブロックで自分のsetDefaultsも呼び出しました。これらのスクリプトは、呼び出しがあるスクリプトの前にhtmlで定義したためです。したがって、私の呼び出しは、検証中に非表示要素をスキップするデフォルトの機能に影響を与えなかったことは明らかです。ここにはいくつかのオプションがあります。

オプション1 -Juan Melladoが指摘したように、スクリプトが読み込まれるとすぐに実行されるdocument.readyの外部で呼び出しを行うことができます。ブラウザーが並列スクリプトのロードを実行できるようになったため、このタイミングについてはわかりません。私が用心深くしすぎているなら、私を訂正してください。また、これを回避する方法はおそらくありますが、私のニーズのために、私はこの道をたどりませんでした。

オプション2a-私の目には$.validator.setDefaults({ ignore: '' });、document.readyイベントの内部をで置き換えるのが安全$("form").data("validator").settings.ignore = "";です。これにより、指定されたフォームの要素に対して各検証を実行するときにjQuery検証によって実際に使用される無視プロパティが変更されます。

オプション2b-コードをもう少し調べた後$("form").validate().settings.ignore = "";、ignoreプロパティを設定する方法としても使用できます。その理由は、validate関数を見ると、$.data()関数を介してフォーム要素のバリデーターオブジェクトがすでに格納されているかどうかを確認するためです。form要素とともに保存されたバリデーターオブジェクトが見つかった場合は、別のバリデーターを作成するのではなく、単にバリデーターオブジェクトを返します。


詳しい回答ありがとうございます!
davidallyoung 2015

OPの回答がMVC 5でうまく機能しなかったため、良い結果が得られました
Mark Homer

あなたの分析は、私の検証問題を修正するのに大いに役立ちました。+1
pgcan 2016年

15

これは、ASP.NETサイト内で機能しました。一部の非表示フィールドで検証を有効にするには、このコードを使用します

$("form").data("validator").settings.ignore = ":hidden:not(#myitem)";

フォームのすべての要素の検証を有効にするには、これを使用します $("form").data("validator").settings.ignore = "";

内でそれらを使用することに注意してください $(document).ready(function() { })


8

ignore: []特定のフォームの特定のページに追加しただけで、このソリューションは私にとってうまくいきました。

$("#form_name").validate({
        ignore: [],
        onkeyup: false,
        rules: {            
        },      
        highlight:false,
    });


0

フォームの送信では検証が機能していましたが、選択された選択リストへの入力に対してリアクティブイベント駆動の検証を行っていませんでした。

これを修正するために、ライブラリによって追加されるjquery検証イベントを手動でトリガーする次のコードを追加しました。

$(".chosen-select").each(function() {
  $(this).chosen().on("change", function() {
    $(this).parents(".form-group").find("select.form-control").trigger("focusout.validate");
  });
});

jquery.validateは.valid、基になる選択リストにクラスを追加します。

警告:これには、フォーム入力に一貫したhtmlパターンが必要です。私の場合、ファイルされた各入力はでラップされ、div.form-group各入力は.form-controlです。


-15

jquery検証ファイルでignore: ":hidden"というテキストを見つけてコメントします。これをコメントした後、検証する非表示の要素が失われることはありません...

ありがとう


5
サードパーティのライブラリのコードをランダムにコメントアウトすることは決して良い考えではありません。
ジャック、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.