JQuery Validation和Bootstrap 3用于相同的表单组 - 每个字段的错误和成功类

时间:2015-02-16 15:22:03

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

我有一个Bootstrap 3表单,其中我有两个并排的字段(例如,名字和姓氏),为了用BS3实现这一点,我将两个字段放在同一个表格组div中,效果很好。

但是,使用我正在使用的jQuery Validate脚本(v1.13.1),它会根据表单组向字段添加has-error和has-success样式,因此如果其中一个字段是has-error(例如,名字,然后两个字段显示有错误样式(名字和姓氏),当它只是应该有一个类的字段之一。

我找到了一个似乎正确的解决方案,但它仍然无法解决问题:JQuery Validation and Bootstrap 3 for same form-group此代码不起作用,但您可以看到它&# 39;我正在尝试做的事情的正确道路......基本上,在同一个表格组中的2个不同的领域中分离出有错误和成功造型(突出显示vs unhighlight)。 / p>

这是我的简化表单HTML:

<form class="form-horizontal" name="paymentInformation" id="paymentInformation" action="verifyOrder.cfm" method="post" role="form">
<div class="form-group">
  <label for="firstname" class="col-sm-2 control-label">First Name</label>  
  <div class="col-sm-4">
  <input id="firstname" name="firstname" placeholder="First Name" class="form-control input-md" type="text" autofocus>
  </div>
  <label for="lastname" class="col-sm-2 control-label">Last Name</label>  
  <div class="col-sm-4">
  <input id="lastname" name="lastname" placeholder="Last Name" class="form-control input-md" type="text">
  </div>
</div>
<input type="submit" value="PROCEED TO THE NEXT STEP &#xf054;" class="blueButton">
</form>

而且,这里是简化的JS(改编自Bootstrap 3 with jQuery Validation Plugin的评论):

<script>
$.validator.setDefaults({
    errorElement: "span",
    errorClass: "help-block",
    highlight: function(element) {
        $(element).closest('.form-group').removeClass('has-success').addClass('has-error');
    },
    unhighlight: function(element) {
        $(element).closest('.form-group').removeClass('has-error').addClass('has-success');
    },
    errorPlacement: function (error, element) {
        if (element.parent('.input-group').length || element.prop('type') === 'checkbox' || element.prop('type') === 'radio') {
        error.insertAfter(element.parent());
        } else {
            error.insertAfter(element);
        }
    }
});
$("#paymentInformation").validate({
    rules: {
        'firstname': {
            required: true,
            maxlength: 200
        },
        'lastname': {
            required: true,
            maxlength: 200
        }
    },
   messages: {
        'firstname': {
            required: "Enter your First Name.",
            maxlength: "Your First Name cannot exceed 200 characters"
        },
        'lastname': {
            required: "Enter your Last Name.",
            maxlength: "Your Last Name cannot exceed 200 characters"
        }
    }
});
</script>

如果验证了名字或姓氏字段是否有效,则可以找到错误,然后其他字段显示它是否已经过验证(就像绿色的全部或全部一样)两个领域都是红色的。)

这是一个显示问题的小提琴:http://jsfiddle.net/gamehendgeVA/m2o6c2vj/

非常感谢任何帮助!

谢谢!

1 个答案:

答案 0 :(得分:5)

您的两个输入都放在单独的<div class="col-sm-4">元素中。所以你可以替换这些行:

$(element).closest('.form-group').removeClass('has-success').addClass('has-error');
// ...
$(element).closest('.form-group').removeClass('has-error').addClass('has-success');

用这些:

$(element).parent().removeClass('has-success').addClass('has-error');
// ...
$(element).parent().removeClass('has-error').addClass('has-success');

..或这些(与上述相同但与课程相关):

$(element).closest('.col-sm-4').removeClass('has-success').addClass('has-error');
// ...
$(element).closest('.col-sm-4').removeClass('has-error').addClass('has-success');

Fiddle


或者,如果由于某种原因你不能影响输入父类的类,或者你不能基于父元素(f.ex。你的项目正在开发中,或经常更新),你可以确保使用.wrap()将错误/成功类正确应用于字段。您的字段将包含在动态创建的<span>元素中,并且具有正确的(错误/成功)类:

highlight: function(element) {
    $(element).parent().is('.has-success, .has-error') ? 
        $(element).parent().removeClass('has-success').addClass('has-error') : 
        $(element).wrap('<span class="has-error"></span>');
},
unhighlight: function(element) {
    $(element).parent().is('.has-success, .has-error') ? 
        $(element).parent().removeClass('has-error').addClass('has-success') : 
        $(element).wrap('<span class="has-success"></span>');
}

Fiddle