Nonaktifkan pemilih data asli di Google Chrome

Jawaban:

140

Untuk menyembunyikan panah:

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

Dan untuk menyembunyikan prompt:

input[type="date"]::-webkit-input-placeholder{ 
    visibility: hidden !important;
}
Yacine Zalouani
sumber
3
:: - webkit-input-placeholder tidak akan menyembunyikan teks "bb / hh / tttt" karena ini bukan placeholder, teks ini dikontrol secara native.
Justin Bull
1
Anda juga kehilangan pemilih. Untuk referensi: stackoverflow.com/a/11418704/229787
Justin Bull
Sejauh yang saya tahu ini tidak berfungsi di Android Chrome - fiddle.jshell.net/RgY3t/138
Seb Charrot
54

Jika Anda telah menyalahgunakan <input type="date" />Anda mungkin dapat menggunakan:

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

setelah dimuat untuk mengubahnya menjadi input teks. Anda harus melampirkan pemilih data khusus Anda terlebih dahulu:

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

Atau Anda bisa memberi mereka kelas:

$('input[type="date"]').addClass('date').attr('type','text');
rjmunro
sumber
5
Mudah solusi favorit saya. Ini sederhana dan tidak menerapkan pemilih CSS khusus browser. Hasil yang diinginkan, IMO, harus mencegah kontrol asli jika JavaScript diaktifkan, memungkinkan pemilih tanggal kustom. Namun, jika JavaScript dinonaktifkan, kontrol asli tetap berfungsi. Sejujurnya, ini harus menjadi jawaban yang diterima.
Justin Bull
2
@ travesty3 apakah versi IE mendukung html5 datepickers, atau hanya kembali ke teks? Jika tidak, maka tidak masalah.
rjmunro
2
Saya tidak mengerti mengapa menggunakan <input type = "date"> untuk bidang tanggal menyalahgunakannya? (kalimat pertama dari jawaban ini)
Steve
3
Sangat valid untuk tidak menginginkan pemilih tanggal kalender untuk bidang seperti Tanggal Lahir, tetapi tetap ingin bidang tersebut divalidasi oleh browser asli.
Duncanmoo
1
@Duncanmoo Apa yang spesial dari tanggal lahir? Cukup setel maksimum ke hari ini (jika Anda ingin mengizinkan bayi dimasukkan pada hari mereka dilahirkan), atau N tahun yang lalu dengan N adalah usia minimum untuk pengguna situs Anda. Terutama di perangkat seluler, saya lebih suka menggunakan pemilih tanggal asli browser untuk memasukkan tanggal lahir saya daripada beberapa hal JS khusus. Juga, berapa banyak penerapan pemilih tanggal JS khusus yang tidak mendukung validasi?
rjmunro
15

Anda bisa menggunakan:

jQuery('input[type="date"]').live('click', function(e) {e.preventDefault();}).datepicker();
Jimbo
sumber
3
jika Anda menggunakan jQuery> = 1.7:jQuery('input[type="date"]').on('click', function(e) {e.preventDefault();}).datepicker();
yorch
Jawaban ini tidak menghapus gaya asli. stackoverflow.com/a/11418704/229787
Justin Bull
4
@JustinBull benar tetapi pertanyaannya bukan tentang menghapus gaya tetapi mengizinkan pemilih tanggal jQuery digunakan sebagai gantinya yang dicapai jawaban ini. Adakah ide bagaimana styling bisa dihilangkan juga?
Jimbo
7

Dengan Modernizr ( http://modernizr.com/ ), itu dapat memeriksa fungsionalitas itu. Kemudian Anda dapat mengikatnya ke boolean yang dikembalikannya:

// does not trigger in Chrome, as the date Modernizr detects the date functionality.
if (!Modernizr.inputtypes.date) { 
    $("#opp-date").datepicker();
}
CodeFinity
sumber
3
Ini cukup berguna untuk kembali ke jQuery datepicker ketika datepicker asli tidak tersedia. Namun, pertanyaan ini sepertinya tentang cara menyingkirkan pemilih tanggal Chrome, jadi saya telah menolak jawaban Anda.
Sam
7

Ini berhasil untuk saya

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

Kode di atas tidak menyetel nilai elemen input juga tidak mengaktifkan peristiwa perubahan. Kode di bawah ini berfungsi di Chrome dan Firefox (tidak diuji di browser lain):

$('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 adalah metode String kustom sederhana untuk mengisi string dengan nol (wajib)

MartijnR
sumber
1

Saya setuju dengan Robertc, cara terbaik adalah tidak menggunakan type = date tetapi plugin JQuery Mobile Datepicker saya menggunakannya. Jadi saya harus membuat beberapa perubahan:

Saya menggunakan jquery.ui.datepicker.mobile.js dan melakukan perubahan ini:

Dari (baris 51)

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

untuk

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

dan dalam bentuk gunakan, ketik teks dan tambahkan steker var:

<input type="text" plug="date" name="date" id="date" value="">
ebelendez
sumber
3
Jika Anda ingin menambahkan atribut khusus untuk data skrip lokal, cara yang valid adalah dengan menggunakan data-*atribut . Dalam kasus ini, panggil atribut Anda data-plugalih-alih plug, maka dijamin tidak akan pernah bentrok dengan atribut baru yang ditambahkan di HTML6 / 7/8 / dll.
robertc
1

Saya menggunakan (coffeescript) berikut:

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

yang diubah menjadi javascript biasa:

(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);
Paolo Dona
sumber
1

Ini berhasil untuk saya:

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

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

Meskipun nilai bidang tanggal masih ada dan benar, itu tidak ditampilkan. Itulah mengapa saya mengatur ulang nilai tanggal dari model tampilan saya.

Cogitator
sumber
0

Ini bekerja untuk saya:

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

Lihat juga:

Bagaimana cara menonaktifkan input tanggal HTML5 Chrome baru?

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

Jeff Tian
sumber
0

Saya tahu ini adalah pertanyaan lama sekarang, tetapi saya baru saja mendarat di sini untuk mencari informasi tentang ini sehingga orang lain mungkin juga.

Anda dapat menggunakan Modernizr untuk mendeteksi apakah browser mendukung jenis input HTML5, seperti 'tanggal'. Jika ya, kontrol tersebut akan menggunakan perilaku asli untuk menampilkan hal-hal seperti datepickers. Jika tidak, Anda dapat menentukan skrip apa yang harus digunakan untuk menampilkan datepicker Anda sendiri. Bekerja dengan baik untuk saya!

Saya menambahkan jquery-ui dan Modernizr ke halaman saya, lalu menambahkan kode ini:

<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>

Ini berarti bahwa datepicker asli ditampilkan di Chrome, dan jquery-ui ditampilkan di IE.

Philip Stratford
sumber
0

Untuk Laravel5 Sejak seseorang menggunakan

{!! Formulir :: input ('date', 'date_start', null, ['class' => 'form-control', 'id' => 'date_start', 'name' => 'date_start']) !!}

=> Chrome akan memaksa datepicker-nya. => jika Anda menghapusnya dengan css Anda akan mendapatkan kesalahan format seperti biasa !! (Nilai yang ditentukan tidak sesuai dengan format yang diminta, "yyyy-MM-dd".)

LARUTAN:

$ ('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');
Mathieu Dierckx
sumber