Существует ли приемлемый кроссплатформенный метод для отображения цифровой клавиатуры в стандартных веб-формах на сенсорном устройстве?

Цель: найти кроссплатформенное решение для отображения цифровых клавиатур на мобильных сенсорных устройствах с минимумом взломов.

Проблема:

У меня есть обычное веб-приложение, использующее формы ввода данных, содержащие в основном числовые данные. Когда пользователь взаимодействует с моим сайтом на мобильном устройстве, я хотел бы отобразить цифровую виртуальную клавиатуру, поскольку большинству стандартных клавиатур требуется второе нажатие, чтобы переключиться с альфа-канала на цифры. Я знаю, что могу вызвать другую клавиатуру, установив атрибут "type" элемента input:

type=number: Отлично работает под iOS/Safari. Я не уверен насчет других браузеров на платформе.

В Android это не всегда правильно отображает правильную клавиатуру в различных браузерах и часто приводит к появлению нежелательных кнопок лифта на входе. Я еще не нашел чистый способ отключить их в CSS.

type=tel: Это почти работает на iOS/Safari, но на клавиатуре телефона отсутствует десятичная кнопка.

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

Мое текущее решение является хакерским и упрощенным. Основываясь на классе, который я уже использую для числовой проверки, я заменяю каждый текстовый элемент, который должен содержать число, новым вводом, который либо number или tel тип на основе обнаруженной ОС / браузера.

var isAndroid = navigator.userAgent.match(/android/i) ? true : false;
var isIOS = navigator.userAgent.match(/(ipod|ipad|iphone)/i) ? true : false;

if (isAndroid || isIOS) {
    var useNumberType = (isIOS ? true : false); //iOS uses type=number, everyone else uses type=tel
    jQuery("input.num").each(function () {
        var type = (useNumberType ? "number" : "tel");
        var html = this.outerHTML;
        html = html.replace(/(type=\"?)text(\"?)/, "$1" + type + "$2");
        this.outerHTML = html;
    });
}

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

Есть ли лучший способ получить цифровую клавиатуру с десятичной кнопкой, которая работает на всех или на большинстве сенсорных мобильных устройств без добавления странных элементов интерфейса на страницу?

-------------- Обновить

Я не думаю, что есть способ сделать то, что я действительно хочу сделать, это настроить единый стиль ввода или тип, который будет хорошо работать в браузерах настольных компьютеров и на всех основных мобильных сенсорных платформах. Я остановился на изменении типа ввода через прямой вызов DOM, а не через jQuery, вместо того, чтобы переписывать весь ввод через externalHTML. Я подозреваю, что нет большой разницы в эффекте, но код немного чище. Поскольку я не изменяю типы ввода на рабочем столе, мне не нужно беспокоиться об ограничении IE только для чтения атрибута.

В идеале, я бы, вероятно, обработал это на стороне сервера, чтобы все было отправлено в браузер в формате, который требуется для устройства, выполняющего запрос. Но сейчас новый код выглядит примерно так:

var isAndroid = navigator.userAgent.match(/android/i) || navigator.platform.match(/android/i) ? true : false;
var isIOS = navigator.userAgent.match(/(ipod|ipad|iphone)/i) ? true : false;

if (isAndroid || isIOS) {
    var useNumberType = (isIOS ? true : false); //iOS uses type=number, everyone else uses type=tel
    jQuery("input.num").each(function () {
        var type = (useNumberType ? "number" : "tel");
        if (this.type == "text") {
            this.type = type;
        }
    });
}

1 ответ

Решение

Подсказка: при работе с мобильными устройствами НЕ мешайте работе пользователя. Это означает сохранение встроенных клавиатур такими, какие они есть.

Некоторые пользователи могут даже отключить Javascript на своих мобильных устройствах / браузерах!

Что вы должны сделать здесь, это включить HTML-подсказку для браузера. Таким образом, мобильные браузеры должны знать, с каким контентом они взаимодействуют.

HTML5 включает в себя несколько новых <input> типы контента, которые должны поддерживаться на всех современных мобильных устройствах (и в большинстве современных браузеров)

Вы можете найти полный список здесь.

Что конкретно вы хотите, так это:

Старый код:

Phone number: <input type="text" name="phone" />

Новый код:

Phone number: <input type="tel" name="phone" />

Я не знаю, какие браузеры в настоящее время поддерживают "tel", так что вы можете использовать что-то вроде следующего:

Phone number: <input type="number" name="phone" min="1000000000" max="9999999999" />

Это немного взломать, но это еще один вариант для вас.

Это НАМНОГО более простой и более понятный способ ведения дел, и лучше для пользователя.

Пожалуйста, дай мне знать, если возникнут какие-либо вопросы. Я знаю, что это не дает прямого ответа на вопрос, но, на мой взгляд, сейчас это лучший способ сделать что-то.:)

РЕДАКТИРОВАТЬ:

Возможный способ обойти это для каждого браузера - проверка пользовательского агента с помощью JS/Jquery. Я не уверен, как именно это сделать, но вот учебник о том, как это сделать в.NET и изменение CSS для каждого элемента с помощью JQuery.

РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ!:

Попробуйте просто изменить ваш код как таковой:

var isAndroid = navigator.userAgent.match(/android/i) ? true : false;
var isIOS = navigator.userAgent.match(/(ipod|ipad|iphone)/i) ? true : false;

if(isIOS)
    $(.phoneInput).attr("type", "tel");
if(isAndroid)
{
    $(.phoneInput).attr("type", "number");
    $(.phoneInput).attr("min", "1000000000");
    $(.phoneInput).attr("max", "9999999999");
}

Я надеюсь, что это из всего работает! Возможно, вам придется переключить два if заявления, в зависимости от того, как ваше тестирование получается.

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