JavaScript中.length无法检测字符't' 如何实现数量输入合法性校验
问题根因
- 直接对输入值调用了
parseInt,该方法会自动截断字符串开头的数字部分,忽略后续所有非数字内容,比如parseInt('3t')返回值是3,不会触发isNaN校验,你后续用来做校验的变量是已经截断非数字后的结果,自然检测不到非法字符 - 手写的字符校验逻辑本身存在错误,还有拼写问题:
isNan写法错误,该方法大小写敏感,正确写法是isNaN - 用来做校验的
s_input3是parseInt转换后再转的字符串,本身已经删掉了所有非数字字符,用这个变量做校验没有意义
修复方案
直接对原始的输入字符串做全量正则校验,确认整个字符串都是非负数字之后再做类型转换,不需要写循环逐字符判断,代码更简洁也不容易出错。
修改后的完整代码
function addProduct(){ var input = document.getElementById("productName").value; var input2 = document.getElementById("cost").value; // 先获取原始的数量输入字符串 var rawQuantity = document.getElementById("quantity").value; var table = document.getElementsByTagName('table')[0]; // 成本校验逻辑可以保留,也可以参考数量的正则校验做优化,避免类似问题 if (isNaN(input2) || input2<0) { alert("输入不是有效数字"); return(-1); } // 新增全量正则校验,确保整个输入内容都是数字,没有其他字符 const numberReg = /^\d+$/; if (!numberReg.test(rawQuantity)) { alert("数量必须为非负整数"); return(-3); } // 校验通过后再做类型转换 var input3 = parseInt(rawQuantity); if (input3 < 0) { alert("数量不能小于0"); return(-1); } // 后续原有业务逻辑保留... }
如果需要支持带小数点的数量,把正则规则替换为/^\d+(\.\d+)?$/即可。
内容的提问来源于stack exchange,提问作者Niroosh Ka
相关产品推荐
相关产品推荐

