Cách nhận loại đầu vào HTML 5 = Ngày hẹn hò làm việc trong Firefox và / hoặc IE 10


191

Tôi thấy thật kỳ lạ khi input type="date"vẫn không được hỗ trợ trong Firefox sau tất cả thời gian này. Trên thực tế, tôi không nghĩ rằng họ đã thêm nhiều (nếu có) trong HTML 5 loại mới vào một yếu tố đầu vào. Không ngạc nhiên khi nó không được hỗ trợ trong IE10. Vì vậy, câu hỏi của tôi là ...

Làm thế nào để có được type="date"một inputphần tử hoạt động mà không cần thêm, nhưng một tệp .js khác (cụ thể là jQueryUIDatePicker Widget) chỉ để lấy lịch / ngày chỉ cho Trình duyệt IE và Firefox? Có cái gì đó ngoài kia có thể được áp dụng ở đâu đó (có lẽ là CDN?) Sẽ làm cho chức năng này hoạt động theo mặc định trong Firefox và / hoặc Trình duyệt IE ?? Cố gắng nhắm mục tiêu trình duyệt IE 8+ và đối với Firefox, không thành vấn đề, phiên bản mới nhất (28.0) sẽ ổn.

CẬP NHẬT: Firefox 57+ hỗ trợ kiểu nhập = ngày


29
Có vẻ nực cười với tôi rằng Firefox vẫn không hỗ trợ điều này. Tôi đã chuyển từ Chrome sang Firefox ngày hôm nay, chỉ trong một ngày / tuần để xem những gì những ngày này, và điều này ngay lập tức khiến tôi muốn chuyển trở lại!
Codemonkey

19
đó là một trò đùa FF không phải là ngày hẹn hò
SuperUberDuper

6
Đây là lý do tại sao tôi cảm thấy khó chịu khi mọi người nói Firefox là trình duyệt tốt nhất.
Martin Braun

1
Mặc dù không phải là một polyfill, nhưng cuối cùng tôi đã sử dụng pickaday , đó là một js lib đơn giản mà không cần jquery hoặc các phụ thuộc khác ...
mb21

2
Có vẻ như đang hoạt động theo mặc định trong Firefox 57. Tuy nhiên!
Antoine Pinsard

Câu trả lời:


138

Bạn có thể thử webshims , có sẵn trên cdn + chỉ tải polyfill, nếu cần.

Đây là bản demo với CDN: http://jsfiddle.net/trixta/BMEc9/

<!-- cdn for modernizr, if you haven't included it already -->
<script src="http://cdn.jsdelivr.net/webshim/1.12.4/extras/modernizr-custom.js"></script>
<!-- polyfiller file to detect and load polyfills -->
<script src="http://cdn.jsdelivr.net/webshim/1.12.4/polyfiller.js"></script>
<script>
  webshims.setOptions('waitReady', false);
  webshims.setOptions('forms-ext', {types: 'date'});
  webshims.polyfill('forms forms-ext');
</script>

<input type="date" />

Trong trường hợp cấu hình mặc định không thỏa mãn, có nhiều cách để cấu hình nó. Ở đây bạn tìm thấy cấu hình datepicker .

Lưu ý: Mặc dù có thể có các bản phát hành lỗi mới cho webshim trong tương lai. Sẽ không có bất kỳ bản phát hành lớn nào nữa. Điều này bao gồm hỗ trợ cho jQuery 3.0 hoặc bất kỳ tính năng mới nào.


Đây là một giải pháp tốt, cấu hình rất phong phú, nhưng tôi không thể tìm thấy nơi đặt định dạng ngày như "YYYY / MM / DD"
Pavel Niedoba

14
Tôi gặp lỗi "quyền truy cập bị từ chối" khi tôi cố chạy jsfiddle này trong IE 11 và trình chọn ngày không hoạt động.
Shavais

4
Điều này không hoạt động trên IE10 ... tôi gặp lỗi tương tự như được đề cập bởi @Shavais ... để làm cho nó hoạt động nâng cấp phiên bản jquery lên 1.11 trở lên..thử liên kết
Nitin

2
Thật không may, việc hỗ trợ webshims cho Jquery 3 sắp tới sẽ không được thực hiện, như được thông báo trên trang của tác giả. Được như vậy, tôi sẽ dựa vào UI Jquery tốt và cũ.
marion maiden

1
Điều này chắc chắn hoạt động trong firefox. Nhưng không hoạt động trong IE
Varuni NR

27

Nó có trong Firefox kể từ phiên bản 51 (ngày 26 tháng 1 năm 2017), nhưng nó không được kích hoạt theo mặc định (chưa)

Để kích hoạt nó:

về: cấu hình

dom.forms.datetime -> đặt thành đúng

