我有一个<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()
?
如果这种方法不存在,有没有办法在不使用 hiddeninput
的情况下手动将过滤后的值“粘贴”到正确的光标位置(并替换选定的文本,如果有的话)?无论是否选择了文本,我都无法检测光标在元素中的位置;总是。textarea
input
myInput.selectionStart
null
编辑
事实证明,调用setData()
实际上在 Chrome 中不起作用。将类型设置为自动过滤掉除number
“e”、“-”和“.”之外的非数字字符,以及我正在测试它的字符串,不包含任何这些字符。调用只是默默地失败。setData()