Как отключить новый ввод даты в Chrome HTML5?

Недавнее обновление (V 20.x) Chrome сломало одну из моих форм с новым встроенным типом ввода даты и времени. Я вызываю jQuery UI datepicker в поле даты, и он работал отлично до обновления. После обновления Chrome переопределяет мой заполнитель и делает виджет jQuery UI непригодным.

Любые идеи о том, как я могу помешать работе Chrome с моими полями ввода без изменения их типа?

Ответ 1

У вас есть несколько различных вариантов.

Вы можете обнаружить, что пользователь использует Chrome, обнюхивая строку пользовательского агента и предотвращая события щелчка.

if (navigator.userAgent.indexOf('Chrome') != -1) {
    $('input[type=date]').on('click', function(event) {
        event.preventDefault();
    });
}

Обманщик агента пользователя - плохая идея, но это будет работать.

Идеальный подход, на мой взгляд, заключается в том, чтобы определить, поддерживает ли браузер родной datepicker, если он его использует, если не использует пользовательский интерфейс jQuery.

if (!Modernizr.inputtypes['date']) {
    $('input[type=date]').datepicker({
        // Consistent format with the HTML5 picker
        dateFormat: 'yy-mm-dd'
    });   
}​

Пример - http://jsfiddle.net/tj_vantoll/8Wn34/

Конечно, поскольку Chrome поддерживает собственный выбор даты, пользователь увидит это вместо пользовательского интерфейса jQuery. Но по крайней мере у вас не было бы столкновения функциональности, и пользовательский интерфейс был бы полезен для конечного пользователя.

Это заинтриговало меня, поэтому я написал кое-что об использовании jQuery UI datepicker наряду с собственным контролем - http://tjvantoll.com/2012/06/30/creating-a-native-html5-datepicker-with-a-fallback-to-jquery-ui/.

Edit

Если вам интересно, я недавно поговорил об использовании виджетов jQuery UI вместе с элементами управления HTML5.

Ответ 2

Это работает для меня:

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

Ответ 3

Я полностью согласен с TJ.

Если вы выполняете какое-либо редактирование, предварительное заполнение или динамическую настройку значений даты, вам также нужно знать, что с 7/3/13 Chrome только соблюдает стандартный формат даты ISO (yyyy-mm-dd). Он отобразит даты для пользователя в локальном формате ( "мм/дд/гг" для США), но будет игнорировать любые значения, установленные в HTML, которые не соответствуют стандарту ISO.

Чтобы преобразовать на загрузку страницы, вы можете использовать сниффер пользователя пользовательского интерфейса TJ и сделать это:

if (navigator.userAgent.indexOf('Chrome/2') != -1) {
    $('input[type=date]').each(function(){
        var d = trim(this.getAttribute('value'));
        if (d){
            d = new Date(d);
            var dStr = d.toISOString().split('T')[0];
            this.value = dStr; 
        }
    });
}

Если, например, вы выбираете отключить родной datepicker и используете jQuery, вам также нужно будет установить формат даты в соответствии с полем даты Chrome или не будет отображать ввод, который отправляет датпикер jQuery

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

Добавьте эти две вещи в первый вариант ответа TJ, и у вас есть jQuery datepicker, работающий в Chrome без ошибок!

Опираясь на родные датпикеры - идеальное решение. Но когда вам нужно что-то, что поддерживает даты вычеркивания, диапазоны дат, или вы просто хотите, чтобы он выглядел красивее, это сработает.

Ответ 4

Чтобы удалить стрелки и кнопки со стрелками:

.unstyled::-webkit-inner-spin-button,
.unstyled::-webkit-calendar-picker-indicator {
    display: none;
    -webkit-appearance: none;
}

Вы можете активировать календарь, нажав Alt + Down Arrow (отмечен на окнах 10).

Чтобы отключить, вам нужно добавить немного JavaScript:

dateInput.addEventListener('keydown', function(event) {
    if (event.keyIdentifier == "Down") {
        event.preventDefault()
    }
}, false);