我正在尝试为keydown事件添加allow
函数。应该发生的是,你可以传递一个RegExp
或string
个键盘键,你想允许它插入到输入栏中,然后其他一切都被拒绝。
我遇到的问题是其他问题。有它阻止每一个输入。删除else允许RegExp
工作,但字符串不起作用。
造成这种情况的原因是什么?
function allow(evt, ...names) {
for (let i = 0; i < names.length; i++) {
let name = names[i]
if (name instanceof RegExp) {
if (!name.test(evt.key)) {
evt && evt.preventDefault()
}
} else {
name = name.toString()
if (name.toLowerCase() != evt.key.toLowerCase()) {
evt && evt.preventDefault()
}
}
}
}
document.querySelector('input').addEventListener('keydown', e => {
allow(e, /\d/, 'Backspace')
})
&#13;
<input type="text">
&#13;
答案 0 :(得分:1)
我猜你试图限制用户输入input
框。在该示例中,您只需要用户键入数字或退格。
你的案件的问题是你的情况都会被解雇。如果用户键入,比如键盘上的数字1,如果条件评估,这很好,但是你循环到Backspace(第二个名字),它在小写条件下失败。
尝试这样的事情:
const allow = (evt, ...names) => {
const keys = names.filter(n => n.constructor !== RegExp)
const regexs = names.filter(n => n.constructor === RegExp)
const isInKeys = keys.filter(k => k.toLowerCase() === evt.key.toLowerCase())
if (isInKeys.length === 0) {
regexs.forEach(regex => {
if (!regex.test(evt.key)) {
evt && evt.preventDefault()
}
})
}
}
您检查用户是否按下了您允许的密钥,然后不需要任何操作,否则将其传递给所有regex
。
HTH