iOS5 показывает цифровую клавиатуру по умолчанию без использования type = "number" или type = "tel" - PullRequest
36 голосов
/ 22 ноября 2011

С выпуском iOS5 Apple добавила собственную проверку в поля ввода input type = "number".Это вызывает некоторые проблемы;см. этот вопрос ниже, который суммирует его:

Тип ввода = 'число' Новая проверка удаляет начальные нули и номера форматов в Safari для iPhone iOS5 и последней версии Safari для Mac

Хотя input type = "tel" работает для вызова цифровой клавиатуры на iphone, это телефонная клавиатура , у которой нет десятичных знаков.

Есть ли способ установить цифровую клавиатурупо умолчанию, используя html / js?Это не приложение для iPhone.Как минимум мне нужны цифры и десятичная точка на клавиатуре.

Обновление

Поля ввода чисел в Safari 5.1 / iOS 5 принимают только цифры и десятичные точки.Значение по умолчанию для одного из моих входов - $ 500,000 .В результате в Safari отображается пустое поле ввода, поскольку $,% являются недопустимыми символами.

Кроме того, когда я запускаю собственную проверку onblur, Safari очищает поле ввода, потому что я добавляю $ кvalue.

Таким образом реализация Safari 5.1 / iOS5 для ввода type = "number" сделала его непригодным для использования.

jsfiddle

Попробуйте здесь - http://jsfiddle.net/mjcookson/4ePeE/ Значение по умолчанию $ 500 000 не появится в Safari 5.1, но если вы удалите символы $ и, оно появится.Разочарование.

Ответы [ 11 ]

16 голосов
/ 28 ноября 2011

Стилизация поля для символов

Когда дело доходит до включения символов в это поле number, вы можете использовать такой обход:

HTML:

<span id="number-container">
    <input type="number" name="number" id="number-field" value="500" />
    <span id="number-container-symbol">$</span>
</span>

CSS:

#number-container {
    position: relative;
}
#number-container-symbol {
    left: 5pt;
    position: absolute;
    top: 0px;
}
#number-field {
    background-color: transparent;
    padding-left: 10pt;
}

Считайте это доказательством концепции. Смотрите этот jsfiddle для живого примера. В Chrome это выглядит так:

enter image description here

Определение меньшей гранулярности

На основании документации по вводу чисел (Черновик редактора) , для определить гранулярность вам необходимо добавить атрибут step="<some-floating-point-number>" в тег <input>:

<input type="number" name="number" value="500.01" step="0.01" />

и это будет работать во многих современных браузерах. См. этот jsfiddle для тестов.

Заключение

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

Альтернативное решение - пустое поле перед чем-то другим

Вы также можете обманом заставить кого-то поверить, что он видит содержимое поля ввода , но показать ему что-то еще за полем (это некоторое расширение моего первоначального решения). Затем, если кто-то коснется поля, вы можете распространить правильное значение и т. Д., А затем вернуться к предыдущему состоянию по размытию. Смотрите этот код ( живой пример на jsfiddle - синий цвет означает, что вы смотрите на то, что находится за пределами поля):

// store original value from INPUT tag in jQuery's .data()
var input_field = jQuery('#number-field');
var display_span = jQuery('#number-container-value');
var base_val = parseFloat(input_field.val());
input_field.data('storedVal', base_val);
input_field.val('');
display_span.html(base_val);

// react to field gaining and losing focus
jQuery('#number-field').on('focus', function(event){
    var el = jQuery(this);
    var display = jQuery('#number-container-value');
    if (typeof el.data('storedVal') != 'undefined'){
        el.val(el.data('storedVal'));
    };
    display.html('');
}).on('blur', function(event){
    var el = jQuery(this);
    var display = jQuery('#number-container-value');
    var new_val = parseFloat(el.val());
    el.data('storedVal', new_val);
    display.html(new_val);
    el.val('');
});

(полный код со стайлингом находится на упомянутом jsfiddle). Код нуждается в сокращении и очистке, но это подтверждение концепции . Попробуйте и поделитесь своими выводами, пожалуйста.

