在datepicker具有焦点时阻止验证

时间:2012-11-02 12:45:52

标签: jquery jquery-validate jquery-ui-datepicker

我正在使用jQuery-ui datepicker和JörnZaefferer的validate插件。

众所周知,在日期选择器更改输入字段的内容后,验证不会自动触发

我感到好奇的是,当点击年份下拉列表,点击月份下拉列表以及点击日期时,验证触发。并且,在这些情况中都没有改变输入字段的值。你可以在这里试试:http://jsfiddle.net/ECku3/12/有一些console.log事件显示调用验证方法的时间,以及调用$.validator.showErrors()时验证字段的值。

TL;博士

我想找到一种在datepicker具有焦点时阻止验证的方法。但是,当用户键入日期而不是使用datepicker时,我不想阻止验证。所以我不能只设置$.validator.settings.onfocusout = false

想法?

1 个答案:

答案 0 :(得分:1)

我使用了jquery.ui.datepicker.validation.js插件,如下所示:

$(document).ready(function() {
    $.datepicker.setDefaults({
        dateFormat: 'yy-mm-dd',
        firstDay: 1,
        showOn: 'button',
        changeMonth: true,
        changeYear: true,

    });

    $("#mydate").datepicker();
    $('#myform').validate({ 
        errorPlacement: $.datepicker.errorPlacement, 
        rules: { 
            mydate: { 
                required: true, 
                dpDate: function(){traceBack(); return true;},
                dpCompareDate: 'notBefore 2011-01-01' 
            } 
        }, 
        messages: { 
            mydate: 'Please enter a valid date (yyyy-mm-dd) after 2011-01-01'
        }});

    function traceBack() {
        console.log("Firing?");
    }
});​

修改

如果您真的不希望在datepicker小部件中导航时触发任何验证事件,则可以在datepicker小部件可见时关闭onfocusout设置:

$(document).ready(function() {
    $.datepicker.setDefaults({
        dateFormat: 'yy-mm-dd',
        firstDay: 1,
        showOn: 'button',
        changeMonth: true,
        changeYear: true,
        beforeShow: function () {$("#myform").validate().settings.onfocusout = false; },
        onClose: function () {$("#myform").validate().settings.onfocusout = true;}
    });

    $("#mydate").datepicker();
    $('#myform').validate({ 
        errorPlacement: $.datepicker.errorPlacement, 
        rules: { 
            mydate: { 
                required: true, 
                dpDate: function(){traceBack(); return true;},
                dpCompareDate: 'notBefore 2011-01-01' 
            } 
        }, 
        messages: { 
            mydate: 'Please enter a valid date (yyyy-mm-dd) after 2011-01-01'
        }});

    function traceBack() {
        console.log("Firing?");
    }

});​

看到这个小提琴:http://jsfiddle.net/mccannf/Bn7gy/24/