https://developer.mozilla.org/en-US/Firefox/Experimental_features


Rất vui khi nghe điều này. Nên mặc định imo. Nhưng điều này là tốt để biết.
Solomon Closson

Tôi đang dùng FF 64.0.2, nhưng mặc dù tùy chọn này là "true" (bật) nhưng nó không hoạt động, hộp datetime vẫn chỉ là văn bản. Tôi đã cố gắng kích hoạt "đồng hồ bấm giờ" nhưng cũng không thành công.
Wazed_Coder

20

Có một cách đơn giản để thoát khỏi hạn chế này bằng cách sử dụng thành phần datePicker do jQuery cung cấp.

  1. Bao gồm các thư viện UI và jQuery UI (Tôi vẫn đang sử dụng một thư viện cũ)

    • src = "js / jquery-1.7.2.js"
    • src = "js / jquery-ui-1.7.2.js"
  2. Sử dụng snip sau

    $(function() {
         $( "#id_of_the_component" ).datepicker({ dateFormat: 'yy-mm-dd'}); 
    });

Xem jQuery UI DatePicker - Thay đổi định dạng ngày nếu cần.


8
OP nói "làm việc mà không cần thêm, nhưng một tệp .js khác (cụ thể là jQueryUI DatePicker Widget)" ... nhưng câu hỏi này là câu hỏi hàng đầu của google, vì vậy câu trả lời của bạn vẫn RẤT hữu ích mặc dù nó không trả lời câu hỏi. Tôi ước tôi không phải cảm thấy tồi tệ khi nâng cấp bài viết của bạn bây giờ.
phil294

2
Bạn cũng cần bao gồm CSS UI UI để hiển thị lịch chính xác. <br> <link rel = "styleheet" href = "// code.jquery.com/ui/1.12.0/theme/base/jquery-ui.css">
YuAn Shaolin Maculelê Lai

16

Loại = "ngày" không phải là một đặc điểm kỹ thuật thực tế tại thời điểm này. Đây là một khái niệm Google đã đưa ra và nằm trong thông số kỹ thuật whatwg của họ (không chính thức) và chỉ được Chrome hỗ trợ một phần.

http://caniuse.com/#search=date

Tôi sẽ không dựa vào loại đầu vào này vào thời điểm này. Nó sẽ là tốt đẹp để có, nhưng tôi không thấy trước điều này thực sự làm cho nó. Lý do số 1 là nó đặt quá nhiều gánh nặng lên trình duyệt để xác định UI tốt nhất cho đầu vào hơi phức tạp. Hãy suy nghĩ về nó từ góc độ đáp ứng, làm thế nào bất kỳ nhà cung cấp nào biết những gì sẽ hoạt động tốt nhất với giao diện người dùng của bạn nói ở 400 pixel, 800 pixel và rộng 1200 pixel?


138
Tôi không đồng ý, các trình duyệt nên đủ thông minh để tìm ra điều này. Tôi thực sự mệt mỏi khi sử dụng các công cụ chọn ngày ngoài kia và phải tiếp tục cập nhật chúng.
SuperUberDuper

49
Lý luận kỳ lạ. Quá nhiều gánh nặng cho các trình duyệt, nhưng không phải cho nhà phát triển web joe?!?
jeroenh

35
Đây hiện là một phần của dự thảo làm việc HTML 5: w3.org/html/wg/dcraft/html/master/ mẹo
Chris

7
Tôi cũng mừng cho mọi loại đầu vào mới. Chúng được xác định tốt hơn, và bản địa, thường có nghĩa là nhanh chóng.
Tomáš Zato - Phục hồi Monica

5
@MM Cảm ơn. Trong khi đó, HTML 5 đã được nâng cấp lên thành khuyến nghị chính thức của W3C. Liên kết mới là w3.org/TR/2014/REC-html5-20141028/ cấp
Chris

9

Dưới đây là một ví dụ đầy đủ với ngày được định dạng trong YYYY-MM-DD

<script type="text/javascript" src="http://code.jquery.com/jquery-2.1.4.min.js"></script> 
<script src="//cdn.jsdelivr.net/webshim/1.14.5/polyfiller.js"></script>
<script>
webshims.setOptions('forms-ext', {types: 'date'});
webshims.polyfill('forms forms-ext');
$.webshims.formcfg = {
en: {
    dFormat: '-',
    dateSigns: '-',
    patterns: {
        d: "yy-mm-dd"
    }
}
};
</script>
<input type="date" />

1
Có ai biết nếu điều này cho phép tùy chọn để thêm một bộ chọn thời gian không?
drooh

