允许基于正则表达式或字符串

时间:2018-02-18 18:57:08

标签: javascript

我正在尝试为keydown事件添加allow函数。应该发生的是,你可以传递一个RegExpstring个键盘键,你想允许它插入到输入栏中,然后其他一切都被拒绝。

我遇到的问题是其他问题。有它阻止每一个输入。删除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;
&#13;
&#13;

1 个答案:

答案 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