Bootstrap 3.3.4、Select2 4.0、およびJquery Validation1.13.1を使用するプロジェクトがあります
Jqueryバリデーターのデフォルトをstyle bootstrap 3クラスのように設定しました
$.validator.setDefaults({
errorElement: "span",
errorClass: "help-block",
highlight: function (element, errorClass, validClass) {
$(element).addClass(errorClass);
$(element).closest('.form-group').removeClass('has-success').addClass('has-error');
},
unhighlight: function (element, errorClass, validClass) {
$(element).removeClass(errorClass);
$(element).closest('.form-group').removeClass('has-error').addClass('has-success');
},
errorPlacement: function(error, element) {
if(element.parent('.input-group').length) {
error.insertAfter(element.parent());
} else {
error.insertAfter(element);
}
}
});
ただし、これらのデフォルトでは、select2フィールドのスタイルは同じではありません...下の画像では、「metals」selectはbootstrapフィールドであり、「colors」selectはselect2フィールドです。
他のSOを検索してみましたが、これらはすべて3.5.xxバージョンのselect2を使用しています。
写真の例のjsfiddleを含めました。select2が均一に見えるように、バリデーターのデフォルトの調整を探しています。
他のSOを検索してみましたが、これらはすべて3.5.xxバージョンのselect2を使用しています。
さまざまなバージョンの秘密の公式はありません;状況に応じてそれを理解する必要があります。つまり、レンダリングされたDOMを検査して、ターゲットにする要素とそれらをターゲットにする方法を知る必要があります。
以下のコードがあなたのために働くとは言いません。これは、この状況を攻撃する方法の単なる例です。
レンダリングされたSelect2要素を対象とするCSSを記述します。したがって、親コンテナにクラスhas-error
がある場合は常に、Select2要素はそのようにスタイル設定されます。
.has-error .select2-selection {
border: 1px solid #a94442;
border-radius: 4px;
}
エラーメッセージを表示するafterを取得するには、Select2要素にerrorPlacement
オプション内の別の条件とjQueryDOMトラバーサルが必要です。
errorPlacement: function (error, element) {
if (element.parent('.input-group').length) {
error.insertAfter(element.parent()); // radio/checkbox?
} else if (element.hasClass('select2')) {
error.insertAfter(element.next('span')); // select2
} else {
error.insertAfter(element); // default
}
}
最後に、Select2との対話には、jQuery Validateプラグインが自動的にキャプチャするイベントがないため、カスタムイベントハンドラーを作成し、プログラムで検証をトリガーする必要があります。
$('.select2').on('change', function() {
$(this).valid();
});
作業中のデモ: http://jsfiddle.net/z49mb6wr/1/
@ Sparkyのソリューション への小さな変更-error
クラスとvalid
クラスが最新のjqueryvalidate(:P )日付どおり:
/*! jQuery Validation Plugin - v1.16.0 - 12/2/2016
* http://jqueryvalidation.org/
* Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
今コード:
$('#MyForm').validate({
errorPlacement: function (error, element) {
if (element.parent('.input-group').length) {
error.insertAfter(element.parent()); // radio/checkbox?
} else if (element.hasClass('select2-hidden-accessible')) {
error.insertAfter(element.next('span')); // select2
element.next('span').addClass('error').removeClass('valid');
} else {
error.insertAfter(element); // default
}
}
});
// add valid and remove error classes on select2 element if valid
$('.select2-hidden-accessible').on('change', function() {
if($(this).valid()) {
$(this).next('span').removeClass('error').addClass('valid');
}
});
error
クラスでCSSを自由に使用してください。
Sparkyの答えは私にはうまくいかなかったので、以下に変更しました。
if (element.hasClass('select2-hidden-accessible')) {
error.insertAfter(element.closest('.has-error').find('.select2'));
} else if (element.parent('.input-group').length) {
error.insertAfter(element.parent());
} else {
error.insertAfter(element);
}