ปิดการใช้งาน datepicker ดั้งเดิมใน Google Chrome


88

เครื่องมือเลือกวันที่ลงจอดบน Chrome 20 มีแอตทริบิวต์ใดที่จะปิดใช้งานหรือไม่ ระบบทั้งหมดของฉันใช้ jQuery UI datepicker และเป็น crossbrowser ดังนั้นฉันต้องการปิดการใช้งาน datepicker ดั้งเดิมของ Chrome มีแอตทริบิวต์แท็กหรือไม่


คำตอบ:


141

ในการซ่อนลูกศร:

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

และเพื่อซ่อนพรอมต์:

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

3
:: - webkit-input-placeholder จะไม่ซ่อนข้อความ "mm / dd / yyyy" เนื่องจากไม่ใช่ตัวยึดตำแหน่งจึงถูกควบคุมโดยกำเนิด
Justin Bull

1
นอกจากนี้คุณยังไม่มีตัวเลือก สำหรับการอ้างอิง: stackoverflow.com/a/11418704/229787
Justin Bull

1
เท่าที่ฉันสามารถบอกได้ว่าสิ่งนี้ใช้ไม่ได้กับ Android Chrome - fiddle.jshell.net/RgY3t/138
Seb Charrot

54

หากคุณใช้ในทางที่ผิด<input type="date" />คุณสามารถใช้:

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

หลังจากโหลดแล้วเพื่อเปลี่ยนเป็นอินพุตข้อความ คุณจะต้องแนบ datepicker ที่กำหนดเองของคุณก่อน:

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

หรือคุณสามารถให้ชั้นเรียน:

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

5
ทางออกที่ฉันชอบได้อย่างง่ายดาย มันง่ายและไม่ใช้ตัวเลือก CSS เฉพาะของเบราว์เซอร์ ผลลัพธ์ที่ตั้งใจไว้คือ IMO ควรป้องกันการควบคุมแบบเนทีฟหากเปิดใช้งาน JavaScript ทำให้สามารถใช้ตัวเลือกวันที่ที่กำหนดเองได้ อย่างไรก็ตามหากปิดใช้งาน JavaScript การควบคุมเนทีฟจะยังคงใช้งานได้ จริงๆแล้วนี่ควรเป็นคำตอบที่ได้รับการยอมรับ
Justin Bull

2
@ travesty3 IE เวอร์ชันเหล่านั้นรองรับ html5 datepickers หรือแค่ถอยกลับไปที่ข้อความ? ถ้าไม่เช่นนั้นก็ไม่เป็นไร
rjmunro

2
ฉันไม่เข้าใจว่าทำไมการใช้ <input type = "date"> สำหรับช่องวันที่จึงใช้ผิด (ประโยคแรกของคำตอบนี้)
สตีฟ

3
เป็นสิ่งที่ถูกต้องอย่างสมบูรณ์ที่ไม่ต้องการตัวเลือกวันที่ในปฏิทินสำหรับฟิลด์เช่นวันเดือนปีเกิด แต่ยังคงต้องการให้ฟิลด์ได้รับการตรวจสอบโดยเบราว์เซอร์ดั้งเดิม
Duncanmoo

1
@Duncanmoo วันเดือนปีเกิดมีอะไรพิเศษ? เพียงตั้งค่าสูงสุดเป็นวันนี้ (หากคุณต้องการอนุญาตให้ป้อนทารกในวันที่พวกเขาเกิด) หรือ N ปีที่แล้วโดยที่ N คืออายุขั้นต่ำสำหรับผู้ใช้ไซต์ของคุณ โดยเฉพาะอย่างยิ่งบนมือถือฉันควรใช้เครื่องมือเลือกวันเกิดของเบราว์เซอร์เพื่อป้อนวันเกิดของฉันมากกว่าสิ่งที่กำหนดเอง JS นอกจากนี้ยังมีการใช้งานตัวเลือกวันที่ JS แบบกำหนดเองจำนวนเท่าใดที่ไม่รองรับการตรวจสอบความถูกต้อง
rjmunro

15

คุณสามารถใช้:

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

3
ถ้าคุณใช้ jQuery> = 1.7:jQuery('input[type="date"]').on('click', function(e) {e.preventDefault();}).datepicker();
ยอ

คำตอบนี้ไม่ได้ลบสไตล์ดั้งเดิม stackoverflow.com/a/11418704/229787
Justin Bull

4
@JustinBull จริง แต่คำถามไม่ได้เกี่ยวกับการลบสไตล์ แต่อนุญาตให้ใช้ตัวเลือกวันที่ jQuery แทนซึ่งคำตอบนี้ได้รับ มีความคิดอย่างไรที่สามารถลบสไตล์ได้ด้วย?
Jimbo

7

