html只允许输入数字,html输入框只能输入数字

  html只允许输入数字,html输入框只能输入数字

  这两年看到很多关于这个的文章和帖子,真的是一件很方便的事情。但是太多的实现还是有漏洞,实现不完整等等。

  整个概念是合理的:用HTML 5属性限制可以发送到服务器的内容,然后用Javascript增强,限制用户首先可以输入的内容。

  所以我们来看看这些问题,更好的认识一下。

  

问题 1,不好的脚本

  最常见的缺陷是缺乏适当的降级功能。如果你想在“electron”或“nw.js”中构建一个完整的stack应用程序,那没问题,但这种形式的东西通常在面向公众的网站中没有位置。

  正如我常说的,高质量的脚本应该增强已经在工作的页面,而不是用户使用它的唯一方式。

  解决方案?

  使用模式和步骤属性来限制有效内容。

  

问题 2,正则表达式模式错误或不完整

  人们最常用的模式是[-/d] *,它的问题是允许到处都是负号。虽然你绝对可以用type="number "来解决问题,但这并不是一个好的选择。截取键时尤其如此,因为减号只能是第一个字符。

  它也可能有问题,因为有些实现“不是”正则表达式,这将导致误报。

  解决方案?

  对于HTML,使用一个更好的表达式:[-d] \ d * $这个更健壮更准确。减号可以是匹配开始处的第一个字符,后跟零个或多个小数,直到字符串结束。

  对于JavaScript,只使用正则表达式来测试数字,并应用一些更实用的逻辑来检测其他值。

  简单易行!

  

问题 3,在标记中使用事件属性

  我知道在JSX垃圾中,大量用嘴呼吸的人在鼓励这一点,但如果你写的是香草或其他系统,请出于对圣诞节的爱,在1997年把你的头骨从直肠里拿出来。

  将“onkeypress”或“onchange”放在标签中意味着错过一个缓存机会,违反了关注点分离的原则。像HTML 4 Strict中丢弃的所有东西一样,以这种方式将JavaScript放入标记中是非常愚蠢的。就像如果你要用“文本-白盒-阴影col-4-s”属性在你的HTML上撒尿,请承认你的失败,然后回到写HTML 3.2的时候,用所有那些字体/中心标签、颜色、BGCOLOR、大小、边框和对齐属性,以及“用于布局的表格”来写。你们好像都很怀念,很珍惜。

  这也意味着您没有对事件处理程序的完全/适当的访问权限。

  解决方案?

  Element.addEventListener请使用!

  

问题 4,必须对每个输入进行硬编码

  无论是通过问题3将事件属性放入标签,还是通过手动获取唯一ID来捕获,我几乎没有找到一个可以实际使用即插即用标签应用的代码库!

  解决方案?

  document . queryselectorall( input[type= number ][step= 1 ])为我们提供了所有想要的整数输入,因此我们可以对其进行增强。

  

问题 5,一些脚本阻止使用导航控制和正常编辑!

  通过拦截和只允许减号和0…9,它们可以防止退格键、回车键、tab键、箭头、删除、插入等。不是所有的浏览器都将这些作为event.key发送,这取决于你挂钩的是什么事件。比如Firefox和Chrome中的“keypress”事件会过滤掉一些,以免破坏正常的表单使用,但“Old Edge”和Safari不会,“keydown”不会过滤任何东西。

  解决方案?

  因为“keypress”事件在不同的浏览器中是不一致的,所以使用keydown。然后,我们可以利用所有控制键在Event.key值中返回多个字符的事实。我们只需要检查Event.key.length1就可以说“继续允许这些”。

  如前所述,我们需要的只是一个简单的输入。不用JavaScript,先有尽可能多的功能!

  HTML:

  input= number step= 1 pattern=[-/d]/d * $ /只接受整数。如果只想接受正数,可以改为pattern=/d "

  JavaScript:

  然后我们可以使用JavaScript来限制用户的输入,这样人们甚至不允许输入无效值。

  (function(){ var integers=document . query selectorall( input[type= number ][step= 1 ]),intRx=/\ d/;for(var input of integers){ input . addevent listener( keydown ,integerChange,false);} function integer change(event){ if(event . key . length 1 (event . key===- event . current target . value . length===0) intrx . test(event . key))return;event . prevent default();}})();首先,我们把它包装在生活中以隔离范围。然后,在页面上抓取我们想要的所有输入,并创建我们的正则表达式。

  我在事件开始时而不是在事件内部创建正则表达式,这样我们就不必浪费时间在每个该死的键上创建它。这就是匿名函数可能带来开销的地方,也是你需要告诉那些“函数式程序员”和他们的“副作用”废话的地方。

  遍历所有输入,并为它们分配事件处理程序。

  上述程序只检查我们的回报。控制键,如箭头、退格键、回车键等。都会返回完整的文本来描述它们,所以如果event.key的长度是1,就不要停这些了。

  如果它是一个减号和第一个字符,通过return允许它。

  如果是数字,通过return允许。

  如果没有,请停止活动。

  

Live Demo

  这是一本密码本。它包括几个文本字段和一些整数和非整数字段,所以您可以看到它实际上只挂钩我们想要的字段。

  https://codepen.io/jason-knight/pen/QWGyrwq

  

悬而未决的问题

  我可能考虑添加的一件事是挂钩“change”事件来拦截粘贴,但是由于“pattern”属性不允许提交无效值,所以应该没有问题。

  

结论

  多想想用户可能输入的错误的东西以及如何处理,但也要记住用户可能输入的所有其他东西,这些东西与值本身无关。

  请始终注意,出于安全或可访问性的原因,许多用户会主动阻止脚本编写或使脚本在UA中不可用。增强而不是取代您的基本功能!

  计划将这些东西应用到所有这些领域,而不是从一开始就只使用单一元素。

  留意低效的地方,比如如何生成多次用作回调的匿名函数……或者如何把脚本放在标签里会错过跨页或者重访的缓存机会。

  做了这些事情之后,实现这么简单的功能就不会再困扰你,也不会再骚扰用户了。

  这就是这篇关于HTML5数字输入只接受整数的实现代码的文章。有关HTML5数字输入整数的更多信息,请搜索之前的文章或继续浏览下面的相关文章。希望你以后能支持我!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: