如何使用"选择"插件进行jQuery验证?

Wes*_*rch 72 jquery jquery-validate jquery-chosen

我有一些<select>使用所选插件的输入,我想在客户端验证为"必需".由于"selected"隐藏了实际的select元素并创建了一个包含div和spans的小部件,因此本机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>
Run Code Online (Sandbox Code Playgroud)
$(document).ready(function(){
    $('select').chosen();
    $('form').validate();
});
Run Code Online (Sandbox Code Playgroud)

这样可以select使用空值,而无需验证或显示错误消息.当我注释掉这chosen()条线时,它运行正常.

如何chosen()使用jQuery验证插件验证输入,并显示无效的错误消息?

小智 118

jQuery validate忽略隐藏元素,并且由于Chosen插件visibility:hidden为select 添加了属性,请尝试:

$.validator.setDefaults({ ignore: ":hidden:not(select)" }) //for all select

要么

$.validator.setDefaults({ ignore: ":hidden:not(.chosen-select)" }) //for all select having class .chosen-select

validate()功能之前添加此行.这对我来说可以.

  • 因为我所选择的所有选择都有`.chosen-select`类,我发现使用`$ .validator.setDefaults({ignore:":hidden:not(.chosen-select)"});`会更好.否则,这将意味着将验证所有隐藏的选择. (7认同)

Mik*_*son 19

jQuery验证不会获取隐藏的元素,但您可以强制它验证单个元素.一点点黑客,但以下将工作:

$('form').on('submit', function(e) {
    if(!$('[name="test2"]').valid()) {
        e.preventDefault();
    }
});  
Run Code Online (Sandbox Code Playgroud)

要仅选择您可以使用的"已选择"元素 $('.chzn-done')

  • 从.Chosen 1.0开始,`.chzn-done`不再添加到"selected"元素中 (4认同)
  • 似乎`e.preventDefault()`甚至不需要,只需调用`$("element").valid()`.我使用[此代码](http://jsfiddle.net/mrZF5/5/)它似乎工作得很好:`$('form').on('submit',function(){$('.chzn完成度的数')有效();});`.谢谢(你的)信息. (2认同)

小智 5

在我的。

我的表单有“验证”类,每个输入元素都有“必需”的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>
Run Code Online (Sandbox Code Playgroud)

和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"});
    }
});
Run Code Online (Sandbox Code Playgroud)

注意:如果输入值为null,则类错误将附加到父级“ div”