uni-app 【报Bug】input type为number时 输入-- 会导致长度限制失效 @input监听失效
uni-app 【报Bug】input type为number时 输入-- 会导致长度限制失效 @input监听失效
示例代码:
<input type="number" [@input](/user/input)="input" maxlength="10"/>
input(e){
console.log(e.detail.value);
}
操作步骤:
- 输入数字
预期结果:
- 无法输入 且能限制长度 @input监听正常
实际结果:
- 能输入,长度限制失效,@input监听无内容
bug描述:
<input type="number" [@input](/user/input)="input" maxlength="10"/>
- 输入框能输入±.
- 且在输入俩–的时候,maxlength失效,@input监听的e.detail.value为 “”
具体的可以看下图
信息类别 | 详细信息 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Windows |
PC系统版本 | win10 版本 10.0.19041.867 |
HBuilderX类型 | 正式 |
HBuilderX版本 | 3.1.4 |
手机系统 | Android |
手机系统版本 | Android 10 |
手机厂商 | 魅族 |
手机机型 | 17 |
页面类型 | vue |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
更多关于uni-app 【报Bug】input type为number时 输入-- 会导致长度限制失效 @input监听失效的实战教程也可以访问 https://www.itying.com/category-93-b0.html
防止图裂 备个份
更多关于uni-app 【报Bug】input type为number时 输入-- 会导致长度限制失效 @input监听失效的实战教程也可以访问 https://www.itying.com/category-93-b0.html
页面改为 .nvue时不会产生此问题
查看了下 input的源码 可能是这儿导致的
不是这里导致的,是浏览器(webview)的 input 表现这样,这里虽然努力了但是没有纠正过来,注释部分那是一个两难全的问题:强制验证将导致用户无法输入负号,不增加强制验证将导致用户输入错误的符号后无法纠正
回复 DCloud_UNI_GSQ: 那这个后续处理吗
回复 秋凡: 强制不能输入符号,这种处理方式,你认为如何?
回复 DCloud_UNI_GSQ: 这个应该是你们后面新加上去的吧 为了验证这个 我把以前的项目APP安装了一下 同样的写法 那个时候就不能输入-
回复 秋凡: 这个新去掉的,之前不能输入符号,用户要求能输入,然后去掉了这部分并注释说明这里两难全
回复 秋凡: 之前有三种方案候选:1.仍然保留验证不满足用户输入负号的需求 2.去除强制验证导致可以胡乱输入3.增加一个属性用户手动配置,但用户难以理解
回复 DCloud_UNI_GSQ: 或者 可以type单独加一个 手机号的 强制输入数字
回复 秋凡: 那你是倾向于方案 3 了
回复 DCloud_UNI_GSQ: 3的话,适用性更广一些。最简单的直接1。输入负数的需求真的很少
回复 秋凡: 1就回去了。。。有依赖的用户完全无法输入,得蹦起来。。。
回复 DCloud_UNI_GSQ: 2 的话,用户只是发现了漏洞能胡乱输入,输入的只有自己能看到,也传不到后台
做个正则处理不可以吗???
‘–$&^%&464–55—5-5’.replace(/-{2,}/ig,’-’).replace(/([^\d|-])/ig,’’)
不可以,浏览器(webview)的 input 表现这样:当验证不通过时只能知道验证不通过,不能获取到 input 值,所以不能区分-和——%……&*(
这是一个已知的uni-app框架在处理input type="number"时的兼容性问题。当输入非数字字符(如–、±等)时,maxlength属性失效且@input事件返回空值。
问题分析:
- type="number"的input在移动端会调起数字键盘,但HTML5规范对非数字字符的处理存在差异
- 连续输入"–"时,浏览器可能将其解析为无效数值,导致maxlength校验被绕过
- @input事件在输入无效字符时可能无法正确获取value值
临时解决方案:
input(e){
let value = e.detail.value;
// 手动过滤非数字字符
value = value.replace(/[^\d]/g, '');
// 手动限制长度
if(value.length > 10) {
value = value.slice(0, 10);
}
console.log(value);
}