如何通过“选择”插件使用 jQuery 验证?

Posted

技术标签:

【中文标题】如何通过“选择”插件使用 jQuery 验证?【英文标题】:How can I use jQuery validation with the "chosen" plugin? 【发布时间】:2012-06-29 05:53:09 【问题描述】:

我有一些使用chosen plugin 的<select> 输入,我想在客户端验证为“必需”。由于“选择”隐藏了实际的选择元素并创建了一个带有 div 和 span 的小部件,因此原生 html5 验证似乎无法正常工作。表单不会提交(这很好),但没有显示错误消息,因此用户不知道出了什么问题(这不好)。

我已经求助于 jQuery 验证插件(我最终还是打算使用它),但到目前为止还没有任何运气。这是我的test case:

<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() 输入,并显示无效输入的错误消息?

【问题讨论】:

检查this plugin。不是真正的解决方案,但您可能想尝试一下。 @elclanrs:谢谢,但我现在想坚持使用事实上的 jQuery 验证库,尤其是在项目的这个阶段(试图结束)。也许在未来的项目中。 这篇文章解决了我的问题:***.com/questions/10387553/…简单优雅。 【参考方案1】:

jQuery validate 忽略了隐藏元素,由于 Chosen 插件在 select 中添加了visibility:hidden 属性,试试:

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

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

validate() 函数之前添加这一行。对我来说效果很好。

【讨论】:

这对我来说已经足够了。谢谢。 你把这行放在哪里了?它似乎对我不起作用:/ 就在 JQuery validate() 函数上方。 为我工作!绝对是最简单的解决方案。 因为我选择的所有选择都有 .chosen-select 类,我发现使用 $.validator.setDefaults( ignore: ":hidden:not(.chosen-select)" ); 更好。否则这意味着所有隐藏的选择都会被验证。【参考方案2】:

jQuery 验证不会选择隐藏的元素,但您可以强制它验证单个元素。有点破解,但以下将起作用:

$('form').on('submit', function(e) 
    if(!$('[name="test2"]').valid()) 
        e.preventDefault();
    
);  

要仅选择“选择”元素,您可以使用$('.chzn-done')

【讨论】:

看来e.preventDefault() 甚至没有必要,只需调用$("element").valid()。我使用了this code,它似乎工作得很好:$('form').on('submit', function() $('.chzn-done').valid(););。感谢您的信息。 .chzn-done 自 Chosen 1.0 起不再添加到“选择”元素中【参考方案3】:

在我的。

我的表单有类“验证” 并且每个输入元素都有“必需”类 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>

javascript 代码用于选择 jquery 验证

$(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'

【讨论】:

【参考方案4】:

//您可以通过使用另一种方式隐藏您选择的元素来解决此问题。比如……

$(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;

    );
);

【讨论】:

此答案仅在您不调用 .chosen() 时才有效。所选库中似乎存在一个错误(功能?),当您激活 【参考方案5】:

这个简单的 CSS 规则适用于 joomla 3 的 selected 实现

Chosen 将无效的类添加到隐藏的选择输入中,因此使用它来定位选择的选择框

.invalid, .invalid + div.chzn-container a 
    border-color: red !important;

【讨论】:

就我而言,我添加了 ul.chosen-choices.input-validation-error border-color: red !important; .input-validation-error, .input-validation-error + div.chosen-container ul.chosen-choices border-color: red !important; 【参考方案6】:

我必须放置$.validator.setDefaults( ignore: ":hidden:not(.chosen-select)" )$(document).ready(function()) 之外,以便使用 selected.js。

https://***.com/a/10063394/4063622

【讨论】:

【参考方案7】:

您可能还会遇到问题,即在选择下拉列表之前显示错误消息。我找到了解决此问题的解决方案并将我的代码粘贴到这里与您分享

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的元素来覆盖原来的地方。

【讨论】:

【参考方案8】:

我花了大约一天的时间来解决这个问题,但一点运气都没有!然后我查看了 Vtiger 使用的源代码,发现了黄金!即使他们使用的是旧版本,他们也有钥匙!你必须使用

data-validation-engine="validate[required]"

如果你不这样做并且你有它,类通过类传递,选择被应用到被选择的,它认为你选择的永远不会更新。如果您不将课程传递给选定的人,这应该是一个问题,但是如果您这样做是唯一可行的方法。

这是选择 1.4.2 验证引擎 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"
);

【讨论】:

【参考方案9】:

@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);

【讨论】:

大家好,我的 jqueryvalidation 的焦点有问题,在 chosen 字段上不起作用,你知道如何解决吗问题? 提出一个有一定背景的新问题,很乐意为您提供帮助【参考方案10】:
jQuery("#formID").validationEngine(
     prettySelect : true,
     useSuffix: "_chzn"
);

jQuery-Validation-Engine/demoChosenLibrary

【讨论】:

【参考方案11】:

你也可以试试这个:

$('form').on('submit', function(event) 
    event.preventDefault();
    if($('form').valid() == true && $('.select-chosen').valid() == true)
        console.log("Valid form");
     else 
        console.log("Invalid form");
    
); 

记得在每个selects 上添加.select-chosen 类。

$('.select-chosen').valid() 强制验证隐藏的selects

http://jsfiddle.net/mrZF5/39/

【讨论】:

【参考方案12】:

我的表单包含有条件隐藏的字段,为了防止隐藏的选定字段验证失败,我扩展了默认的忽略:进一步隐藏:

$.validator.setDefaults( 
  ignore: ":hidden:not(.chosen-select + .chosen-container:visible)"  //for all select having class .chosen-select
    )

【讨论】:

根本不适合我。 .chosen-select + .chosen-container:visible 部分实际上选择了所选的 &lt;div&gt; 而不是必须验证的 &lt;select&gt;,所以我不清楚这应该如何工作。【参考方案13】:

我认为这是更好的解决方案。

//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')(或其他方式,取决于 DOM)而不是 .next('.errorMessageClassHere')

【讨论】:

【参考方案14】:

在 2018 年,我正在验证 jQuery validate 抱怨输入字段没有名称。此输入字段由 jQuery Chosen 插件附加。

使用 selected 时,此错误发生在其他任何事情之前。

【讨论】:

【参考方案15】:

感谢这个答案https://***.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);

【讨论】:

【参考方案16】:

您可以对“选择”插件使用 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());
            
        
    );

【讨论】:

【参考方案17】:

调用choice()后使用下面的jquery方法

$("#id").css("display":"").addClass("sr-only");

sr-only 是引导类

【讨论】:

【参考方案18】:

我最终通过以下方式解决了这个问题:

这是为 Chosen v1.8.7 准备的:

    打开 selected.js 并在第 199 行找到:

this.form_field_jq.hide().after(this.container),

    将其替换为:

this.form_field_jq.addClass('chosen-master').after(this.container),

    将这些 CSS 属性添加到该类:
.chosen-master 
  display: inline-block !important;
  width: 1px;
  height: 1px;
  margin: 0;
  padding: 0;
  border: 0;

参考:https://***.com/a/64491538/7353382

【讨论】:

以上是关于如何通过“选择”插件使用 jQuery 验证?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jQuery 验证插件验证 Select2 插件数组

错误放置在 Jquery 验证插件的选择标记顶部

Jquery 表单验证插件 - 如何通过额外的步骤提交?

使用 jQuery 验证插件验证单选按钮组

jquery validate插件如何允许为空?

当同时使用bootstrap-datepicker.js和jquery.validate.js这两款插件,至少要选择两次时间,才能验证成功的问题