iPhone / iOS: представление клавиатуры HTML 5 для почтовых индексов

Существует несколько приемов отображения разных клавиатур на мобильных устройствах для ввода HTML 5 (т.е. <input> теги).

Например, некоторые из них описаны на веб-сайте Apple, " Настройка клавиатуры для веб-представлений".

введите описание изображения здесьвведите описание изображения здесь

Они отлично подходят для удобства использования, но когда дело доходит до ввода для международных почтовых индексов (в основном числовых, но разрешенных букв), у нас остаются некоторые плохие варианты. Большинство людей рекомендуют использовать pattern="\d*" трюк, чтобы показать цифровую клавиатуру, но это не позволяет вводить буквы.

type="number" Тип ввода показывает обычную клавиатуру, но смещен в цифровую раскладку:

введите описание изображения здесь

Это хорошо работает для устройств на iOS, но заставляет Chrome думать, что ввод должен быть числом, и даже меняет поведение входа (увеличение / уменьшение и уменьшение значения).

введите описание изображения здесь

Есть ли способ заставить iOS по умолчанию использовать цифровую раскладку, но все же разрешить буквенно-цифровой ввод?

В основном, я хочу поведение iOS для type="number" но я хочу, чтобы в браузерах рабочего стола это поле работало как обычное текстовое поле. Это возможно?

ОБНОВИТЬ:

Нюхание пользовательского агента для iOS и использование type="number" тип ввода не вариант. type="number" не предназначен для строковых значений (например, почтовых индексов) и имеет другие побочные эффекты (такие как удаление начальных нулей, разделителей запятых и т. д.), которые делают его менее чем идеальным для почтовых индексов.

9 ответов

Будет ли это работать?

HTML:

<input type="tel" pattern="[0-9]*" novalidate>

Это должно дать вам симпатичную цифровую клавиатуру в браузерах телефонов Android/iOS, отключить проверку формы браузера в настольных браузерах, не показывать стрелки, разрешать начальные нули и разрешать запятые и буквы в настольных браузерах, а также на iPad.

Телефоны на Android/iOS:

введите описание изображения здесь

Рабочий стол:

введите описание изображения здесь

IPAD:

введите описание изображения здесь

Браузеры в настоящее время не имеют надлежащего способа представления числовых кодов, таких как почтовые индексы и номера кредитных карт. Лучшее решение - использовать type='tel' который даст вам цифровую клавиатуру и возможность добавлять любого персонажа на рабочий стол.

Тип text а также pattern='/d' даст вам цифровую клавиатуру, но только на iOS.

Существует предложение HTML5.1 для атрибута под названием inputmodeчто позволит вам указать клавиатуру независимо от типа. Однако в настоящее время не поддерживается ни одним браузером.

Я также рекомендовал бы взглянуть на библиотеку Webshim polyfill, в которой есть метод polyfill для этих типов входных данных.

Быстрый поиск в Google нашел этот вопрос Stackru.

HTML

<input type="text">

Javascript

$('input[type="text"]').on('touchstart', function() {
   $(this).attr('type', 'number');
});

$('input[type="text"]').on('keydown blur', function() {
   $(this).attr('type', 'text');
});

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

Stackru при обнаружении iOS

Обновление этого вопроса в iOS 11. Вы можете получить цифровую клавиатуру, просто добавив атрибут pattern (pattern="[0-9]*") к любому входу с числовым типом.

Следующее работает как ожидалось.

<input type="number" pattern="[0-9]*">

Это тоже работает.

<input type="number" pattern="\d*">

@davidelrizzo опубликовал часть ответа, но комментарии @Miguel Guardo и @turibe дают более полную картину, но их легко пропустить.

Это сделает числовую сторону дисплея ios клавиатурой по умолчанию и обеспечит возможность переключения на алфавитную сторону. При изменении типа ввода html устройство меняет клавиатуру в соответствии с соответствующим типом.

(function ($) {
    var control = $('#test2');
    var field = $('#test1');

    control.bind('click', function () {
        if (control.is(':checked')) {
            field.attr('type', 'text');
        } else {
            field.attr('type', 'number');
        }
    })
}(jQuery));

<input type="number" id="test1" value="123" />
<input id="test2" type="checkbox" />Change

введите описание изображения здесь


альтернативная демонстрация: http://jsfiddle.net/davidcondrey/dbg1L0c0/3/embedded/result/

Если вам нужна клавиатура большого числового формата (стиль телефона), вы можете настроить код соответствующим образом, и он все еще работает:

(function ($) {
    var control = $('#test2');
    var field = $('#test1');

    control.bind('click', function () {
        if (control.is(':checked')) {
            field.attr('type', 'text');
        } else {
            field.attr('type', 'tel');
        }
    })
}(jQuery));

<input type="tel" id="test1" value="a" />
<input id="test2" type="checkbox" />Change

введите описание изображения здесь

Вы можете использовать собственный атрибут HTML API с именем inputmode="numeric", inputmode="decimal". (Это предпочтительный способ реализации) Подробнее о режиме ввода можно прочитать на MDN здесь .

Попробуй это:

<input type="text" name="postalcode" class="js-postal">
<script src="https://code.jquery.com/jquery-2.1.1.js" type="text/javascript"></script>
<script type="text/javascript">
$(function() {
  if('ontouchstart' in window) { // ensure we are in touch device.

    $('input.js-postal').on('focus', function() {
      var $this = $(this);

      // memorize current value because...
      var val = $this.val(); 
      // this may cause reset value.
      $this.attr('type', 'number'); 

      setTimeout(function() {
        // Asynchronously restore 'type' and value
        $this.attr('type', 'text');
        $this.val(val);
      }, 0);
    });
  }
});
</script>

Я знаю, что это очень хакерский способ, но это, очевидно, работает.
Я не проверял на устройствах Android, хотя.

Обратите внимание, что это может вызвать небольшие заметные сбои, когда $this.attr('type', 'number') потому что это сбросить значение при input имеет не числовые символы.

Основные идеи украдены из этого ответа:)

<input type="tel" inputmode="decimal">

Выше работает для меня в течение нескольких лет. Под работой я подразумеваю, что на мобильных устройствах отображается цифровая виртуальная клавиатура, когдаinputполучает фокус. На устройствах iOS клавиатура позволяет пользователям вводить числа, десятичные дроби и символы. Мой обработчик событий клавиатуры вставляет разделители тысяч, и нет проблем с прохождением проверки, поэтому я предполагаю, что пользователи также могут вводить запятые. Можно вводить отрицательные значения, поэтому разрешены дефисы, хотя я не вижу дефиса на клавиатуре iOS.

Если вы хотите попробовать это, вы можете попробовать любой калькулятор на моем сайте.

Почему бы не проверить заголовок HTTP-запроса (пользовательский агент) и предоставить числовой макет устройствам iOS, одновременно предоставив буквенно-цифровой макет остальным?

Другие вопросы по тегам