ด้วย Modernizr ( http://modernizr.com/ ) จะสามารถตรวจสอบฟังก์ชันการทำงานนั้นได้ จากนั้นคุณสามารถผูกมันเข้ากับบูลีนที่มันส่งกลับ:

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

3
สิ่งนี้มีประโยชน์มากสำหรับการถอยกลับไปที่ jQuery datepicker เมื่อไม่มี datepicker ดั้งเดิม อย่างไรก็ตามคำถามนี้ดูเหมือนจะเกี่ยวกับการกำจัดเครื่องมือเลือกวันที่ของ Chrome ดังนั้นฉันจึงโหวตคำตอบของคุณ
แซม


2

โค้ดด้านบนไม่ได้กำหนดค่าขององค์ประกอบอินพุตและไม่ทำให้เกิดเหตุการณ์การเปลี่ยนแปลง โค้ดด้านล่างใช้งานได้ใน Chrome และ Firefox (ไม่ได้ทดสอบในเบราว์เซอร์อื่น):

$('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 เป็นวิธีการสตริงที่กำหนดเองอย่างง่ายเพื่อวางสตริงด้วยศูนย์ (จำเป็น)


1

ฉันเห็นด้วยกับ Robertc วิธีที่ดีที่สุดคือไม่ใช้ type = date แต่ปลั๊กอิน JQuery Mobile Datepicker ของฉันใช้มัน ดังนั้นฉันต้องทำการเปลี่ยนแปลงบางอย่าง:

ฉันใช้ jquery.ui.datepicker.mobile.js และทำการเปลี่ยนแปลงนี้:

จาก (บรรทัดที่ 51)

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

ถึง

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

และในการใช้แบบฟอร์มพิมพ์ข้อความและเพิ่มปลั๊ก var:

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

3
หากคุณต้องการเพิ่มแอตทริบิวต์ที่กำหนดเองสำหรับข้อมูลสคริปต์ท้องถิ่นด้วยวิธีที่ถูกต้องคือการใช้แอตทริบิวต์data-* ในกรณีนี้ให้เรียกแอตทริบิวต์ของคุณdata-plugแทนplugซึ่งจะรับประกันได้ว่าจะไม่ปะทะกับแอตทริบิวต์ใหม่ที่เพิ่มเข้ามาใน HTML6 / 7/8 / ฯลฯ
robertc

1

ฉันใช้สิ่งต่อไปนี้ (กาแฟ):

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

ซึ่งจะถูกแปลงเป็น javascript ธรรมดา:

(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

สิ่งนี้ใช้ได้ผลสำหรับฉัน:

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

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

แม้ว่าค่าของช่องวันที่ยังคงอยู่และถูกต้อง แต่ก็ไม่ได้แสดง นั่นเป็นเหตุผลที่ฉันรีเซ็ตค่าวันที่จากโมเดลมุมมองของฉัน


0

สิ่งนี้ใช้ได้กับฉัน:

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

ดูสิ่งนี้ด้วย:

ฉันจะปิดใช้งานการป้อนวันที่ของ Chrome HTML5 ใหม่ได้อย่างไร

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


0

ตอนนี้ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันเพิ่งมาที่นี่เพื่อหาข้อมูลเกี่ยวกับเรื่องนี้เพื่อให้ใคร ๆ

คุณสามารถใช้Modernizrเพื่อตรวจสอบว่าเบราว์เซอร์รองรับประเภทอินพุต HTML5 หรือไม่เช่น "วันที่" หากเป็นเช่นนั้นการควบคุมเหล่านั้นจะใช้พฤติกรรมดั้งเดิมเพื่อแสดงสิ่งต่างๆเช่น datepickers หากไม่เป็นเช่นนั้นคุณสามารถระบุได้ว่าควรใช้สคริปต์ใดเพื่อแสดง datepicker ของคุณเอง ใช้ได้ดีกับฉัน!

ฉันเพิ่มjquery-uiและ Modernizr ในหน้าของฉันจากนั้นเพิ่มรหัสนี้:

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

ซึ่งหมายความว่า datepicker ดั้งเดิมจะแสดงใน Chrome และ jquery-ui หนึ่งจะแสดงใน IE


0

สำหรับ Laravel5 เนื่องจากใช้งานครั้งเดียว

{!! แบบฟอร์ม :: input ('date', 'date_start', null, ['class' => 'form-control', 'id' => 'date_start', 'name' => 'date_start']) !!}

=> Chrome จะบังคับให้ datepicker => หากคุณนำมันออกไปด้วย css คุณจะได้รับข้อผิดพลาดในการจัดรูปแบบตามปกติ !! (ค่าที่ระบุไม่เป็นไปตามรูปแบบที่ต้องการ "yyyy-MM-dd")

วิธีการแก้:

$ ('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');
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.