使用datepicker进行jquery验证,突出显示问题

时间:2013-06-21 08:58:29

标签: jquery validation twitter-bootstrap datepicker

我的表单上有两个字段。一个是名称的明文输入,另一个是'vitalets bootstrap datepicker'。我决定使用jquery验证插件,所以当第一个'name'留空时它变成红色,而第二个'date_birth'如果在它中保持默认值它也变成红色。所以你必须插入一个名字,你必须选择一些日期而不是默认日期。

我添加了一个errorPlacement和成功规则,正如我所描述的那样。但问题在于我的'date_birth'字段。当你没有选择其他日期时,它会变红,但如果你选择了其他正确的日期,第二次提交后会变红。它不会像上面的“名字”字段那样变成绿色......

以下是jsfiddle中的情况:http://jsfiddle.net/dzorz/5xgfm/

HTML:

 <form class="form-horizontal" id="gold_form" method='post' action='/start_ajax/addgold/'>
 <fieldset>
    <span class="label-f">Name</span>
    <input type="text" class="span4" id="name" name="name">
    </br>
    <span class="label-f">Date of birth</span>
    <div class="input-append date notification" id="date_birth_picker" data-date="1980-01-01" data-date-format="yyyy-mm-dd">
    <input class="span2" size="16" type="text" value="1980-01-01" readonly="" id="date_birth" name="date_birth">
    <span class="add-on"><i class="icon-th"></i></span>
    </div>
    </br>
    <button type="submit" id="submit_btn" class="btn btn-primary btn-large">Submit</button>
</fieldset>
</form>

脚本:

//datepicker
$(function(){
            window.prettyPrint && prettyPrint();

            $('#date_birth_picker').datepicker({
                autoclose: true,
                weekStart: 1,
            });

        });


//validation
$().ready(function() {
                jQuery.validator.addMethod("defaultInvalid", function(value, element){
                    switch (element.value){
                        case $(element).prop("defaultValue"):
                        if (element.name == "date_birth") return false;
                        break;
                        default: return true; 
                        break;
                        }
                        });


                $("#gold_form").validate(
                    {
                    rules:{date_birth: "required defaultInvalid",
                           name: "required",
                           family_name: "required"
                          },
    errorPlacement: function(error, element) {
        $(element).filter(':not(.valid)').addClass("invalid");
    },
    success: function(error) {
        $("#gold_form").find('.valid').removeClass("invalid").addClass("success");
    },
                    });
                });

的CSS:

@import   url('http://twitter.github.com/bootstrap/assets/css/bootstrap.css');

.error {
float: none; color: red !important; padding-left: .5em;    
vertical-align: top; 
}
.invalid {
border: 1px solid red !important;
}

.success{
border: 1px solid green !important;
}

我错过了什么或什么?你可以自由编辑我的jsfiddle。

感谢您的帮助

2 个答案:

答案 0 :(得分:10)

每当datepicker更改时,您都需要重新检查日期的有效性。

所以在创建了datepicker之后,添加一个运行changeDate方法的valid事件:

 $('#date_birth_picker').datepicker({
                autoclose: true,
                weekStart: 1,
 }).on('changeDate', function(ev) {
    if($('#date_birth').valid()){
       $('#date_birth').removeClass('invalid').addClass('success');   
    }
 });

http://jsfiddle.net/5xgfm/2/

答案 1 :(得分:2)

不知何故,在选择日期之后,datepicker()失去了日期字段的焦点,并且没有任何验证器插件可以将日期输入字段视为已填充(有效)。 作为结论,一个简单的.focus()可以解决问题。

$('#datefield').datepicker({
  //datepicker methods and settings here
}).on('changeDate', function (e) {
  $(this).focus();    
});

我也在这篇文章Bootstrap datepicker and bootstrap validator

上发布了这个答案