最近一个需求,因为数据比较多,提测时各种输入框限制的bug反馈回来,快要气死了,把我遇到的做个总结,以后再遇到也能参考一下……
1、仅能输入正整数
在input里加入onkeyup那一行代码即可,这样无论怎么输入汉字字母还是符号什么的都输入不进去,哪怕是数字,单输入0或者0.xxxx也一样输入不进去,只有输入正整数才可以。(公司电脑上没有软件不然就录屏转GIF放出来了,可以参考)
小bug:当长按0的时候可以输入一堆0,违背了正整数,目前还没有找到非常完美的写法,请大家补充。
<el-input type="text"
size="small"
v-model="xxx"
onkeyup="this.value=this.value.replace(/\D|^0/g,'')"
placeholder="请输入每日完单基数">
</el-input>
2、金额,小数点后2位
既然是金额了,那肯定是大于0的,这就不用说了,同上面差不多,无论是怎么输入汉字字母还是符号什么的都输入不进去,只有数字才可以,不同的是这里是可以输入0.xx的,当然只能输入2位小数,再多也不会显示的。在input里加个@keyup.native="item.rewardVal = oninput(item.rewardVal,2)"加红色的部分是v-model的绑定值,记得修改。
<el-form-item>
label="奖励金额:"
label-width="90px" >
<el-input
type="text"
size="small"
v-model="item.rewardVal"
placeholder="请输入奖励金额:"
@keyup.native="item.rewardVal = oninput(item.rewardVal,2)">
</el-input>
</el-form-item>
//js,写在methods里
oninput(val,limit = 0) {
val = val.replace(/[^\d.]/g, ""); //保留数字
val = val.replace(/^00/, "0."); //开头不能有两个0
val = val.replace(/^\./g, "0."); //开头为小数点转换为0.
val = val.replace(/\.{2,}/g, "."); //两个以上的小数点转换成一个
val = val.replace(".", "$#$").replace(/\./g, "").replace("$#$", "."); //只保留一个小数点
/^0\d+/.test(val) ? val = val.slice(1) : ''; //两位以上数字开头不能为0
const str = '^(\\d+)\\.(\\d{' + limit + '}).*$'
const reg = new RegExp(str)
if (limit === 0) {
// 不需要小数点
val= val.replace(reg, '$1')
} else {
// 通过正则保留小数点后指定的位数
val= val.replace(reg, '$1.$2')
}
return val
},
3、
<input type="number" min=1 step=1>
html5 number类型的input框右侧自带上下箭头,我们通过min=1
以及step=1
限制了最小值以及每次变化的量。
但是这样仍然不满足我们的要求,因为还是可以手动输入-
、.
、自然对数e
等,不能完全做到限制正整数