我在过去两年中看到了很多关于此的文章和帖子,这是一个非常方便的事情。然而,太多的实现仍然存在错误、实现不完整等。总体概念是合理的:使用HTML5属性来限制可以发送到服务器的内容,然后使用Javascript对其进行增强以首先限制用户可以输入的内容.那么让我们来看看这些问题,并更好地实施它。问题1,糟糕的脚本最常见的缺陷是缺少适当的降级功能。如果您正在使用“electron”或“nw.js”构建全栈应用程序,那很好,但这种形式的东西通常在面向公众的网站中没有立足之地。就像我经常说的,高质量的脚本应该增强已经工作的页面,而不是用户使用它的唯一方式。解决方案?使用pattern和step属性来限制负载。问题2,正则表达式模式错误或不完整人们最常用的模式是[-/d]*,它存在允许到处使用减号的问题。虽然肯定可以使用type="number"来解决问题,但这不是一个好的选择。在拦截击键时更是如此,因为减号只能是第一个字符。这也可能是有问题的,因为一些实现“不是”正则表达式,这可能导致误报。解决方案?对于HTML,使用更好的表达式:^[-d]\d*$更稳健和准确。减号可以是匹配开始处的第一个字符,后跟零个或多个小数,直到字符串结束。对于JavaScript,只需使用正则表达式来测试数字,并应用一些更实用的逻辑来检测其他值。简单易行!问题3,在标记中使用事件属性我知道有很多人在JSX垃圾中鼓励这样做,但是如果你正在编写vanilla或其他系统,请看在圣诞之爱的份上,把你的头从直肠里拿出来1997年。在标记中放置“onkeypress”或“onchange”是错失了缓存的机会,并且违反了关注点分离原则。以这种方式将JavaScript放入标记中,就像HTML4Strict中弃用的所有内容一样,是彻头彻尾的愚蠢。就像如果你要用“text-whitebox-shadowcol-4-s”这样的属性在你的HTML上撒尿,承认失败并返回使用所有这些FONT/CENTER标签,COLOR,BGCOLOR,SIZE编写HTML3.2、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:
