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

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

Проблема:

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

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

person jatrim    schedule 21.05.2012    source источник
comment
На вашей странице используется мобильная платформа?   -  person Šime Vidas    schedule 22.05.2012
comment
Он тоже должен работать немобильно?   -  person nycynik    schedule 22.05.2012
comment
В идеале, да, он должен работать и в немобильных браузерах. Вот почему я определяю платформу, прежде чем вносить какие-либо изменения на страницу. В настоящее время я не использую мобильную платформу. Это адаптация нашего обычного сайта для повышения производительности мобильных браузеров. В будущем, когда появится больше денег, мы, возможно, сможем вернуться и написать сайт только для мобильных устройств.   -  person jatrim    schedule 22.05.2012


Ответы (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, в зависимости от результатов тестирования.

person Codeman    schedule 21.05.2012
comment
Спасибо, что нашли время ответить. Именно это и делает приведенный выше javascript. К сожалению, я вынужден делать выбор между type=number и type=tel для конкретного устройства из-за проблем с рендерингом на iPhone и Android. Я вношу изменения «на лету», а не в html, потому что он также должен отображаться в настольных браузерах, не делая ничего странного. Я надеялся обойти одну или обе эти вещи, возможно, применив какой-нибудь волшебный CSS или входные атрибуты, которые мне не удалось найти. - person jatrim; 22.05.2012
comment
Возможно, вы могли бы использовать CSS? Взгляните наверху через мгновение. - person Codeman; 22.05.2012
comment
Вы, конечно, правы насчет javacript, но в данном случае кто-то более ответственный, чем я, решил, что мы не поддерживаем пользователя без javascript в нашем приложении. Поскольку при отключении javascript могло произойти гораздо больше проблем, это не подходит для этого приложения. - person jatrim; 22.05.2012
comment
Совет: прочтите ненавязчивый javascript. Это моя любимая методология дизайна в настоящее время, и она имеет достаточную ценность для бизнеса, чтобы попытаться предложить ее в будущем более ответственным людям :) - person Codeman; 22.05.2012
comment
К сожалению, в большинстве браузеров вы не можете изменить атрибут типа ввода после того, как он был отображен на странице. Вот почему я снова перерисовываю весь ввод, используя вместо этого externalHTML. Как и вы, я бы предпочел решение CSS, но мне не удалось найти какой-либо CSS, который повлияет на выбранную клавиатуру. Я подумываю установить все на type=number и использовать CSS, чтобы скрыть уродливые кнопки лифта. CSS для скрытия этих кнопок не кажется универсальным, хотя и не поможет браузерам, таким как Opera на Android, где type=number в настоящее время игнорируется. - person jatrim; 22.05.2012
comment
Вы используете jQuery? Последнее, что я предложил, должно отлично работать при изменении элементов после их рендеринга. В этом весь смысл jQuery - person Codeman; 22.05.2012
comment
да. Я использую jQuery. Когда я попробовал это, я получил очень конкретные сообщения об ошибках, в которых сообщалось, что невозможно обновить атрибут type. Это возможно только что было Opera, но это нарушило оставшуюся часть рендеринга скрипта. - person jatrim; 22.05.2012
comment
Да, это могло быть так. Взгляните на гусака: stackoverflow.com/questions/ 1544317 / - person Codeman; 22.05.2012
comment
Спасибо, что побудили меня продолжить рассмотрение изменения атрибута типа. Я надеюсь, что когда-нибудь все браузеры начнут обрабатывать все эти теги html 5 одинаково и представят лучший CSS для обработки своего пользовательского интерфейса. + благодарность за ваши усилия. - person jatrim; 24.05.2012
comment
Спасибо, надеюсь, вы что-нибудь догадались. : - person Codeman; 24.05.2012