返回

Input Number 输入框为何能输'e'?原因与解决方案

vue.js

数字输入框接纳字母 “e” 的奥秘

开发前端应用时,经常需要限制用户输入的数据类型,例如使用 input type="number" 来期望用户仅输入数字。不过,有时你会发现一个意外现象:即便 input type 设置为 number,仍然能够输入字母 “e”。这不是一个 bug,而与该输入类型背后的逻辑有关。这个现象常常让开发者困惑,并可能导致应用的数据校验和处理出现问题。

原因探究:为何 “e” 被允许?

根本原因在于 input type="number" 并不仅仅是为了输入整数而设计的。它被设计成允许输入合法的数字字符串 ,而非严格的纯数字。而 “e” 字符在科学计数法(如1e10,表示 1 乘以 10 的 10 次方)中扮演着关键角色。HTML 规范将 "e" (大小写都允许) 作为有效的数值符号进行识别。所以,浏览器允许输入 "e",以便用户输入浮点数或科学计数法表示的数值。换言之, input type="number" 更侧重于支持各种数值表达形式,而不是绝对地限制用户只输入数字 0-9。其他字母则不会被接受,因为它们不属于合法的数字表达符号。

解决方案:限制 “e” 输入

既然问题的核心在于浏览器允许 "e" 字符作为有效数值输入,那么限制“e” 输入的方法也需围绕此展开。主要有三种方案可考虑。

  1. 使用 input 事件监听与过滤

    此方案使用JavaScript监听 input 元素的变化,并实时过滤输入的值。具体做法是:每次 input 事件触发时,获取输入框当前的值,用正则表达式或其他方法剔除非数字和 ‘.’ 之外的所有字符(可以去除 ‘e’ 及其他不允许输入的字符),然后将处理后的值重新设置回输入框。

    const inputElement = document.getElementById('your-input-id');
    
    inputElement.addEventListener('input', function(event) {
      let value = event.target.value;
      // 仅保留数字和点,或者可以使用/^[0-9]*\.?[0-9]*$/这种正则表达式
      value = value.replace(/[^0-9.]/g, '');
    
      event.target.value = value;
    });
    

    步骤:

    1. <input> 元素的 id 替换为实际的 ID。
    2. 在你的 HTML 文档中添加这个 <input> 元素。
    3. 将代码添加到 JavaScript 文件中。

    这个方法的好处是实时过滤,用户体验良好,并提供非常高的控制权。但要注意,需要根据实际情况修改正则表达式,支持小数点或负号输入。

  2. 限制键盘输入 (keydownkeypress 事件)

    另一种做法是直接拦截键盘输入,在用户键入时检查按键,阻止输入 “e” 和其他不允许的字符。使用 keydownkeypress 事件可以做到这一点,这需要在按键按下后进行即时判断。

     const inputElement = document.getElementById('your-input-id');
     inputElement.addEventListener('keydown', function(event){
        if(event.key === 'e' || event.key ==='E') {
            event.preventDefault();
         }
     });
    

    步骤:

    1. 同方案一,将代码片段添加到对应的 <input> 元素的id中。
    2. 添加对应的js代码即可。

    这样做,可以彻底阻止 “e” 的输入,控制更加直接。 缺点在于会直接阻止一些例如粘贴快捷键的操作,体验稍逊于第一种。并且仍然需要处理其他不被允许的符号和键盘快捷键。

  3. 使用非 input type="number" 输入框和 JavaScript 控制
    有时,严格的数据校验可能需要使用 input type="text" 或类似 input type="tel" ,并完全通过 JavaScript 控制用户输入和格式化数据。这种方法给了开发者更大的灵活性,可以使用正则表达式或专门的库,执行复杂的数据验证和格式化逻辑,包括阻止所有非数字输入。

    <input type="text" id="custom-input">
    
    const inputElement = document.getElementById('custom-input');
       inputElement.addEventListener('input', function(event){
           let value = event.target.value;
           value = value.replace(/[^0-9]/g, '');
            event.target.value = value
      });
    

    步骤:

    1. 修改 inputtype 属性为 text,或者tel 等非 number 类型。
    2. 和第一个方案类似,将这段代码嵌入到页面对应的脚本代码段。

    通过此方法,开发者能构建更加强大、个性化的输入控制组件,提供自定义校验和展示逻辑。需要更多代码,同时开发和维护的复杂性也更高。

安全建议与注意事项

在上述方法基础上,还需考虑一些安全性问题。始终对用户输入进行服务器端验证,防止恶意用户绕过客户端验证发送非法数据。当在客户端使用 JavaScript 进行数据验证时,不要过于依赖,前端校验仅仅是为了改善用户体验,服务端校验不可或缺,特别是对金钱,密码等敏感信息的校验。合理使用合适的验证机制能够避免由于 input type="number" 类型行为引发潜在的安全问题。同时,使用服务端代码的规范化校验可以有效地控制用户的非法数据提交行为。

以上便是关于 input type="number" 输入框允许字母 “e” 的原因分析与相应解决方案。每种方案有不同的应用场景和优缺点。应该根据实际应用的需求选择最合适的方案。