如何在输入类型Number中阻止+,-,e?

Posted

技术标签:

【中文标题】如何在输入类型Number中阻止+,-,e?【英文标题】:How to block +,-,e in input type Number? 【发布时间】:2017-01-10 13:06:33 【问题描述】:

当我提供输入类型编号时,字母 e 和特殊字符也会显示在输入字段中。我只想显示数字。怎么屏蔽?

<input type="number">

【问题讨论】:

您是在项目中使用 Angular 还是只是打错了标签? 1e1 是一个有效数字,即exponential notation。 @Aaron,你是对的,但 OP 只想显示数字。 我知道 1e1 是一个有效数字...但我只想显示 0-9 之间的数字...有什么办法可以阻止它们? 这不是 How to make type=“number” to positive numbers only 的副本。这些答案不会妨碍科学记数法。 (一个答案尝试,但它不起作用。) 【参考方案1】:

你可以使用 jQuery 轻松做到这一点

试试这个代码

$(function() 
    $("#input").keypress(function(event) 
        if (event.which != 8 && event.which != 0 && (event.which < 48 || event.which > 57)) 
            $(".alert").html("Enter only digits!").show().fadeOut(2000);
            return false;
        
    );
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="number" id="input" />
<div class="alert"></div>

【讨论】:

【参考方案2】:

如果您不喜欢传入的键值,请尝试阻止默认行为:

document.querySelector(".your_class").addEventListener("keypress", function (evt) 
    if (evt.which != 8 && evt.which != 0 && evt.which < 48 || evt.which > 57)
    
        evt.preventDefault();
    
);

// 0 for null values
// 8 for backspace 
// 48-57 for 0-9 numbers
&lt;input type="number" class="your_class"&gt;

【讨论】:

用户仍然可以复制粘贴 12e.+- 这将破坏 html5 中的最小/最大验证 if (evt.which != 8 && evt.which != 46 && evt.which 57 || evt.key=='.') 12...34 如何防止复制粘贴 12e.+- –【参考方案3】:

您可以尝试替换非数字值,而不是尝试阻止值。

如果您选择处理键码,则必须处理 numKeysnumPadshift +crtl + 等,并且在焦点位于文本框内时尝试刷新也会失败。防止默认值会比不正确的值停止更多。

$("#input").on("input", function() 
  var nonNumReg = /[^0-9]/g
  $(this).val($(this).val().replace(nonNumReg, ''));
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="tel" id="input" />
<div class="alert"></div>

【讨论】:

我猜他希望输入类型是数字(以获得微调器)【参考方案4】:

您可以使用keydown 事件阻止输入这些字符

var inputBox = document.getElementById("inputBox");

var invalidChars = [
  "-",
  "+",
  "e",
];

inputBox.addEventListener("keydown", function(e) 
  if (invalidChars.includes(e.key)) 
    e.preventDefault();
  
);
&lt;input type="number" id="inputBox" /&gt;

但如果他/她进行复制/粘贴(或通过控制台),用户仍然可以输入它们。为了防止复制/粘贴,您可以对输入的值 [*] 进行替换。

var inputBox = document.getElementById("inputBox");

var invalidChars = [
  "-",
  "+",
  "e",
];

inputBox.addEventListener("input", function() 
  this.value = this.value.replace(/[e\+\-]/gi, "");
);

inputBox.addEventListener("keydown", function(e) 
  if (invalidChars.includes(e.key)) 
    e.preventDefault();
  
);
&lt;input type="number" id="inputBox" /&gt;

* 在类型设置为数字的输入字段中,您无法真正获取输入的值。只要是数字就可以获取输入的值,即该值通过内部数字校验。如果用户复制/粘贴1e,建议的解决方案将失败。

当您输入 1e 时会发生什么情况,输入字段会检查它是否是数字,如果不是(1e 不是)它会引发警告:

指定的值“1e”不是有效数字。该值必须与以下正则表达式匹配:-?(\d+|\d+.\d+|.\d+)([eE][-+]?\d+)?

并且value 属性设置为""

如果您检查该字段的属性,您会发现valueAsNumber 属性。如果输入的值是数字,输入字段会解析该值并将其存储在valueAsNumber 中。由于1e 不是数字,它的计算结果为NaNNaN 被分配给valueAsNumbervalue 被设置为""。尽管您仍然在输入字段中看到1e

我已经问过一个与此问题相关的问题,但还没有解决方案。

Get the entered value on number input field, not the parsed

【讨论】:

@downvoter 否决者愿意解释他的理由吗?我怀疑这个答案没有用。 非常好的解决方案,其他答案看起来像肮脏的把戏,或者没用。投票!【参考方案5】:

由于 OP 的问题被标记为“angularjs”,最简洁的解决方案可能是使用指令。之前已在此处解释了此方法的几种解决方案:

angularjs: allows only numbers to be typed into a text box

【讨论】:

【参考方案6】:

如果您想 + 登录您的电话号码字段,则可以使用此代码。

var inputBox = document.getElementById("inputBox");

var invalidChars = [
  "-",
  "e",
];

inputBox.addEventListener("keydown", function(e) 
  if (invalidChars.includes(e.key)) 
    e.preventDefault();
  
);
&lt;input type="number" id="inputBox" /&gt;

【讨论】:

【参考方案7】:
$("#input").on("input", function() 
  var nonNumReg = /[^0-9]/g
  $(this).val($(this).val().replace(nonNumReg, ''));
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="tel" id="input" />
<div class="alert"></div>

【讨论】:

这个答案应该包含一些解释。仅发布代码 sn-p 不是一个好的答案。【参考方案8】:

按照上述答案的形式,上面的大多数示例都涵盖了它,我只是注意到在输入“E”时这仍然是允许的,所以我认为最好将它添加到数组中。我在这个例子中使用 Jquery 3.3.1

这样,无论您输入到数组中的任何内容都将被阻止输入到输入框中

注意 - 将 'elementid' 作为你想要应用的元素的 id 同样,如果您想将此应用于 JQuery 中类型为数字的所有输入 --> $("input[type='number']")

var invalidChars = ["-", "e", "+", "E"];

$("input[type='number']").on("keydown", function(e) 
    if(invalidChars.includes(e.key))
         e.preventDefault();
    
):

上面的这个示例应该适用于所有类型为数字的输入,并防止字符“-”、“e”、“+”和“E”被键入输入。

更新

还注意到您可以输入“。”因为它们代表对数字有效的小数点。我正在使用此验证电话号码,显然(对于英国)没有“。”所以这也可能是要添加到您的数组中的另一个字符。

【讨论】:

添加“.”到 invalidChars 以防止像 12...34 这样的输入 我想你还是想要 .对于字符串中的小数类型【参考方案9】:

你可以使用一些 JQuery 代码来阻止

 $('input[Type="Number"]').keypress(function (e) 
    if ('0123456789'.indexOf(e.key) == -1) 
        e.preventDefault();
    
);

这将影响所有数字类型的输入

【讨论】:

【参考方案10】:

我在 React 中使用的一个简单解决方案。

onKeyDown=(evt) => ["e", "E", "+", "-"].includes(evt.key) && evt.preventDefault()

【讨论】:

【参考方案11】:

你可以检查它是否是一个数字。

// Restrict e, -, + for html input number $(document).on('keypress', ':input[type="number"]', function (e) if (isNaN(e.key)) return false; );

【讨论】:

这会禁用退格、删除、制表符、回车【参考方案12】:

JQuery 如果要接受小数(。)也可以使用以下代码

$('input[Type="Number"]').keypress(function (e) 
    if ('0123456789'.indexOf(e.key)!=-1)
    else if (e.key=='.' && this.value!='' && (this.value.match("\.") || []).length==0)
    elsee.preventDefault();
);

【讨论】:

【参考方案13】:

这是基于其他一些解决方案的使用 jQuery 的非常简洁的解决方案:

$("input[type=number]").on("keydown", function(e) 
        var invalidChars = ["-", "+", "e"]; //include "." if you only want integers
        if (invalidChars.includes(e.key)) 
            e.preventDefault();
        
);

【讨论】:

【参考方案14】:

我不确定您的用例的详细信息,但您自己可能不需要做很多事情来处理这些。对于初学者,您可以设置一个min,它可用于防止负面影响,以及一个max 值和一个step 值(如果有用的话)。原来默认步长是 1,所以它需要整数,除非您指定小数步长值。

在处理数字中的“e”时,可以使用 Number() 将文本转换为数字,它会自动转换“e”以及任何“+”号:

> Number("5e3") 
5000
> Number("+42") 
42

如果您确实需要对提交的值进行规范化,您可以将其转换回原位。我认为可能对用户最友好的时间是模糊:

input.addEventListener('blur', () => 
  if (input.value !== '' && input.checkValidity()) 
    input.value = Number(input.value);
  
);

【讨论】:

以上是关于如何在输入类型Number中阻止+,-,e?的主要内容,如果未能解决你的问题,请参考以下文章

阻止在输入类型号中输入负值的角度方式(在复制粘贴和增加、减少时)

为啥“数字”类型的 html 输入允许在字段中输入字母“e”?

如何删除输入类型中的默认颜色?

在Chrome与火狐中,输入框input类型为number时,如何去除掉的自带的上下默认箭头

如何阻止对话回到开头?

对于输入类型 =“数字”,如何在角度 4 中显示默认值 0.00?