【问题标题】:jQuery Validate not working for Multi-select dropdownjQuery Validate 不适用于多选下拉菜单
【发布时间】:2016-02-27 16:33:51
【问题描述】:

我正在使用带有 Bootstrap 多选插件的 Bootstrap 以及 jQueryValidation 来验证字段。

不幸的是,当我将下拉菜单呈现为单选时,不会触发验证。

有什么想法吗?

Javascript

        $( "#signupForm" ).validate( {
            rules: {
                firstname: "required",
                lastname: "required",
      food: "required",
                username: {
                    required: true,
                    minlength: 2
                },
                password: {
                    required: true,
                    minlength: 5
                },
                confirm_password: {
                    required: true,
                    minlength: 5,
                    equalTo: "#password"
                },
                email: {
                    required: true,
                    email: true
                },
                agree: "required"
            },
            messages: {
                firstname: "Please enter your firstname",
                lastname: "Please enter your lastname",
      food: "Fruit is required to enter",
                username: {
                    required: "Please enter a username",
                    minlength: "Your username must consist of at least 2 characters"
                },
                password: {
                    required: "Please provide a password",
                    minlength: "Your password must be at least 5 characters long"
                },
                confirm_password: {
                    required: "Please provide a password",
                    minlength: "Your password must be at least 5 characters long",
                    equalTo: "Please enter the same password as above"
                },
                email: "Please enter a valid email address",
                agree: "Please accept our policy"
            },
            errorElement: "em",
            errorPlacement: function ( error, element ) {
                // Add the `help-block` class to the error element
                error.addClass( "help-block" );

                if ( element.prop( "type" ) === "checkbox" ) {
                    error.insertAfter( element.parent( "label" ) );
                } else {
                    error.insertAfter( element );
                }
            },
            highlight: function ( element, errorClass, validClass ) {
                $( element ).parents( ".col-sm-5" ).addClass( "has-error" ).removeClass( "has-success" );
            },
            unhighlight: function (element, errorClass, validClass) {
                $( element ).parents( ".col-sm-5" ).addClass( "has-success" ).removeClass( "has-error" );
            }
        } );
$('.multiselect').multiselect();

JSFIDDLE

【问题讨论】:

  • 请编辑 OP 以包含相关的 HTML。请不要依赖 jsFiddle 链接来保持活动状态。谢谢。

标签: jquery twitter-bootstrap jquery-validate bootstrap-multiselect


【解决方案1】:

...当我将下拉菜单呈现为单选时,不会触发验证。

您的select 元素没有触发验证,因为没有验证错误。由于您加载已选择“奶酪”的页面,因此满足 required 规则;没有错误,因此没有理由看到错误消息。

<select name="food" class="multiselect">
    <option value="cheese"> Cheese </option>
    <option value="tomatoes"> Tomatoes </option>
    <option value="mozarella"> Mozzarella </option>
    <option value="mushrooms"> Mushrooms </option>
    <option value="pepperoni"> Pepperoni </option>
    <option value="onions"> Onions </option>
</select>

否则,在顶部添加一个包含空 value&lt;option&gt;,您将看到 required 规则在起作用。

<select name="food" class="multiselect">
    <option value="">please select...</option>
    <option value="cheese"> Cheese </option>
    ....

演示:http://jsfiddle.net/vg6oLvxo/83/


编辑

OP 对此答案的评论:

这实际上导致我的多选下拉列表被删除,因为当 bootstrap-multiselect 插件生成多选下拉列表时,它会将 display:none 添加到主选择标签

当你使用一个插件来操作 DOM 来隐藏默认的表单元素时,你必须使用 jQuery Validate 的 ignore 选项来确保隐藏的表单元素仍然被验证。 ignore: [] 确保不会忽略任何内容。

$("#signupForm").validate({
    ignore: [],  // ignore nothing, validate everything
    rules: { ....

但从某种意义上说,下拉验证消息显示在下拉列表之前,而其他字段显示在该字段之后,这有点不一致。

jQuery Validate 插件在表单元素之后插入消息。由于 Bootstrap Multiselect 插件隐藏了原始元素并创建了一个新元素,因此消息插入隐藏元素之后,但 出现 在新元素之前。这可以通过在 errorPlacement 选项中使用条件来解决。

errorPlacement: function(error, element) {
    if (element.hasClass('multiselect')) {
        // custom placement for hidden select
        error.insertAfter(element.next('.btn-group'))
    } else {
        // message placement for everything else
        error.insertAfter(element);
    }
}

演示 2:http://jsfiddle.net/vg6oLvxo/85/

【讨论】:

  • #Sparky - 感谢您的提示!我在实际应用程序的下拉菜单中已经有了这个默认值。当我发布时,我不得不调整实际示例,以免违反任何公司政策。无论如何,当同时设置 id 和 name 属性时,我的 jqueryValidation 不会在选择下拉列表中触发验证错误。如果我删除 id 属性,则会触发验证,但我的下拉菜单不会呈现为引导下拉菜单。如果我同时拥有这两个属性,则不会触发 jqueryValidation。有什么建议吗?
  • @jagamot,您必须发布一个完全复制该问题的示例。否则,我们只是猜测。
  • @sparky- 我试图进一步调试它,这就是正在发生的事情。在元素 function() [v 1.15 line 620] 下的 jqueryValidation.js 中,框架过滤掉所有隐藏元素 - return $( this.currentForm) .find( "input, select, textarea, [contenteditable]" ) .not( ":submit, :reset, :image, :disabled" ) .not( this.settings.ignore ) .filter( function() { ... } 这本质上是导致我的多选下拉菜单删除,因为当 bootstrap-multiselect 插件生成多选下拉列表时,它会将 display:none 添加到主选择标签
  • 看起来从 1.9 版开始,隐藏字段被忽略,这导致了我所看到的。将忽略设置为 [] 解决了我的问题 - stackoverflow.com/questions/8466643/…
  • 但从某种意义上说,下拉验证消息显示在下拉列表之前,而其他字段显示在该字段之后,这有点不一致。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多