原文:https://levelup.gitconnected.com/making-html-5-numeric-inputs-only-accept-integers-d3d117973d56作者:JasonKnight这两年看了很多文章和帖子关于这方面,这确实是一件很方便的事情。然而,太多的实现仍然存在错误、实现不完整等。总体概念是合理的:使用HTML5属性来限制可以发送到服务器的内容,然后使用Javascript对其进行增强以首先限制用户可以输入的内容.那么让我们来看看这些问题,并更好地实施它。问题1,糟糕的脚本最常见的陷阱是缺乏适当的降级功能。如果您正在使用“electron”或“nw.js”构建全栈应用程序,那很好,但这种形式的东西通常在面向公众的网站中没有立足之地。就像我经常说的,高质量的脚本应该增强已经工作的页面,而不是用户使用它的唯一方式。解决方案?使用pattern和step属性来限制负载。问题2,正则表达式模式错误或不完整人们最常用的模式是[-/d]*,它存在允许在任何地方使用减号的问题。虽然肯定可以使用type="number"来解决问题,但这不是一个好的选择。在拦截击键时更是如此,因为减号只能是第一个字符。这也可能是有问题的,因为一些实现“不是”正则表达式,这可能导致误报。解决方案?对于HTML,使用更好的表达式:^[-d]\d*$更稳健和准确。减号可以是匹配开始处的第一个字符,后跟零个或多个小数,直到字符串结束。对于JavaScript,仅使用正则表达式来测试数字,并应用一些更实用的逻辑来检测其他值。简单易行!问题3,在标记中使用事件属性我知道有很多口呼吸的人在JSX垃圾中鼓励这样做,但是如果你正在编写vanilla或其他系统,请看在圣诞节的份上Love,把你的头从直肠里拿出来1997年。在标记中放置“onkeypress”或“onchange”是错失了缓存的机会,并且违反了关注点分离原则。以这种方式将JavaScript放入标记中,就像HTML4Strict中弃用的所有内容一样,是彻头彻尾的愚蠢。就像如果你要在你的HTML上撒尿,像“text-whitebox-shadowcol-4-s”这样的属性,承认失败并返回使用所有那些FONT/CENTER标签,COLOR,BGCOLOR,SIZE,BORDER和ALIGN属性,以及“布局表”,你们似乎都非常清楚地错过了。这也意味着您没有完整/正确的事件处理程序访问权限。解决方案?Element.addEventListener,用起来!问题4,每个输入都必须进行硬编码无论是通过问题3将事件属性放入标记中来捕获它们,还是通过手动获取唯一ID,我发现几乎没有实际使用即插即用的代码库标记应用程序!解决方案?document.querySelectorAll('input[type="number"][step="1"]')给了我们所有我们想要的整数输入,所以我们可以增强它。问题5,一些脚本阻止使用导航控件和正常编辑!通过拦截并只允许减号和0...9,它们可以防止退格、回车、制表符、箭头、删除、插入等。并非所有浏览器都会将这些作为event.key发送,这取决于您挂钩的事件。例如,“keypress”事件在Firefox和Chrome中被过滤掉,以免破坏正常的表单使用,但在“oldEdge”和Safari中则不会,而“keydown”什么也不过滤。解决方案?由于“keypress”事件在浏览器中不一致,请改用keydown。然后我们可以利用所有控制键在Event.key值中返回多个字符这一事实,我们只需要检查Event.key.length>1来表示“继续并允许这些”。如前所述,我们所需要的只是一个简单的输入,首先要有尽可能多的功能,而不需要JavaScript!HTML:
