chosen plugin を使用した_<select>
_入力がいくつかあり、クライアント側で「必須」として検証したい。 「選択」は実際の選択要素を非表示にし、divとspanでウィジェットを作成するため、ネイティブHTML5検証は適切に機能しないようです。フォームは送信されません(これは良いことですが)が、エラーメッセージは表示されないため、ユーザーは何が悪いのかわかりません(これは良くない)。
私はjQuery検証プラグイン(最終的にはいずれにせよ使用する予定だった)を使用しましたが、これまでのところ運がありませんでした。これが私の テストケース です:
_<form>
<label>Name: <input name="test1" required></label>
<label>Favorite Color:
<select name="test2" required>
<option value=""></option>
<option value="red">Red</option>
<option value="blue">Blue</option>
<option value="green">Green</option>
</select>
</label>
<input type="submit">
</form>
_
_$(document).ready(function(){
$('select').chosen();
$('form').validate();
});
_
これは、エラーメッセージを検証または表示せずに、空の値でselect
を通過させます。 chosen()
行をコメントアウトすると、正常に機能します。
JQuery検証プラグインでchosen()
入力を検証し、無効なもののエラーメッセージを表示するにはどうすればよいですか?
jQuery validateは隠された要素を無視し、選択されたプラグインは_visibility:hidden
_属性をselectに追加するため、試してください:
$.validator.setDefaults({ ignore: ":hidden:not(select)" }) //for all select
OR
$.validator.setDefaults({ ignore: ":hidden:not(.chosen-select)" }) //for all select having class .chosen-select
validate()
関数の直前にこの行を追加します。それは私のためにうまく機能します。
jQuery検証では、非表示の要素は取得されませんが、個々の要素を検証するように強制できます。ちょっとしたハックですが、次のように動作します:
_$('form').on('submit', function(e) {
if(!$('[name="test2"]').valid()) {
e.preventDefault();
}
});
_
「選択された」要素のみを選択するには、$('.chzn-done')
を使用できます
私の中で。
私のフォームにはクラス「validate」があり、すべての入力要素にはクラス「required」htmlコードがあります:
<form id="ProdukProdukTambahForm" class="validate form-horizontal" accept-charset="utf-8" method="post" enctype="multipart/form-data" action="/produk-review/produk/produkTambah" novalidate="novalidate">
<div class="control-group">
<label class="control-label" for="sku">SKU</label>
<div class="controls">
<input id="sku" class="required span6" type="text" name="sku">
</div>
</div>
<div class="control-group">
<label for="supplier" class="control-label">Supplier</label>
<div class="controls">
<select name="supplier" id="supplier" class='cho span6 {required:true} '>
<option value=''>-- PILIH --</option>
<?php
foreach ($result as $res)
{
echo '<option value="'.$res['tbl_suppliers']['kode_supplier'].'">'.$res['tbl_suppliers']['nama_supplier'].'</option>';
}
?>
</select>
</div>
</div>
</form>
jquery検証で選択されたJavaScriptコード
$(document).ready(function() {
// - validation
if($('.validate').length > 0){
$('.validate').validate({
errorPlacement:function(error, element){
element.parents('.controls').append(error);
},
highlight: function(label) {
$(label).closest('.control-group').removeClass('error success').addClass('error');
},
success: function(label) {
label.addClass('valid').closest('.control-group').removeClass('error success').addClass('success');
},
//validate choosen select (select with search)
ignore: ":hidden:not(select)"
});
}
// - chosen, add the text if no result matched
if($('.cho').length > 0){
$(".cho").chosen({no_results_text: "No results matched"});
}
});
注:入力値がnullの場合、クラスエラーは親「div」に追加されます
//選択した要素を非表示にする別の方法を使用して、これを修正できます。例えば....
$(document).ready(function() {
$.validator.addMethod( //adding a method to validate select box//
"chosen",
function(value, element) {
return (value == null ? false : (value.length == 0 ? false : true))
},
"please select an option"//custom message
);
$("form").validate({
rules: {
test2: {
chosen: true
}
}
});
$("[name='test2']").css("position", "absolute").css("z-index", "-9999").chosen().show();
//validation.....
$("form").submit(function()
{
if ($(this).valid())
{alert("valid");
//some code here
}
return false;
});
});
このシンプルなCSSルールは、選択されたjoomla 3の実装で動作します
選択すると、無効なクラスが非表示の選択入力に追加されるため、これを使用して選択した選択ボックスをターゲットにします
.invalid, .invalid + div.chzn-container a {
border-color: red !important;
}
$.validator.setDefaults({ ignore: ":hidden:not(.chosen-select)" })
を配置する必要がありました
outside $(document).ready(function()
は、chosened.jsで動作します。
また、選択したドロップダウンリストの前にエラーメッセージが表示されるという問題が発生する場合があります。この問題を解決するソリューションを見つけ、ここにコードを貼り付けて共有します
HTML:
<label class="col-sm-3">Select sponsor level *</label>
<asp:DropDownList ID="ddlSponsorLevel" runat="server" CssClass="col-sm-4 required" ClientIDmode="Static" />
<label class="error" id="ddlSponsorLevel-error" for="ddlSponsorLevel"></label>
Javascript:
if (!$('#ddlSponsorLevel').valid()) {
$('#ddlSponsorLevel-error').text("You must choose a sponsor level");
return false;
}
Jquery Validationは、実際に非表示のラベルhtml要素を追加しました。元の場所を上書きするために、別の場所で同じIDを使用してこの要素を再定義できます。
この作業に約1日費やしましたが、まったく運がありませんでした!次に、Vtigerが使用しているソースコードを見て、ゴールドを見つけました。彼らは古いバージョンを使用していましたが、彼らには鍵がありました!あなたは使わなければなりません
data-validation-engine="validate[required]"
そうでなく、選択のためのクラスを介してクラスが渡される場所がある場合、選択されたものに適用され、選択されたものは更新されないと考えられます。選択したクラスにクラスを渡さない場合、これは問題になりますが、これを行う場合はそれが機能する唯一の方法です。
これは、選択された1.4.2 validationEngine 2.6.2およびjquery 2.1.4でのものです
// binds form submission and fields to the validation engine
jQuery("#FORMNAME").validationEngine({
prettySelect : true,
useSuffix: "_chosen"
//promptPosition : "bottomLeft"
});
@Anupalは私を正しい道に導いたが、どういうわけか複雑な修正が必要だった
.chosen
が考慮されるようにするjavascript
$.validator.setDefaults({ ignore: ":hidden:not(.chosen)" })
または、選択したものに付ける他の名前。これはグローバル構成です。トップレベルでの設定を検討する
BenG に感謝
html
<select id="field" name="field" class="chosen" data-rule-chosen-required="true">
<option value="">Please select…</option>
</select>
javascript
繰り返しますが、$.validator
オブジェクトのグローバル構成。前のコマンドの隣に配置できます
$.validator.addMethod('chosen-required', function (value, element, requiredValue) {
return requiredValue == false || element.value != '';
}, $.validator.messages.required);
この答えをありがとう https://stackoverflow.com/a/40310699/4700162 私は問題を解決します:
Chosen.jquery.jsファイル内で、変更します
this.form_field_jq.hide().after(this.container);
これとともに:
this.form_field_jq.css('position', 'absolute').css('opacity', 0).after(this.container);
「選択された」プラグインにjQuery検証を使用できます。私のためにうまく働いています。
$('.chosen').chosen({
allow_single_deselect: true
});
$.validator.setDefaults({ ignore: ":hidden:not(select)" });
$('form').validate({
highlight: function(element) {
$(element).closest('.form-group').addClass('has-error');
},
unhighlight: function(element) {
$(element).closest('.form-group').removeClass('has-error');
},
errorElement: 'span',
errorClass: 'help-block text-danger',
errorPlacement: function(error, element) {
if(element.parent('.input-group').length) {
error.insertAfter(element.parent());
} else {
error.insertAfter(element.parent());
}
}
});
フォームには条件付きの非表示フィールドが含まれており、非表示の選択フィールドが検証に失敗するのを防ぐために、デフォルトのignore:hiddenをさらに拡張しました。
$.validator.setDefaults({
ignore: ":hidden:not(.chosen-select + .chosen-container:visible)" //for all select having class .chosen-select
})
jQuery("#formID").validationEngine({
prettySelect : true,
useSuffix: "_chzn"
});
これを試すこともできます:
_$('form').on('submit', function(event) {
event.preventDefault();
if($('form').valid() == true && $('.select-chosen').valid() == true){
console.log("Valid form");
} else {
console.log("Invalid form");
}
});
_
各select
sに_.select-chosen
_クラスを追加することを忘れないでください。
$('.select-chosen').valid()
は、非表示のselect
sの検証を強制します
これがより良い解決策だと思います。
_//trigger validation onchange
$('select').on('change', function() {
$(this).valid();
});
$('form').validate({
ignore: ':hidden', //still ignore Chosen selects
submitHandler: function(form) { //all the fields except Chosen selects have already passed validation, so we manually validate the Chosen selects here
var $selects = $(form).find('select'),
valid = true;
if ($selects.length) {
//validate selects
$selects.each(function() {
if (!$(this).valid()) {
valid = false;
}
});
}
//only submit the form if all fields have passed validation
if (valid) {
form.submit();
}
},
invalidHandler: function(event, validator) { //one or more fields have failed validation, but the Chosen selects have not been validated yet
var $selects = $(this).find('select');
if ($selects.length) {
validator.showErrors(); //when manually validating elements, all the errors in the non-select fields disappear for some reason
//validate selects
$selects.each(function(index){
validator.element(this);
})
}
},
//other options...
});
_
注:エラーの表示を処理するには、errorPlacement
コールバックも変更する必要があります。エラーメッセージがフィールドの横にある場合は、.siblings('.errorMessageClassHere')
の代わりに.next('.errorMessageClassHere')
(またはDOMに応じて他の方法)を使用する必要があります。