7 голосов
/ 28 ноября 2011

Почему бы не поместить $ вне поля ввода (как метку). Или знак процента справа от поля ввода? Похоже, это решит вашу проблему, и вы сможете использовать input type = "number", и это будет просто работать.

5 голосов
/ 30 ноября 2011

Вы застряли между камнем и наковальней.Пока в спецификации HTML не найдется место для type="currency" (а этого, вероятно, никогда не произойдет, потому что разные страны пишут валюту), вам придется использовать магию JS, чтобы обойти эту проблему.

Конечно, номер или телефон не будут лучшей идеей, однако, используя немного хитрости JS, я нашел следующее решение:

var i   = document.getElementById( 'input' );

i.onblur    = function()
{
    i.type  = 'text';

    i.value = number_format( i.value );
}

i.onfocus   = function()
{
    var v   = Number( i.value.replace( /\D/, '' ) );

    i.type  = 'number';

    i.value = v > 0 ? v : '';
}

Просто я поменяю местами типввода в зависимости от фокуса / размытия, это означает, что как только пользователь покинул текстовое поле, мы можем отформатировать его задницу.Когда пользователь возвращается, мы берем значение, если оно есть> 0, и вставляем его обратно как число.Вот рабочий тест, надеюсь, он поможет: http://jsfiddle.net/ahmednuaman/uzYQA/

3 голосов
/ 19 марта 2013

Рабочее решение: протестировано на iPhone 5, Android 2.3, 4

Решение Tadeck (победитель награды) об использовании <span> для хранения символов поля ввода и размещения отформатированного <span> поверхввод валюты в основном то, что я в итоге сделал.

Мой окончательный код отличается и короче, поэтому я публикую его здесь.Это решение решает проблему проверки iOS5 с символами $,% внутри полей ввода, поэтому input type="number" может использоваться по умолчанию.

Поле символов, например."xx%" "xx лет"

<input name="interest-rate" value="6.4" maxlength="4" min="1" max="20" />
<span class="symbol">%</span>
  • Просто используйте поле ввода чисел и интервал вне ввода для отображения символа.

Поле валюты, например.«$ xxx, xxx»

<span id="formatted-currency">$500,000</span>
<input id="currency-field" type="number" name="loan-amount" value="500000" maxlength="8" min="15000" max="10000000" />
  • Поместить интервал поверх ввода валюты и настроить отображение на входе: нет
  • Когда пользователь нажимает / нажимает на интервал, скрыть промежуток и показать вход.Если вы правильно расположите диапазон, переход будет плавным.
  • Тип числового ввода позаботится о проверке.
  • При размытии и отправке ввода установите html диапазона в качестве значения ввода.,Отформатируйте промежуток.Скрыть ввод и показать диапазон с отформатированным значением.

$('#formatted-currency').click(function(){
    $(this).hide();
    $('#currency-field').show().focus();
});
$('#currency-field').blur(function(){
    $('#formatted-currency').html(this.value);
    $('#formatted-currency').formatCurrency({
        roundToDecimalPlace : -2
    });
    $(this).hide();
    $('#formatted-currency').show();
});
// on submit
$('#formatted-currency').html($('#currency-field').val());
$('#formatted-currency').formatCurrency({
    roundToDecimalPlace : -2
});
$('#currency-field').hide();
$('#formatted-currency').show();
3 голосов
/ 16 мая 2012

Далее выскакивает цифровая клавиатура для iPad с iOS5, позволяет вводить любой символ и разрешается устанавливать любое значение :

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

Однако это уродливо, хрупко (вероятно, сломается в будущем ...) и не работает на iPhone (iPhone показывает цифровую клавиатуру, которая позволяет только от 0 до 9). Кажется, что решение работает только с использованием шаблона \d* или его эквивалента [0-9]*.

Может быть, лучше использовать type="tel", который, кажется, действует так же.

2 голосов
/ 17 июля 2014

У меня была похожая проблема, и я пришел к этому ужасно-уродливому js-решению, заставляющему iPad выдвигать цифровую клавиатуру.

