1

我正在尝试编写一些 Javascript 来从两个文本输入中获取值,这应该相当简单。但有些不对劲。这是我的代码:

<script>
    jQuery(function() {
        jQuery('#fromPicker, #toPicker').datepicker({ dateFormat : 'yy-mm-dd' });

        jQuery('#submit').attr('disabled', 'disabled');

        jQuery('#toPicker').on('blur', function() {
            var fromDate = jQuery('#fromPicker').val();
            var toDate = jQuery('#toPicker').val();
            console.log(toDate);

            if (fromDate !== '' && toDate !== '') {
                if (isValidDate(fromDate) && isValidDate(toDate)) {
                    jQuery('#submit').removeAttr('disabled');
                } else {
                    alert('You must enter dates in the format "yyyy-mm-dd"');
                }
            } 
        });
    });

    function isValidDate(dt) {
        if (dt.match(/^[0-9]{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])/)) {
            return true;
        }
    }
</script>

但是,当console.log(toDate)我得到一个空字符串时。但是,如果我blur再次执行另一个事件(聚焦和取消聚焦仍然在其中的数据的字段),我会得到正确的值。任何想法为什么它第一次不起作用?

两个文本输入的 ID 为#fromPicker#toPicker,并且是 jQueryUI 日期选择器。

解决方案:

最终做了我想要的是:

jQuery(function() { jQuery('#fromPicker, #toPicker').datepicker({ dateFormat : 'yy-mm-dd' });

    jQuery('#submit').on('click', function() {
        var fromDate = jQuery('#fromPicker').val();
        var toDate = jQuery('#toPicker').val();

        if (fromDate !== '' && toDate !== '') {
            if (isValidDate(fromDate) && isValidDate(toDate)) {
                // do nothing
            } else {
                alert('You must enter dates in the format "yyyy-mm-dd"');
                return false;
            }
        } else {
            return false;
        }
    });
});

function isValidDate(dt) {
    if (dt.match(/^[0-9]{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])/)) {
        return true;
    }
} </script>
4

2 回答 2

2

当用户在输入字段外点击(选择日期)时,输入字段会模糊。没有办法解决这个问题。因此,不要触发模糊验证,而是使用 datepicker 的 onSelect 回调。

$('.selector').datepicker({
    onSelect: function(dateText) { /* validation here */ }
});

如果您想保留 onblur 事件,您可以推迟验证以允许日期选择器在验证触发之前填写该字段,如下所示:

$('#myform input').blur(function () {
    setTimeout(function () { /* validation here */ }, 1);
});

使用 setTimeout 处理并发问题可能看起来像一个 hack,但由于 JavaScript 的单线程特性,它工作得非常好。jQuery-fame 的 John Resig 在这篇博文中谈到了它。

链接到原始帖子

于 2013-07-23T18:24:48.797 回答
2

我没有看到您的代码不起作用的任何原因,而是blur尝试onselect使用 datepicker的事件而不是事件

jQuery('#toPicker').datepicker( {
    onSelect: function(date) {
        alert(date);
        // Do other stuff
    },
    // ....
);
于 2013-07-23T18:22:06.707 回答