Jquery ui 如何禁用新的Chrome HTML5日期输入?

Jquery ui 如何禁用新的Chrome HTML5日期输入?,jquery-ui,google-chrome,date,input,datepicker,Jquery Ui,Google Chrome,Date,Input,Datepicker,Chrome的最新更新(v20.x)用新的内置日期和时间输入类型打破了我的一个表单。我在一个日期字段上调用jQueryUIDatePicker,它在更新之前工作得非常好。更新后,Chrome会覆盖我的占位符,并使jQueryUI小部件无法使用 你知道如何防止Chrome在不改变输入字段类型的情况下弄乱输入字段吗?你有几种不同的选择 您可以通过嗅探用户代理字符串并防止单击事件来检测用户正在使用Chrome if (navigator.userAgent.indexOf('Chrome') != -

Chrome的最新更新(v20.x)用新的内置日期和时间输入类型打破了我的一个表单。我在一个日期字段上调用jQueryUIDatePicker,它在更新之前工作得非常好。更新后,Chrome会覆盖我的占位符,并使jQueryUI小部件无法使用


你知道如何防止Chrome在不改变输入字段类型的情况下弄乱输入字段吗?

你有几种不同的选择

您可以通过嗅探用户代理字符串并防止单击事件来检测用户正在使用Chrome

if (navigator.userAgent.indexOf('Chrome') != -1) {
    $('input[type=date]').on('click', function(event) {
        event.preventDefault();
    });
}
,但这会起作用

在我看来,理想的方法是检测浏览器是否支持本机日期选择器,如果它确实使用它,如果不使用jQuery UI

if (!Modernizr.inputtypes['date']) {
    $('input[type=date]').datepicker({
        // Consistent format with the HTML5 picker
        dateFormat: 'yy-mm-dd'
    });   
}​
示例-

当然,由于Chrome支持原生日期选择器,用户会看到它而不是jQuery UI。但至少你不会有一个功能冲突,用户界面将可供最终用户使用

这引起了我的兴趣,所以我写了一些关于使用jQueryUI的日期选择器和本机控件-

编辑 如果您感兴趣,我最近做了一个关于使用jQueryUI的小部件和HTML5表单控件的演讲


    • 我完全同意TJ

      如果您正在对日期值进行任何类型的编辑、预填充或动态设置,您还需要从2013年7月3日起了解这一点。它将以本地格式(美国为“mm/dd/yy”)向用户显示日期,但将忽略HTML中设置的任何非ISO标准格式的值

      要在页面加载时转换,可以使用TJ的用户代理嗅探器并执行以下操作:

      if (navigator.userAgent.indexOf('Chrome/2') != -1) {
          $('input[type=date]').each(function(){
              var d = trim(this.getAttribute('value'));
              if (d){
                  d = new Date(d);
                  var dStr = d.toISOString().split('T')[0];
                  this.value = dStr; 
              }
          });
      }
      
      例如,如果您选择禁用本机日期选择器并使用jQuery,则还需要设置日期格式以匹配Chrome的日期字段,否则它将不会显示jQuery日期选择器发送的输入:

      $('#myDate').datepicker({dateFormat: 'yy-mm-dd'});
      
      将这两件事添加到TJ答案中的第一个选项中,jQuery的日期选择器就可以在Chrome中正常工作了

      理想情况下,依赖本机日期选择器是最好的解决方案。但当你需要支持黑屏日期、日期范围的东西时,或者你只是想让它看起来更漂亮,这就行了

      这对我很有用:

      ;
      (function ($) {
          $(document).ready(function (event) {
              $(document).on('click input', 'input[type="date"], input[type="text"].date-picker', function (e) {
                  var $this = $(this);
                  $this.prop('type', 'text').datepicker({
                      showOtherMonths: true,
                      selectOtherMonths: true,
                      showButtonPanel: true,
                      changeMonth: true,
                      changeYear: true,
                      dateFormat: 'yy-mm-dd',
                      showWeek: true,
                      firstDay: 1
                  });
      
                  setTimeout(function() {
                      $this.datepicker('show');
                  }, 1);
              });
          });
      })(jQuery, jQuery.ui);
      

      要删除箭头和旋转按钮,请执行以下操作:

      .unstyled::-webkit-inner-spin-button,
      .unstyled::-webkit-calendar-picker-indicator {
          display: none;
          -webkit-appearance: none;
      }
      
      您仍然可以通过按Alt+向下箭头(在windows 10上选中)激活日历

      要禁用,您需要添加一点JavaScript:

      dateInput.addEventListener('keydown', function(event) {
          if (event.keyIdentifier == "Down") {
              event.preventDefault()
          }
      }, false);
      

      我将删除[type=date]。不管是好是坏,jQueryUI插件将为您提供更细粒度的控制。事实上,除了该插件在触摸设备上几乎不可用之外。除了在语义上是正确的做法外,保留类型的好处是利用触摸设备上的本机日期和时间选择器。明白了,这是一个合法的用例。我会更新我的答案。我相信Chrome的当前版本已经消除了这个问题。看看这个库,它除了其他功能外,还做了这种基于功能的多填充(它也使用Modernizer和jQuery UI),但适用于所有输入类型,还实现了所有HTML5表单JS API(用于验证、可访问性等)当Chrome升级到新版本时,这个功能似乎会崩溃30@Bryan为什么会这样(我很想知道,因为我目前正在使用类似于上面的修复程序),因为他正在检查“Chrome/2”字符串。一旦到了版本30,这个字符串将不再是userAgent的一部分