У меня есть <input type="number" />
, и я хочу запретить ввод любых нецифровых символов.
<input id="app-client-id" type="number" pattern="[0-9]+" />
Для предотвращения регулярных нажатий клавиш это можно сделать с помощью
const validKeys = new Set([
'home',
'end',
'pageup',
'pagedown',
'delete',
'backspace',
'arrowleft',
'arrowright',
]);
function isValidKeypress(e) {
// numeric characters
if (e.charCode >= 48 && e.charCode <= 57) {
return true;
}
if (e.key && validKeys.has(e.key.toLowerCase())) {
return true;
}
// for allowing select all, copy, and paste
if (e.ctrlKey) {
return true;
}
return false;
}
$('#app-client-id').on('keypress', isValidKeypress);
Теперь все, что осталось, - это предотвратить вставку нечисловых символов или, в идеале, отфильтровать нечисловые символы.
function filterPastedText(e) {
let clipboardData = e.originalEvent.clipboardData,
text = clipboardData.getData('text').replace(/[^\d]/g, '');
clipboardData.setData('text', text);
}
$('#app-client-id').on('paste', filterPastedText);
Это работает в Chrome / Webkit. Однако в Firefox выдает ошибку setData()
:
NoModificationAllowedError: Модификации для этого документа не разрешены
Любые идеи о том, как указать браузеру, чтобы он разрешал звонить setData()
?
Если такого метода не существует, есть ли способ вручную «вставить» отфильтрованное значение в input
в правой позиции курсора (и заменить выделенный текст, если таковой имеется) без использования скрыто textarea
? У меня проблемы с определением положения курсора в элементе input
, независимо от того, выделен ли текст; myInput.selectionStart
всегда null
.
Редактировать
Оказывается, вызов setData()
на самом деле не работает в Chrome. Установка типа number
автоматически отфильтровывает нечисловые символы , за исключением 'e', '-' и '.', И строка, на которой я тестировал, не включала ни одного из этих символов , Вызов setData()
просто молчит.