Tôi đã thử tập lệnh của bạn trong JSFiddle @Drooh nhưng nó không hoạt động. Mỗi lần tôi chọn một ngày, nó sẽ xuất hiện trong một phần nghìn giây trong trường đầu vào và sau đó biến mất. Ai đó có thể cung cấp một phiên bản fiddle hoạt động với cấu hình ngày dd / mm / yyyy không?
Ryan Coolwebs

Lưu ý, kể từ tháng 8 năm 2016 webshim không hoạt động với jQuery 3 và trong thử nghiệm của tôi, nó cũng không hoạt động với 2.2.4.
drooh

Tôi thấy đây là giải pháp tốt nhất cho đến khi firefox thêm ngày stackoverflow.com/questions/2528706/iêu
drooh

4

Mặc dù điều này không cho phép bạn có được một ứng dụng hẹn hò, nhưng Mozilla cho phép sử dụng mẫu, do đó, ít nhất bạn có thể có được xác thực ngày với một cái gì đó như thế này:

pattern='(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))'

Cuối cùng, tôi đồng ý với @SuperUberDuper rằng Mozilla đang đi phía sau bao gồm cả điều này.


1
Có phiên bản nào cho "thời gian" không?
Malcolm Salvador

1
Hãy mở rộng về ví dụ này. Đây có phải là một thuộc tính html cho đầu vào?
Wazed_Coder

3

Đây chỉ là một gợi ý theo sau câu trả lời của Dax. (Tôi sẽ đưa nó vào một bình luận tại câu trả lời đó, nhưng tôi chưa có đủ danh tiếng để bình luận về các câu hỏi của người khác).

Id phải là duy nhất cho mọi trường, vì vậy, nếu bạn có nhiều trường ngày trong biểu mẫu (hoặc biểu mẫu), bạn có thể sử dụng phần tử lớp thay vì ID:

 $(function() { $( ".datepicker" ).datepicker({ dateFormat: 'yy-mm-dd' }); });

và đầu vào của bạn là:

 <input type="text" class="datepicker" name="your-name" />

