前端BUG录- input 数字检验异常问题

简介: 前两天才分享了 input 的属性、特征。昨天就有个小伙伴踩雷了。所以素材又有了小伙伴做的是实名认证(移动端)相关的功能,然后有个位置校验了只能输入数字。小伙伴发出了灵魂质疑:为什么 1. 没事 1.. 就被清空了? 这个问题告诉我们喝一点没事,“一點點”不行。

复现代码



功能是基于 Vue 来实现的。


<input id="define" type="number"  placeholder="最多9999"<keyup="inputKeyUp">


下面是 methods 里面的方法


inputKeyUp: function inputKeyUp(a) {
    var val = document.getElementById('define').value;
    var limitNum = 9999,
        limitLen = 4;
    val = val.replace(/\.+|\s+/g, '');
    if (val.length > limitLen) {
        val = val.substr(0, limitLen);
    }
    if (Number(val) > limitNum) {
        val = limitNum;
    }
    if (val == '0') {
        val = 1;
    }
    if (0 < Number(val) && Number(val) <= limitNum) {
        this.changeBG = 1;
    } else {
        this.changeBG = 0;
    }
    document.getElementById('define').value = val;
}


复现地址:

https://www.lilnong.top/static/html/input-number-validity.html


问题截图


bVcH3IM.webp.jpg


分析问题提取关键信息


  1. 移动端、只能输入数字。


  1. input 实现输入,有 type="number"


  1. 监听 inputKeyUp,内部获取 .value,经过正则过滤 /\.+|\s+/,长度截取 .substr(0, limitLen)


  1. 通过 .value 再赋值回去

那我们一个一个排查


type 改为默认的 text


我们会发现 . 的问题得到了解决。


那么为什么 number 不行?而 text 可以?


bVcH3TD.webp.jpg


可以看到我们都测试了 1..,但是 number 的时候我们获取到的并没有 .。运用我们前两天学到的知识,把 validationMessage 打出来看看。


https://segmentfault.com/a/1190000037538101

bVcH4dT.webp.jpg


回想一下H5校验的特征是什么? 只获取正确的参数。

因为这个特征导致我们没有获取到内容,然后在后面赋值的时候被清空了。


正则处理&长度截断


长度截断没什么好说的。

那我们来看一下正则/\.+|\s+/获取到的是点 \.和空白符 \s


bVcH4fJ.webp.jpg


感觉 /[^0-9]/ 更好


bVcH4fN.webp.jpg


但是里面不会处理数字,所以和清空没有关系


赋值操作


经过测试可以发现,异常的数值是无法赋值的。


bVcH4gp.webp.jpg


问题成因?


因为使用了 type="number" 然后导致异常值直接无法获取,又因为底部有一个赋值,所以导致被清空。


  1. 不使用 type="number"
    如果是pc端,那么没啥毛病,如果是移动端。那么 type="number" 其实可以调起一个专用的数字键盘


  1. 动态改 type="number"
    这个方案也不行,因为会导致键盘被替换。


  1. 自己实现一个键盘
相关文章
|
6月前
|
前端开发
前端通过input标签封装Upload组件实现文件上传
前端通过input标签封装Upload组件实现文件上传
229 0
|
12天前
|
前端开发 JavaScript 开发者
前端开发的终极技巧:如何让你的代码既简洁又高效,还能减少bug?
【10月更文挑战第30天】前端开发充满挑战与创新,如何编写简洁高效且少bug的代码是开发者关注的重点。本文介绍五大技巧:1. 模块化,提高代码复用性;2. 组件化,降低代码耦合度;3. 使用现代框架,提高开发效率;4. 统一代码规范,降低沟通成本;5. 利用工具,优化代码质量。掌握这些技巧,让前端开发更高效。
27 1
|
6月前
|
前端开发
前端input上传文件获取视频或音频的时长
前端input上传文件获取视频或音频的时长
221 0
|
5月前
|
前端开发 安全 JavaScript
如何区分是前端BUG还是后端BUG
1 基于经验 前端BUG特点: (1)界面排版、布局错误、兼容性问题 (2)网络不稳定导致JS或CSS未完全加载或请求超时(一般不需要提BUG),正常网络下加载超时 后端BUG特点: 业务逻辑、性能问题、数据问题、安全性问题 2 通过HTTP请求和响应信息 可以通过浏览器开发者工具(F12)、postman、fiddler(移动端可通过该工具抓包)、Charles、Proxyman、Wireshark、HttpCanary、tcpdump等工具。
85 1
|
4月前
|
前端开发 JavaScript 流计算
前端 JS 经典:打印对象的 bug
前端 JS 经典:打印对象的 bug
42 0
|
6月前
|
前端开发 JavaScript 索引
【Web 前端】JS的几种具体异常类型(报错)
【4月更文挑战第22天】【Web 前端】JS的几种具体异常类型(报错)
|
前端开发
【前端异常】Module build failed: Error: ENOENT: no such file or directory, scandir ‘G:\OPWeb\public\node_m
【前端异常】Module build failed: Error: ENOENT: no such file or directory, scandir ‘G:\OPWeb\public\node_m
194 0
|
6月前
|
前端开发 安全 JavaScript
怎么判断bug是前端问题还是后端问题?
怎么判断bug是前端问题还是后端问题?
131 0
|
6月前
|
前端开发
elementui-upload组件自定义样式上传(upload中常用的属性,但是网络上却找不到教程)(解决bug删除之后再次上传会上传删除的图片)专注后端工程师的前端速成
elementui-upload组件自定义样式上传(upload中常用的属性,但是网络上却找不到教程)(解决bug删除之后再次上传会上传删除的图片)专注后端工程师的前端速成
696 0
|
6月前
|
JSON 缓存 前端开发
编写代码前,如何规避尽可能多的前端bug?
编写代码前,如何规避尽可能多的前端bug?
70 0