【问题标题】:jQuery Datepicker Format Date on Manual InputjQuery Datepicker 手动输入格式日期
【发布时间】:2010-09-08 13:51:45
【问题描述】:

我有一个 jQuery 日期选择器,格式为:dd-MM-yyyy。

默认情况下,日期选择器会将 1-2-31-2-99 等日期转换为 01-02-200301-02-1999。但是,只有当您按下回车键或从日期选择器中选择日期时才会出现这种情况。我尝试使用以下方法在离开字段时自动格式化字段:

$j('.datepicker').live('blur', function(){
    $j(this).datepicker('setDate', $j(this).datepicker('getDate'));
});

在这种情况下,我使用的是 Datepicker 本身的实用函数 setDate 和 getDate。例如,当您使用键盘并使用 TAB 键输入日期时,此方法有效。但是,当您尝试用鼠标选择日期时,模糊触发器也会激活。因此,您必须用鼠标选择日期两次,因为第一次模糊事件会设置旧值。

有什么我错过的事件可以使用吗?

解决方法

不是很优雅,但它是部分解决方案:

var timeout;
$j('#geboortedatum').live('keypress', function() {
    if(timeout) {
        clearTimeout(timeout);
        timeout = null;
    }
    timeout = setTimeout(formatDate, 1000);
});

function formatDate() {
    var gebdat = $j('#geboortedatum').val();
    var dashCount = gebdat.split('-').length - 1;
    if(dashCount == 2 && gebdat.length >= 5) {
        $j('#geboortedatum').datepicker('setDate', $j('#geboortedatum').datepicker('getDate'));
    }
}

【问题讨论】:

    标签: jquery jquery-ui datepicker


    【解决方案1】:

    我只是在 datepicker istelf 中使用 onClose 事件:

    $(function(){
        var $myDate = $('#myDate');
        $myDate.datepicker({
          dateFormat: 'dd-mm-yy',
          onClose: function(dateText, inst) {
              $(this).datepicker('option', 'dateFormat', 'dd-mm-yy');                
        }
    });
    

    });​

    http://jsfiddle.net/RpUSL/

    【讨论】:

      【解决方案2】:

      您可以使用keypress 事件,但随后您必须决定有多少输入构成值得尝试自动格式化的内容。

      就个人而言,我更喜欢限制文本框接受的输入。为此,我推荐 jQuery Masked Input plugin

      【讨论】:

      • 但我想允许用户输入较短的符号,如 1-2-3。 keypress 可能值得尝试结合检查长度是否 >= 5 和 #dashes = 2 延迟 1 秒。
      • @Serkan - 如果这对你有用,那就太好了。然而,这种较短的符号实际上可能只是有问题,因为它完全是非标准的和模棱两可的。想想有多少问题只是因为日期1/2/2003 在某些语言环境中表示“2003 年 1 月 2 日”而在其他语言环境中表示“2003 年 2 月 1 日”。
      • 我完全同意这一点。但它是用于 Intranet 站点/应用程序的,我们可以假设它们都使用日-月-年表示法。
      • @Serkan - 很公平。 Intranet 应用程序肯定在不同的假设下运行。顺便说一句,如果您希望实现检查“长度 >= 5 和 #dashes = 2 延迟 1 秒”,那么我绝对推荐 throttle/debounce plugin 延迟。
      【解决方案3】:

      讨厌恢复死帖,但这是“jquery datepicker autoformat”的第一个搜索结果!我没有找到任何好的解决方案,所以这基本上就是我所做的:

      jQuery('#my_selecter').datepicker().keyup(function(e){
          if(e.keyCode != '8'){
              if (e.target.value.length == 2) e.target.value = e.target.value + "/";
              if (e.target.value.length == 5) e.target.value = e.target.value + "/";
          }
      })
      

      所有这些都放在斜杠中,因此用户可以快速键入日期。它也不会与删除按钮发生冲突。请记住,这仅适用于美国语言环境,而忽略其他事物(home 键、tab 键等)的问题。

      【讨论】:

        【解决方案4】:

        我的解决方案:

        $('input.datepicker').datepicker({
          dateFormat: 'dd-mm-yy',
          onClose: function(dateText, inst) {
            try {
              dateText = dateText.replace(/-(19|20)?/g,'');
              dateText = dateText.replace(/\/(19|20)?/g,'');
              if (dateText) {
                dateText = dateText.substr(0,2)+'-'+dateText.substr(2,2)+'-'+dateText.substr(4,2);
                $(this).datepicker('setDate', dateText);
              }
            } catch (err) {
              alert(dateText);
            }
          }
        };
        

        接受格式:

        dd-mm-yyyy (20th or 21th century)
        dd-mm-yy
        ddmmyy
        dd/mm/yyyy
        dd/mm/yy
        

        【讨论】:

          【解决方案5】:

          最后一个例子几乎是正确的,我稍微调整了一下,所以它实际上正确设置了日期并检查无效日期。

          $("#ClientDOB").datepicker({
            changeMonth: true,
            changeYear: true,
            dateFormat: 'dd-MM-yy',
            defaultDate: "1-January-70",
              onClose: function(dateText, inst) {
                     try {
                         var d = $.datepicker.parseDate('dd-mm-yy', dateText);
                         $(this).datepicker('setDate',d.getDate()+'-'+monthNames[d.getMonth()]+'-'+d.getFullYear());
                       } catch (err) { // what to do if it errors, just set to date 40 years ago
                         d=new Date();
                         $(this).datepicker('setDate',"1-January-"+(d.getFullYear()-40));
                       }
                }
          });
          

          【讨论】:

            【解决方案6】:

            这是一个简单的解决方案(请参阅 Brad 的解决方案了解用法):

            // Reformats the input when you leave the field
            onClose: function (dateText, inst) {
                // Get current datepicker's options
                var format = $(this).datepicker("option", "dateFormat");
                var settings = $(this).datepicker("option", "settings");
                // Parse input string
                var curDate = $.datepicker.parseDate(format, dateText, settings);
                // If it is indeed a date
                if (typeof curDate !== "undefined") {
                    // Update input field with formatted date
                    $(this).datepicker("setDate", curDate);
                }
            }
            

            此外,如果您的目标是允许多种输入日期格式,请参阅我在此主题上的回答: https://stackoverflow.com/a/53499829/5426777

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-09-17
              • 1970-01-01
              • 1970-01-01
              • 2019-08-04
              • 2014-11-05
              • 2012-04-01
              • 1970-01-01
              • 2014-01-04
              相关资源
              最近更新 更多