【问题标题】:How to make <input type="date"> supported on all browsers? Any alternatives?如何使所有浏览器都支持 <input type="date">?有什么选择吗?
【发布时间】:2013-08-03 23:07:33
【问题描述】:

我正在使用 HTML5 元素的输入属性,只有 Google Chrome 支持日期、时间属性。我试过Modernizr,但我不明白如何将它集成到我的网站上(关于如何编码/什么是语法/包含)。关于如何使用所有浏览器的日期、时间属性的任何代码 sn-p。

【问题讨论】:

  • 你在使用什么样的控件?也许 JQuery UI 会是完美的??
  • 请注意,如果您还没有依赖 jQueryUI 做某事,包括其庞大的重量只是为了填充日期输入不应该是默认决定。
  • html5doctor.com/…提供了一个完整的例子

标签: javascript jquery html jquery-ui


【解决方案1】:

任何不支持输入类型date的浏览器都会默认为标准类型text,所以你要做的就是检查类型property (不是属性),如果不是date,则浏览器不支持日期输入,你自己添加日期选择器:

if ( $('[type="date"]').prop('type') != 'date' ) {
    $('[type="date"]').datepicker();
}

FIDDLE

你当然可以使用任何你想要的日期选择器,jQuery UI 的日期选择器可能是最常用的一个,但是如果你不将 UI 库用于其他任何事情,它确实会添加相当多的 javascript,但是有数百个可供选择的替代日期选择器。

type 属性永远不会改变,浏览器只会回退到属性的默认text 类型,所以必须检查属性。
该属性仍然可以用作选择器,如上例所示。

【讨论】:

  • 使用 jQuery 来检查属性可能比下拉到 DOM 更好? $('input').prop('type') != 'date'
  • 您也可以对想要保留文本位的文本输入进行一些过滤,可以通过添加 class="date" 或其他内容来完成
  • 如果不支持“日期”,则输入的“类型”会更改为“文本”,但“类型”属性仍为“日期”。所以这可以很容易地用作选择器。我以这种方式更新了小提琴:jsfiddle.net/2AaFk/34
  • @MichaelWyraz 我检查了你的小提琴,它似乎无法在 safari 浏览器上运行。
  • 这对我有用,只是注意到我没有所需的 css,我在这个线程上找到了它:stackoverflow.com/a/29791769/1339326
【解决方案2】:

Modernizr 实际上并没有改变新的 HTML5 输入类型的处理方式。这是一个检测器的功能,而不是垫片(&lt;header&gt;&lt;article&gt; 等除外,它被当作类似于&lt;div&gt; 的块元素处理)。

要使用&lt;input type='date'&gt;,您需要在自己的脚本中检查Modernizr.inputtypes.date,如果它为假,请打开另一个提供日期选择器的插件。您有数千种选择; Modernizr 维护a non-exhaustive list of polyfills,这可能会给你一个开始的地方。或者,您可以放手 - 所有浏览器在出现他们无法识别的输入类型时都会退回到text,因此最糟糕的情况是您的用户必须输入日期。 (你可能想给他们一个占位符或使用类似 jQuery.maskedinput 的东西来让他们保持正常。)

