有一个如下的正则表达式,我想用于保证输入框内输入的数字只能输入到小数点后三位。
但是用了这个正则表达式一输入小数点,输入的光标就回到最前面去了也没输入小数点
输入框是type为number的input框,正则表达式相关代码如下
const inputCheck = e => {
e.target.value = e.target.value.replace(/(\.\d{0,3})\d*/,'$1')
}
document.querySelectorAll('input').forEach(item => {
item.addEventListener('input', e => {inputCheck(e)})
})
希望能实现保证小数点后只能最多输入三位的效果。。
/这里往下时追加问题
后面了解到很可能是type为number的input框做了什么操作影响结果,于是直接采用原生input并加上正则进行规范。代码如下:
const inputCheck = e => {
e.target.value = e.target.value.replace(/[^\d.-]/, '')
e.target.value = e.target.value.replace(/\.+/, '.')
e.target.value = e.target.value.replace(
/(\d)(\.\d{0,3})\d*/,
'$1$2'
)
e.stopPropagation()
}
//todo:セレクトのinputに影響を及ぼすかも?
document.querySelectorAll('input').forEach(item => {
item.addEventListener('input', e => {
e.target.value = e.target.value.replace(/^0/, '')
inputCheck(e)
})
})
document.querySelectorAll('input').forEach(item => {
item.addEventListener('blur', e => {
inputCheck(e)
})
})
document.querySelectorAll('input').forEach(item => {
item.addEventListener('focus', e => {
inputCheck(e)
})
})
以上的代码是已经好使的代码。
此处的问题是:如果不加上对于blur和focus进行监听并清除,会出现比较诡异的一失去焦点就出现之前的最后一个数字的情况,也就是如果只写上
const inputCheck = e => {
e.target.value = e.target.value.replace(/[^\d.-]/, '')
e.target.value = e.target.value.replace(/\.+/, '.')
e.target.value = e.target.value.replace(
/(\d)(\.\d{0,3})\d*/,
'$1$2'
)
e.stopPropagation()
}
//todo:セレクトのinputに影響を及ぼすかも?
document.querySelectorAll('input').forEach(item => {
item.addEventListener('input', e => {
e.target.value = e.target.value.replace(/^0/, '')
inputCheck(e)
})
})
只写这一段的话,代码会有bug。必须加上blur和foces才能完全好使(这是我试出来的),但我不知道原理,哪位哥可以讲一下原理吗?为什么blur和foces触发的时候会影响input的值
Demo
你这个正则其实没问题,有问题的是e.target.value这里赋值
所以改成下面这样就行了