【问题标题】:How to disable or prevent the space key entry on web form如何禁用或阻止 Web 表单上的空格键输入
【发布时间】:2018-09-05 20:21:34
【问题描述】:

我只想允许在表单域中输入字母和数字。我使用正则表达式等尝试了许多变体,但我无法禁用空格键或任何特殊字符键。

这是我的代码的最新副本:

document.querySelector('#upperCase').addEventListener('keyup', function(e) {
  console.log(this.value);
  if (e.which == '32') return false;
  this.value = this.value.toUpperCase();
});
#upperCase {
  text-transform: uppercase;
}
<form>
  <input id="upperCase" maxlength="10" name="upperCase" type="text">
</form>

是否可以只允许在输入文本框中键入字母和数字?

这是我的 jsfiddle:https://jsfiddle.net/bcjg7osr/29/

【问题讨论】:

    标签: javascript regex html


    【解决方案1】:

    一种方法是在输入中使用模式属性。 patter 属性的唯一问题是在提交表单之前它不会禁止使用空格,在这种情况下提交将不起作用并且将要求用户更改输入。这将只允许字母和数字。

    <input pattern = "[A-Za-z0-9]" id="upperCase" maxlength="10" name="upperCase" 
    type="text">
    

    【讨论】:

    • 这是推荐的方式。 (您也可以使用 onchange 监听器在提交表单之前检查模式)
    【解决方案2】:

    ? 修复你的代码

    您应该使用Event.preventDefault() 而不是return false,因为这是 jQuery 特有的。

    您还应该使用keydown 而不是keyup,因为keyup 在默认操作之后触发,因此阻止它为时已晚。 keypress 也可以是一个选项。

    另外,KeyboardEvent.which 返回一个number,而不是string,所以最好使用e.which === 32 而不是e.which == '32'

    document.querySelector('#upperCase').addEventListener('keydown', function(e) {
      console.log(e.which);
      
      if (e.which === 32) {
        e.preventDefault();
      }
    });
    #upperCase {
      text-transform: uppercase;
    }
    <form>
      <input id="upperCase" maxlength="10" name="upperCase" type="text">
    </form>

    ? 关于如何获取按键的旁注

    不过,请注意,KeyboardEvent.whichKeyboardEvent.keyCode 目前都已弃用。它们较新的选项是KeyboardEvent.keyKeyboardEvent.code,但浏览器支持还不是很好。

    ? 使用正则表达式仅验证字段

    关于您是否可以使用RegExp 的问题,是的,您可以使用RegExp。

    但是,请注意,如果您想防止任何无效字符出现在输入字段中,则不能在 pattern HTML 属性中使用它,因为这只会在其所属的表单提交时验证其值,如您在此处看到的:

    document.getElementById('form').onsubmit = (e) => {
      e.preventDefault();
    };
    <form id="form">
      <input pattern = "\w*" type="text">
    
      <button>SUBMIT</button>
    <form>

    ? 使用正则表达式根据输入值防止 keyDown 事件

    此外,在keydown 事件侦听器中使用 RegExp 来验证输入的值将不起作用,因为您将获得上一个值,即最后一次击键之前的值:

    document.querySelector('#upperCase').addEventListener('keydown', function(e) { 
      const isInalid = !/^\w*$/.test(this.value);
      
      console.log(`value = "${ this.value }", which is ${ /^\w*$/.test(this.value) ? 'still valid.' : 'now invalid.' }`);
      
      if (isInalid) {
        e.preventDefault();
      }
    });
    #upperCase {
      text-transform: uppercase;
    }
    <form>
      <input id="upperCase" maxlength="10" name="upperCase" type="text">
    </form>

    ? 使用 RegExp 来防止基于按下的键的 keyDown 事件

    但是,如果您使用 KeyboardEvent.key,则可以使用 RegExp 来验证每个按下的键:

    document.querySelector('#upperCase').addEventListener('keydown', function(e) {
      const key = e.key;
      const isCharacter = key.length === 1;
      
      console.log(`e.key = ${ key } (${ isCharacter ? 'character' : 'special key' })`);
      
      // We don't want to prevent special keys like backspace or delete:
      if (isCharacter && !/\w/.test(e.key)) {
        e.preventDefault();
      }
    });
    #upperCase {
      text-transform: uppercase;
    }
    <form>
      <input id="upperCase" maxlength="10" name="upperCase" type="text">
    </form>

    请注意,您仍然可以使用 e.which 执行类似的操作,但在这种情况下您将不会使用 RegExp。

    ✨ 使用正则表达式从输入事件中强制执行某种格式

    如果您需要更高级的行为,例如以非常具体的方式格式化输入值,您可以使用input 事件来代替。

    例如,假设我们想要一个带有千位分隔符的数值输入字段。一个超级基本的实现看起来像这样:

    document.querySelector('#upperCase').addEventListener('input', function(e) { 
      const numericValueMatch = this.value.match(/\d+/g);
      
      if (!numericValueMatch) {
        this.value = '';
        
        return;
      }
      
      const valueAsNumber = parseInt(numericValueMatch.join(''));
      
      console.log(`valueAsNumber = ${ valueAsNumber }`);
      
      // toLocaleString is not the best option, but that's ok for this example:
      this.value = valueAsNumber.toLocaleString();
    });
    &lt;input id="upperCase" maxlength="10" type="text" /&gt;

    请注意,这只是一个超级基本的演示。您需要额外的逻辑来在每次按键后保持光标的位置,并使其正常工作。理想的解决方案可能会监听多个事件。

    【讨论】:

    • 完美@Danziger。那么是否可以使用正则表达式来限制字母和数字,而不是空格键或任何特殊字符?另外,我在心里“赞成”你:)
    • 你到底想做什么@jdoe?
    • 漂亮的答案!作为旁注,e.whiche.keyCode 出于充分的理由已被弃用和劝阻。请改用e.key
    【解决方案3】:

    添加了“只有字母和数字”的要求。我想你也想允许 Backspace 。您可能会找到您想要允许的其他键(TAB、箭头键...)。

    let allowedKeys = [..."01234567890abcdefghijklmnopqrstuvwxyz", "backspace"];
    
    document.getElementById('upperCase').addEventListener('keydown', (e) => {
      console.log(e.key);
      if (!allowedKeys.includes(e.key.toLowerCase())) {
        e.preventDefault();
        return false;
      }
      e.target.value = e.target.value.toUpperCase();
    });
    #upperCase {
      text-transform: uppercase;
    }
    <form>
      <input id="upperCase" maxlength="10" name="upperCase" type="text">
    </form>

    【讨论】:

      【解决方案4】:

      你可以在你的js文件里做:

      document.querySelector('#upperCase').addEventListener('keyup',function(e){
      if(e.which=='32') this.value='Dont enter space please'
      else this.value=this.value.toUpperCase();
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-10
        • 2014-10-19
        • 2022-09-27
        • 2011-08-03
        • 2017-08-27
        • 1970-01-01
        相关资源
        最近更新 更多