Tắt trình chọn ngày gốc trong Google Chrome


88

Bộ chọn ngày đã hạ cánh trên Chrome 20, có thuộc tính nào để tắt nó không? Toàn bộ hệ thống của tôi sử dụng trình chọn ngày giao diện người dùng jQuery và đó là trình duyệt chéo, vì vậy, tôi muốn tắt trình chọn ngày gốc của Chrome. Có thuộc tính thẻ nào không?


Câu trả lời:


140

Để ẩn mũi tên:

input::-webkit-calendar-picker-indicator{
    display: none;
}

Và để ẩn lời nhắc:

input[type="date"]::-webkit-input-placeholder{ 
    visibility: hidden !important;
}

3
:: - webkit-input-placeholder sẽ không ẩn văn bản "mm / dd / yyyy" vì nó không phải là placeholder, nó được kiểm soát nguyên bản.
Justin Bull,

1
Ngoài ra, bạn đang thiếu một bộ chọn. Để tham khảo: stackoverflow.com/a/11418704/229787
Justin Bull,

Theo như tôi có thể nói thì tính năng này không hoạt động trên Android Chrome - fiddle.jshell.net/RgY3t/138
Seb Charrot

54

Nếu bạn đã sử dụng sai, <input type="date" />bạn có thể sử dụng:

$('input[type="date"]').attr('type','text');

sau khi chúng đã tải để biến chúng thành đầu vào văn bản. Trước tiên, bạn cần đính kèm bộ chọn ngày tùy chỉnh của mình:

$('input[type="date"]').datepicker().attr('type','text');

Hoặc bạn có thể cho họ một lớp học:

$('input[type="date"]').addClass('date').attr('type','text');

5
Dễ dàng giải pháp yêu thích của tôi. Nó đơn giản và không triển khai các bộ chọn CSS cụ thể của trình duyệt. Kết quả dự kiến, IMO, phải ngăn điều khiển gốc nếu JavaScript được bật, cho phép một bộ chọn ngày tùy chỉnh. Tuy nhiên, nếu JavaScript bị tắt thì các điều khiển gốc vẫn hoạt động. Thành thật mà nói, đây phải là câu trả lời được chấp nhận.
Justin Bull,

2
@ travesty3 các phiên bản IE đó có hỗ trợ trình chọn ngày html5 không, hay chỉ quay lại văn bản? Nếu không, thì nó không thành vấn đề.
rjmunro

2
Tôi không hiểu tại sao việc sử dụng <input type = "date"> cho trường ngày lại sử dụng sai mục đích? (câu đầu tiên của câu trả lời này)
Steve

3
Hoàn toàn hợp lệ nếu bạn không muốn một bộ chọn ngày lịch cho một trường như Ngày sinh, nhưng vẫn muốn trường được xác thực bởi trình duyệt gốc.
Duncanmoo

1
@Duncanmoo Ngày tháng năm sinh có gì đặc biệt? Chỉ cần đặt giá trị tối đa thành ngày hôm nay (nếu bạn muốn cho phép nhập trẻ sơ sinh vào ngày chúng được sinh ra) hoặc N năm trước trong đó N là độ tuổi tối thiểu cho người dùng trang web của bạn. Đặc biệt là trên thiết bị di động, tôi muốn sử dụng công cụ chọn ngày gốc của trình duyệt để nhập ngày sinh của mình hơn là một số thứ JS tùy chỉnh. Ngoài ra, có bao nhiêu triển khai bộ chọn ngày JS tùy chỉnh tồn tại không hỗ trợ xác thực?
rjmunro

15

Bạn đã có thể sử dụng:

jQuery('input[type="date"]').live('click', function(e) {e.preventDefault();}).datepicker();

3
nếu bạn sử dụng jQuery> = 1.7:jQuery('input[type="date"]').on('click', function(e) {e.preventDefault();}).datepicker();
yorch

Câu trả lời này không xóa kiểu gốc. stackoverflow.com/a/11418704/229787
Justin Bull

4
@JustinBull true nhưng câu hỏi không phải về việc xóa kiểu dáng mà là cho phép sử dụng công cụ chọn ngày jQuery thay thế mà câu trả lời này đạt được. Bất kỳ ý tưởng nào về cách cũng có thể loại bỏ kiểu dáng?
Jimbo,

7