【讨论】:

    【解决方案3】:

    您要求提供 Modernizr 示例,那么就可以了。此代码使用 Modernizr 来检测是否支持“日期”输入类型。如果不支持,则返回 JQueryUI 日期选择器。

    注意:您需要下载 JQueryUI,并可能在您自己的代码中更改 CSS 和 JS 文件的路径。

    <!DOCTYPE html>
    <html>
        <head>
            <title>Modernizer Detect 'date' input type</title>
            <link rel="stylesheet" type="text/css" href="jquery-ui-1.10.3/themes/base/jquery.ui.all.css"/>
            <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/modernizr/modernizr-1.7-development-only.js"></script>
            <script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
            <script type="text/javascript" src="jquery-ui-1.10.3/ui/jquery.ui.core.js"></script>
            <script type="text/javascript" src="jquery-ui-1.10.3/ui/jquery.ui.widget.js"></script>
            <script type="text/javascript" src="jquery-ui-1.10.3/ui/jquery.ui.datepicker.js"></script>
            <script type="text/javascript">
                $(function(){
                    if(!Modernizr.inputtypes.date) {
                        console.log("The 'date' input type is not supported, so using JQueryUI datepicker instead.");
                        $("#theDate").datepicker();
                    }
                });
            </script>
        </head>
        <body>
            <form>
                <input id="theDate" type="date"/>
            </form>
        </body>
    </html>
    

    我希望这对你有用。

    【讨论】:

    【解决方案4】:
       <script>
          var datefield = document.createElement("input")
          datefield.setAttribute("type", "date")
          if (datefield.type != "date") { // if browser doesn't support input type="date", load files for jQuery UI Date Picker
             document.write('<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css" />\n')
             document.write('<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"><\/script>\n')
             document.write('<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"><\/script>\n')
          }
       </script>
    
     <script>
        if (datefield.type != "date") { // if browser doesn't support input type="date", initialize date picker widget:
           jQuery(function($) { // on document.ready
               $('#birthday').datepicker();
           }); <- missing semicolon
        }
     </script>
    

    <body>
     <form>
       <b>Date of birth:</b>
       <input type="date" id="birthday" name="birthday" size="20">
       <input type="button" value="Submit" name="B1">
     </form>
    </body>
    

    SOURCE 1 & SOURCE 2

    【讨论】:

      【解决方案5】:

      这是一篇观点文章,但我们在WebShims 方面取得了巨大成功。如果 native 不可用,它可以完全衰减使用 jQuery datepicker。 Demo here

      【讨论】:

        【解决方案6】:

        只需在&lt;head&gt; 部分中使用&lt;script src="modernizr.js"&gt;&lt;/script&gt;,脚本就会添加类来帮助您区分两种情况:当前浏览器是否支持。

        另外,请按照此线程中发布的链接进行操作。它会帮助你:HTML5 input type date, color, range support in Firefox and Internet Explorer

        【讨论】:

          【解决方案7】:

          Chrome 版本 50.0.2661.87 m 在分配给变量时不支持 mm-dd-yy 格式。它使用 yy-mm-dd。 IE 和 Firefox 按预期工作。

          【讨论】:

            【解决方案8】:

            我发现最好的简单和有效的解决方案是,在以下浏览器上工作

            1. 谷歌浏览器
            2. 火狐
            3. 微软边缘
            4. Safari

              <!doctype html>
              <html>
              <head>
              <meta charset="utf-8">
              <title>Untitled Document</title>
              </head>
              
              <body>
              <h2>Poly Filler Script for Date/Time</h2>
              <form method="post" action="">
                  <input type="date" />
                  <br/><br/>
                  <input type="time" />
              </form>
              
              <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
              <script src="http://cdn.jsdelivr.net/webshim/1.12.4/extras/modernizr-custom.js"></script>
              <script src="http://cdn.jsdelivr.net/webshim/1.12.4/polyfiller.js"></script>
              <script>
                webshims.setOptions('waitReady', false);
                webshims.setOptions('forms-ext', {type: 'date'});
                webshims.setOptions('forms-ext', {type: 'time'});
                webshims.polyfill('forms forms-ext');
              </script>
              
              </body>
              </html>
              

            【讨论】:

              【解决方案9】:

              双脚本包含解决方案 (2019):

              只需在您的脚本部分包含 Better-DomBetter-Dateinput-Polyfill

              这是一个演示:
              http://chemerisuk.github.io/better-dateinput-polyfill/

              【讨论】:

                【解决方案10】:

                我遇到了问题,维护英国 dd/mm/yyyy 格式,我最初使用来自 adeneo https://stackoverflow.com/a/18021130/243905 的答案,但这对我来说在 safari 中不起作用,所以改为这个,据我所知全部工作 - 使用 jquery-ui datepicker,jquery 验证。

                if ($('[type="date"]').prop('type') !== 'date') {
                    //for reloading/displaying the ISO format back into input again
                    var val = $('[type="date"]').each(function () {
                        var val = $(this).val();
                        if (val !== undefined && val.indexOf('-') > 0) {
                            var arr = val.split('-');
                            $(this).val(arr[2] + '/' + arr[1] + '/' + arr[0]);
                        }
                    });
                
                    //add in the datepicker
                    $('[type="date"]').datepicker(datapickeroptions);
                
                    //stops the invalid date when validated in safari
                    jQuery.validator.methods["date"] = function (value, element) {
                        var shortDateFormat = "dd/mm/yy";
                        var res = true;
                        try {
                            $.datepicker.parseDate(shortDateFormat, value);
                        } catch (error) {
                            res = false;
                        }
                        return res;
                    }
                }
                

                【讨论】:

                  【解决方案11】:
                  <html>
                  <head>
                  <title>Date picker works for all browsers(IE, Firefox, Chrome)</title>
                  <script>
                      var datefield = document.createElement("input")
                      datefield.setAttribute("type", "date")
                      if (datefield.type != "date") { // if browser doesn't support input type="date", load files for jQuery UI Date Picker
                          document.write('<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css" />\n')
                          document.write('<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"><\/script>\n')
                          document.write('<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"><\/script>\n')
                      }
                  </script>
                  
                  <script>
                      if (datefield.type != "date") { // if browser doesn't support input type="date", initialize date picker widget:
                          jQuery(function($) { // on document.ready
                              $('#start_date').datepicker({
                                  dateFormat: 'yy-mm-dd'
                              });
                              $('#end_date').datepicker({
                                  dateFormat: 'yy-mm-dd'
                              });
                          })
                      }
                  </script>
                  </head>
                  <body>
                      <input name="start_date" id="start_date" type="date" required>
                      <input name="end_date" id="end_date" required>
                  </body>
                  </html>
                  

                  【讨论】:

                    猜你喜欢
                    • 2017-01-16
                    • 2014-05-04
                    • 1970-01-01
                    • 2012-04-28
                    • 2013-11-21
                    • 2011-04-20
                    • 1970-01-01
                    • 2011-09-15
                    相关资源
                    最近更新 更多