TLDR; (ОБНОВЛЕНИЕ)
- Есть ли способ сообщить, что
<input>
имеет номер типа, без использования настройки атрибутаtype=number
.- то есть мобильные устройства распознают и отображают цифровую клавиатуру и т.д.
- Для
<input>
, который имеетtype=number
, есть способ усвоить весь ввод с клавиатуры, который не приводит к действительному числу- До того, как персонаж будет добавлен к вводу браузером, не удаляйте ненужное удаление на
keyup
- До того, как персонаж будет добавлен к вводу браузером, не удаляйте ненужное удаление на
ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ НИЖЕ ДЛЯ ОРИГИНАЛЬНОГО ПОДРОБНОГО ОПИСАНИЯ
Моя проблема заключается в следующем;
У меня есть элемент HTML <input>
, который я хочу принимать только числа и быть распознанным на мобильных устройствах в качестве числового поля. Я также хочу, чтобы недопустимые символы проглатывались, как для стандартного type=number
глотания запрещенных символов.
Я попробовал очевидное type=number
, но у него есть ряд недостатков. В частности, он допускает 'e', '+' и '-' (по крайней мере, в chrome), но их было легко исправить с помощью некоторых JS. Настоящая проблема с "." характер, я хочу иметь возможность вводить числа с плавающей точкой, например '0.10', '5.5054', но я не хочу иметь возможность вводить недопустимые строки, например, '0.10.1'. Я попытался решить эту проблему, допустив только 1 '.' за один раз, но это не удалось, так как input.value
обрабатывается браузером, например, '5.' становится '5', '5..' становится нулевым (!), и кажется невозможным получить необработанное строковое значение, введенное во ввод. Вышесказанное означает проверку на наличие ". и принятие мер кажется тупиком...
Основные вопросы:
- Есть ли способ пропустить, чтобы проверить и согласовать ввод?
- "Есть ли способ отметить вход как число без материально-технического багажа
type=number
?
Примечание:
* Я понимаю, что вы можете вставить все, что вы хотите, я считаю это поведение патологическим и не должно быть включено в предотвращение ввода.
UPDATE:
Чтобы уточнить, я уже пробовал keypress
, keydown
и т.д. События, и они не подходят, так как я хочу увидеть, сколько ". существует на входе в настоящее время, чтобы выбрать, разрешить или нет другое. В этот момент браузер массирует input.value
для удаления '. Я хочу условно разрешить символы на основе текущего числа '. которые были введены.
Пример:
HTML (угловая привязка стиля для краткости)
<input type="number" (keydown)="keyDown()">
JS
function keyDown($event: KeyboardEvent) {
const inputField = // obtain reference to input element
const value = inputField.value;
if ( value.indexOf('.') !== -1 && $event.key === '.') { // disallow another . if one is present
// ! input field prunes . so this check isn't sufficient
$event.preventDefault();
return;
}
// This is the crux of the problem e.g.
// type 5. into input field, value === 5
// type 5.. into the input field, value === null
// Since the . char is removed by the input element there no way to know how many are present!
console.log(value);
}