Với Modernizr ( http://modernizr.com/ ), nó có thể kiểm tra chức năng đó. Sau đó, bạn có thể buộc nó vào boolean mà nó trả về:

// does not trigger in Chrome, as the date Modernizr detects the date functionality.
if (!Modernizr.inputtypes.date) { 
    $("#opp-date").datepicker();
}

3
Điều này khá hữu ích để quay lại trình chọn ngày của jQuery khi trình chọn ngày gốc không có sẵn. Tuy nhiên, câu hỏi này có vẻ là về việc loại bỏ bộ chọn ngày của Chrome, vì vậy tôi đã bỏ phiếu cho câu trả lời của bạn.
Sam

7

Điều này đã làm việc cho tôi

input[type=date]::-webkit-inner-spin-button, 
input[type=date]::-webkit-outer-spin-button { 
  -webkit-appearance: none; 
  margin: 0; 
}

2

Đoạn mã trên không đặt giá trị của phần tử đầu vào cũng như không kích hoạt sự kiện thay đổi. Mã dưới đây hoạt động trong Chrome và Firefox (không được thử nghiệm trong các trình duyệt khác):

$('input[type="date"]').click(function(e){
     e.preventDefault();
}).datepicker({
    onSelect: function(dateText){
        var d = new Date(dateText),
        dv = d.getFullYear().toString().pad(4)+'-'+(d.getMonth()+1).toString().pad(2)+'-'+d.getDate().toString().pad(2);
        $(this).val(dv).trigger('change');
    }
});

pad là một phương thức Chuỗi tùy chỉnh đơn giản để đệm các chuỗi bằng số không (bắt buộc)


1

Tôi đồng ý với Robertc, cách tốt nhất là không sử dụng type = date mà là plugin JQuery Mobile Datepicker của tôi sử dụng nó. Vì vậy, tôi phải thực hiện một số thay đổi:

Tôi đang sử dụng jquery.ui.datepicker.mobile.js và đã thực hiện các thay đổi này:

Từ (dòng 51)

$( "input[type='date'], input:jqmData(type='date')" ).each(function(){

đến

$( "input[plug='date'], input:jqmData(plug='date')" ).each(function(){

và trong biểu mẫu sử dụng, hãy nhập văn bản và thêm trình cắm var:

<input type="text" plug="date" name="date" id="date" value="">

3
Nếu bạn muốn thêm thuộc tính tùy chỉnh cho dữ liệu tập lệnh cục bộ, cách hợp lệ là sử dụng data-*thuộc tính . Trong trường hợp này, hãy gọi thuộc tính của bạn data-plugthay vì plug, sau đó nó được đảm bảo sẽ không bao giờ đụng độ với bất kỳ thuộc tính mới nào được thêm vào HTML6 / 7/8 / v.v.
robertc

1

Tôi sử dụng như sau (coffeescript):

$ ->
  # disable chrome's html5 datepicker
  for datefield in $('input[data-datepicker=true]')
    $(datefield).attr('type', 'text')
  # enable custom datepicker
  $('input[data-datepicker=true]').datepicker()

được chuyển đổi thành javascript đơn giản:

(function() {
  $(function() {
    var datefield, _i, _len, _ref;
    _ref = $('input[data-datepicker=true]');
    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
      datefield = _ref[_i];
      $(datefield).attr('type', 'text');
    }
    return $('input[data-datepicker=true]').datepicker();
  }); 
}).call(this);

1

Điều này đã làm việc cho tôi:

// Hide Chrome datetime picker
$('input[type="datetime-local"]').attr('type', 'text');

// Reset date values
$("#EffectiveDate").val('@Model.EffectiveDate.ToShortDateString()');
$("#TerminationDate").val('@Model.TerminationDate.ToShortDateString()');

Mặc dù giá trị của các trường ngày vẫn ở đó và chính xác, nó không hiển thị. Đó là lý do tại sao tôi đặt lại các giá trị ngày từ mô hình chế độ xem của mình.


0

Điều này phù hợp với tôi:

;
(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);

Xem thêm:

Làm cách nào để tắt tính năng nhập ngày HTML5 mới của Chrome?

http://zizhujy.com/blog/post/2014/09/18/Add-date-picker-to-dynamently-generated-input-elements.aspx


0

Tôi biết đây là một câu hỏi cũ bây giờ, nhưng tôi vừa hạ cánh ở đây để tìm kiếm thông tin về điều này, vì vậy ai đó cũng có thể.

Bạn có thể sử dụng Modernizr để phát hiện xem trình duyệt có hỗ trợ các loại đầu vào HTML5, chẳng hạn như 'ngày tháng' hay không. Nếu có, những điều khiển đó sẽ sử dụng hành vi gốc để hiển thị những thứ như bộ chọn ngày. Nếu không, bạn có thể chỉ định tập lệnh nào sẽ được sử dụng để hiển thị trình chọn ngày của riêng bạn. Hoạt động tốt cho tôi!

Tôi đã thêm jquery-ui và Modernizr vào trang của mình, sau đó thêm mã này:

<script type="text/javascript">
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(initDateControls);
    initDateControls();

    function initDateControls() {
        //Adds a datepicker to inputs with a type of 'date' when the browser doesn't support that HTML5 tag (type=date)'
        Modernizr.load({
            test: Modernizr.inputtypes.datetime,
            nope: "scripts/jquery-ui.min.js",
            callback: function () {
                $("input[type=date]").datepicker({ dateFormat: "dd-mm-yy" });
            }
        });
    }

</script>

Điều này có nghĩa là trình chọn ngày gốc được hiển thị trong Chrome và trình chọn jquery-ui được hiển thị trong IE.


0

Đối với Laravel5 Kể từ khi một sử dụng

{!! Biểu mẫu :: input ('date', 'date_start', null, ['class' => 'form-control', 'id' => 'date_start', 'name' => 'date_start']) !!}

=> Chrome sẽ buộc người chọn ngày của nó. => nếu bạn lấy nó đi bằng css bạn sẽ bị lỗi định dạng thông thường !! (Giá trị đã chỉ định không tuân theo định dạng bắt buộc, "yyyy-MM-dd".)

GIẢI PHÁP:

$ ('input [type = "date"]'). attr ('type', 'text');

$("#date_start").datepicker({
    autoclose: true,
    todayHighlight: true,
    dateFormat: 'dd/mm/yy',
    changeMonth: true,
    changeYear: true,
    viewMode: 'months'
});
$("#date_stop").datepicker({
    autoclose: true,
    todayHighlight: true,
    dateFormat: 'dd/mm/yy',
    changeMonth: true,
    changeYear: true,
    viewMode: 'months'
});
$( "#date_start" ).datepicker().datepicker("setDate", "1d");
$( "#date_stop" ).datepicker().datepicker("setDate", '2d');
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.