Моя проблема заключалась в том, что сафари отфильтровывало все, кроме цифр, при публикации формыи мне нужны различные дополнительные символы, например «3/7» или «65 $».

var elem = document.getElementById('MathAnswer');
elem.type = 'number';

elem.onfocus = function() {
  setTimeout(function() {
    elem.type = 'text'; 
  }, 1);
};

Просто установите тип ввода обратно на «текст» после iPadпоказала цифровую клавиатуру, и вуаля, сафари больше не удаляет любые цифры.

Надеюсь, это кому-нибудь поможет!

0 голосов
/ 10 декабря 2015

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

https://output.jsbin.com/necuzoj/quiet

Мы попытались изменить тип ввода с type = number на type = text on focus, но это было ненадежно: (1) цифровая клавиатура не показывала 100% времени, и (2) если форма была Дольше, чем экран, тогда автопрокрутка, чтобы показать, что сфокусированный ввод был полностью заполнен (иногда сфокусированный ввод был бы вне экрана или под виртуальной клавиатурой).

Отображение цифровой клавиатуры (например, type=tel) не позволило ввести десятичную точку или двоеточие.

На iPad вы можете просто использовать <input type=text pattern=[0-9]*> для отображения клавиатуры с цифрами и точками, но это решение не работает для iPhone (iPhone показывает цифровую клавиатуру без десятичной точки).

0 голосов
/ 15 августа 2014

Ваша проблема будет решена, если Safari будет поддерживать HTML5-атрибут inputmode для элементов ввода.Никто не знает, произойдет ли это или когда это произойдет.Тем временем эта ссылка обеспечивает интересное чтение.

0 голосов
/ 16 мая 2012

Это решение работает на iPad и iPhone, и даже Следующая / Предыдущая работа. Попробуйте http://fiddle.jshell.net/L77Cq/2/show/ (или http://jsfiddle.net/L77Cq/ для редактирования).

<!DOCTYPE html>
<head>
<style>
    .riggedinput::-webkit-input-placeholder {
    margin: 0em;
    font: -webkit-small-control;
    color: initial;
    letter-spacing: normal;
    word-spacing: normal;
    line-height: normal;
    text-transform: none;
    text-indent: 0px;
    text-shadow: none;
}
</style>
<script>
    function focused() {
        var test = document.getElementById('test');
        setTimeout(function() { // timeout needed so that keyboard changes to numeric when using Next/Previous keyboard navigation buttons
            if (document.activeElement === test) {
                test.type = 'text';
                test.value = test.placeholder;
                test.placeholder = '';
            }
        }, 1);
    }
    function blurred() {
        var test = document.getElementById('test');
        var value = test.value;
        test.placeholder = value;
        test.value = '';
        test.type = 'number';
    }
    if (!/^(iPhone|iPad|iPod)$/.test(navigator.platform)) alert ('Code specific to Mobile Safari');
</script>
</head>
<body>
    <input>
    <input id="test" type="number" class="riggedinput" placeholder="$100.10USD" onfocus="focused()" onblur="blurred()">
    <input>
</body>

У него все еще есть следующие проблемы: * При использовании форм необходимо скопировать значение в скрытое поле. * По какой-то причине страница выглядит забавно (скрывается адресная строка iPhone, консоль отладки iPad).

PS: я нашел эту технику независимо от комментария Ахмеда Нуамана выше (я пробовал это в прошлом, и заметил его комментарий только сейчас - аааа!).

0 голосов
/ 16 мая 2012

Существует потенциально другой способ обойти эту проблему для iPhone:

<input id="test" TYPE="text" value="5.50" ontouchstart="this.type='number'" onfocus="this.type='text'" />

Это меняет тип на число до , когда ввод получает фокус при касании (так, чтобы цифровая клавиатура отображала), а затем изменяет тип на текстовый, чтобы можно было отредактировать правильное значение.

Надежно работать с ним может быть сложно, хотя, например, в настоящее время ввод с сенсорным вводом, а затем отключение пальца оставляет его как type = number, ине может придумать, как обнаружить кнопку «Далее» на клавиатуре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...