7

我有一些客户端验证来检查以确保EndDate大于或等于StartDate. 验证有效,但它没有像我希望的那样触发。我希望它在 datepicker 上选择日期后立即触发EndDate。我怎样才能做到这一点?我尝试了以下方法:

日期选择器代码:

$(".datepicker").datepicker({
    changeMonth: true,
    changeYear: true,
    onClose: function () {
        $(this).focusout();
    }
});

验证码:

$("#EndDate").focusout(function () {
    jQuery.validator.addMethod('datetimegreaterthanorequal', function (value, element, params) {
        var startDateValue = $(params.element).val();

        return Date.parse(value) >= Date.parse(startDateValue);
    }, '');

    jQuery.validator.unobtrusive.adapters.add('datetimegreaterthanorequal', ['startdate'], function (options) {
        var prefix = options.element.name.substr(0, options.element.name.lastIndexOf('.') + 1),
            other = options.params.startdate,
            fullOtherName = appendModelPrefix(other, prefix),
            element = $(options.form).find(':input[name=' + fullOtherName + ']')[0];

        options.rules['datetimegreaterthanorequal'] = {
            element: element
        };
        if (options.message) {
            options.messages['datetimegreaterthanorequal'] = options.message;
        }
    });

    function appendModelPrefix(value, prefix) {
        if (value.indexOf('*.') === 0) {
            value = value.replace('*.', prefix);
        }
        return value;
    }
})
4

2 回答 2

12

尽管 Mark 的回答会起作用,但您应该注意,它将验证整个表单。如果您只想验证相关的输入字段,最好这样做:

$(".datepicker").datepicker({
    onSelect: function () {
        $(this).trigger("focus").trigger("blur");
    }
});

这会伪造用户在输入字段内单击并再次离开。

于 2013-11-07T14:50:57.823 回答
9

您正在我们的.focusout()活动中分配验证器。完全删除该块,因为您希望它们只分配一次。

您可以轻松触发对onSelect选项的验证,如下所示:

$(".datepicker").datepicker({
    changeMonth: true,
    changeYear: true,
    onSelect: function () {
        $("#myForm").valid();
    }
});
于 2013-05-07T13:46:11.927 回答