Bây giờ, mỗi khi bạn cần bộ chọn ngày, chỉ cần thêm lớp đó. PS Tôi biết, bạn vẫn phải sử dụng js :(, nhưng ít nhất bạn đã đặt cho tất cả trang web của mình. 2 xu của tôi ...


3

Phiên bản mới nhất của firefox the firefox 57 (Quantum) hỗ trợ ngày và các tính năng khác được phát hành vào ngày 14 tháng 11 năm 2017. Bạn có thể tải xuống bằng cách nhấp vào liên kết này


0

Cảm ơn Alexander, tôi đã tìm ra cách sửa đổi định dạng cho en lang. (Không biết lang nào sử dụng định dạng như vậy)

 $.webshims.formcfg = {
        en: {
            dFormat: '/',
            dateSigns: '/',
            patterns: {
                d: "yy/mm/dd"
            }
        }
     };

 $.webshims.activeLang('en');

Tôi nghĩ quốc gia duy nhất sử dụng định dạng đó là Canada. Trong mọi trường hợp, 'en' là mơ hồ, bởi vì nó cũng bao gồm Hoa Kỳ, nơi có định dạng ngày 'đặc biệt' khá nhiều.
Michael Scheper

Trong trường hợp của tôi, đó là về ghi đè định dạng ngày cho bất kỳ ngôn ngữ khách hàng nào, có thể khác nhau trên các máy trạm của khách hàng. Tuy nhiên trên một trang cụ thể tôi muốn sử dụng định dạng ngày này (vì lý do sao chép dán). Nó giống như bình luận cho câu trả lời của Alexander Farkas nhưng tôi đặt câu trả lời riêng vì tôi không thể dán mã vào bình luận. Tôi đang sử dụng điều này trong môi trường sản xuất trong hơn một năm.
Pavel Niedoba

Hãy cẩn thận. Nếu Webshims dựa vào giải thích trình duyệt của miền địa phương, bạn có thể có kết quả không thể đoán trước. 'en' có lẽ sẽ không có nghĩa là cùng định dạng trên các nền tảng khác nhau (tùy thuộc vào ngôn ngữ hệ thống) hoặc thậm chí trong các trình duyệt khác nhau. Nó có thể được hiểu là 'en-ca' bởi một trình duyệt ở Canada (rất có thể là yyyy-mm-dd, nhưng có thể không nhất quán) nhưng là 'en-in' bởi một trình duyệt ở Ấn Độ (giống như hầu hết thế giới , sẽ tạo ra dd-mm-yyyy). Chỉ vì mã sản xuất không có nghĩa là nó đã được kiểm tra chính xác, rất nhiều lỗi i18n tồn tại trong mã sản xuất, ngay cả trên các trang web lớn.
Michael Scheper

Dòng cuối cùng $ .webshims.activeLang ('en'); nên buộc lang (hoặc ngôn ngữ) vào webshims ghi đè cài đặt trình duyệt, để định dạng luôn giống nhau.
Pavel Niedoba

0

Đôi khi bạn không muốn sử dụng Datepicker http://jqueryui.com/datepicker/ trong dự án của bạn vì:

  • Bạn không muốn sử dụng jquery
  • Xung đột các phiên bản jquery trong dự án của bạn
  • Lựa chọn của năm không thuận tiện. Ví dụ: bạn cần 120 lần nhấp vào nút trước để chuyển sang 10 năm trước.

Xin vui lòng xem mã trình duyệt chéo rất đơn giản của tôi để nhập ngày. Mã của tôi chỉ áp dụng nếu trình duyệt của bạn không hỗ trợ nhập kiểu ngày

<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Input Key Filter Test</title>
	<meta name="author" content="Andrej Hristoliubov anhr@mail.ru">
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
	
	<!-- For compatibility of IE browser with audio element in the beep() function.
	https://www.modern.ie/en-us/performance/how-to-use-x-ua-compatible -->
	<meta http-equiv="X-UA-Compatible" content="IE=9"/>
	
	<link rel="stylesheet" href="https://rawgit.com/anhr/InputKeyFilter/master/InputKeyFilter.css" type="text/css">		
	<script type="text/javascript" src="https://rawgit.com/anhr/InputKeyFilter/master/Common.js"></script>
	<script type="text/javascript" src="https://rawgit.com/anhr/InputKeyFilter/master/InputKeyFilter.js"></script>
	
</head>
<body>
	<h1>Date field</h1>
    Date:
    <input type='date' id='date' />
    New date: <span id="NewDate"></span>
    <script>
        CreateDateFilter('date', {
                formatMessage: 'Please type date %s'
                , onblur: function (target) {
                    if (target.value == target.defaultValue)
                        return;
                    document.getElementById('NewDate').innerHTML = target.value;
                }
                , min: new Date((new Date().getFullYear() - 10).toString()).toISOString().match(/^(.*)T.*$/i)[1]//'2006-06-27'//10 years ago
                , max: new Date().toISOString().match(/^(.*)T.*$/i)[1]//"2016-06-27" //Current date
                , dateLimitMessage: 'Please type date between "%min" and "%max"'
            }
        );
    </script>

</body>
</html>


3
Mã này hoàn toàn thất bại. Tôi không thể nhập một ngày vì trường đã được điền "YYY-MM-DD" và nếu tôi cố gắng xóa nó, nó sẽ xuất hiện lại.
Stephen R

Xin vui lòng không xóa dấu gạch nối. Tôi đã thử nghiệm thành công trong Windows 10 Google Chrome 52, Firefox 41, Opera 39, Microsoft Edge, IE 11. Xin vui lòng cho tôi biết thiết bị, hệ điều hành và trình duyệt của bạn.
Andrej

Tôi thực sự chỉ cần nhấn vào liên kết "Run Code Snippet" ngay bên dưới bình luận của bạn. Tôi không thể nhập đúng ngày vì trình giữ chỗ "YYYY-MM-DD" đang cạnh tranh tích cực với tôi thay vì biến mất khi tôi bắt đầu nhập. Tôi đang sử dụng Firefox mới nhất trên Windows 10.
Stephen R

1
không trả lời câu hỏi vì vi phạm điều kiện không thêm các tệp JS bên ngoài và thực tế bản thân mã là hoàn toàn không trực quan để sử dụng. buộc định dạng ISO đối với mọi người ngay cả khi nó không phải là định dạng ngày gốc của họ, không thể nhập một ngày mới khi mặt nạ đầu vào xuất hiện lại, không thể loại mặt nạ đầu vào vì nó không phải là mặt nạ mà là văn bản thực tế trong hộp, phải xóa mặt nạ như bạn gõ. dù sao cũng không tốt hơn một đầu vào tiêu chuẩn với xác nhận regex
MikeT



-1

Tôi đã phải sử dụng bootstrap-datepickerplugin để lịch hoạt động trên Firefox 55 Portable:

https://bootstrap-datepicker.readthedocs.io/en/latest/

Tương thích với Bootstrap v2 và v3. Nó đi kèm với một bản định kiểu độc lập để bạn không phải phụ thuộc vào Bootstrap.

Sử dụng:

<input class="datepicker">

$('.datepicker').datepicker({
    format: 'mm/dd/yyyy'
});

-2
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>jQuery UI Datepicker - Default functionality</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
  <script src="//code.jquery.com/jquery-1.10.2.js"></script>
  <script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
  <link rel="stylesheet" href="/resources/demos/style.css">
  <script>
  $(function() {
    $( "#datepicker" ).datepicker();
  });
  </script>
</head>
<body>

<p>Date: <input type="text" id="datepicker"></p>


</body>
</html>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.