uni-app textarea的maxlength=5000时与e.detail.value.length得到的长度不一致
uni-app textarea的maxlength=5000时与e.detail.value.length得到的长度不一致
操作步骤:
- textarea 的 maxlength = 5000 时与 e.detail.value.length 得到的长度不一致,ios时输入4976个字符就输不上去了,ios13以上都有这个问题
预期结果:
- textarea 的 maxlength = 5000 时与 e.detail.value.length 得到的长度一致
实际结果:
- 不一致
bug描述:
- textarea 的 maxlength = 5000 时与 e.detail.value.length 得到的长度不一致,ios时输入4976个字符就输不上去了,ios13以上都有这个问题
更多关于uni-app textarea的maxlength=5000时与e.detail.value.length得到的长度不一致的实战教程也可以访问 https://www.itying.com/category-93-b0.html
请提供可稳定复现直接运行的完整示例(上传附件),方便我们快速排查问题哦。
【正确报bug的姿势】https://ask.dcloud.net.cn/article/38139
更多关于uni-app textarea的maxlength=5000时与e.detail.value.length得到的长度不一致的实战教程也可以访问 https://www.itying.com/category-93-b0.html
<textarea @input=“confirm” v-model=“newCompileInfo.value” maxlength=“5000” /> methods: { confirm(e) { // textarea 的maxlength属性值为5000时在ios手机上与e.detail.value.length获取的值不相等 // e.detail.value.length的值为4970的时候在ios上输不进去了 this.textLength = e.detail.value.length }, }
<textarea @input=“confirm” v-model=“newCompileInfo.value” maxlength=“5000” />
methods: {
confirm(e) {
// textarea 的maxlength属性值为5000时在ios手机上与e.detail.value.length获取的值不相等
// e.detail.value.length的值为4970的时候在ios上输不进去了
this.textLength = e.detail.value.length
},
}
这是一个已知的iOS系统级问题,与uni-app框架本身无关。iOS系统在处理多字节字符(如emoji表情、中文等)时,其内部字符计数机制与JavaScript的字符串长度计算方式存在差异。
问题原因:
iOS系统对maxlength
的限制基于UTF-16编码单元进行计数,而JavaScript的length
属性同样基于UTF-16编码单元。但当输入包含代理对字符(如emoji、部分生僻字)时,一个字符可能占用2个UTF-16编码单元,导致:
- iOS系统计数:每个代理对字符计为2
- JS的
length
属性:同样计为2 但用户感知的"字符个数"实际为1
解决方案:
- 使用@input事件实时校验
onInput(e) {
const value = e.detail.value;
if (value.length >= 5000) {
// 达到限制时的处理逻辑
}
}
- 推荐使用value绑定配合计算属性
<textarea :value="textValue" [@input](/user/input)="onInput"></textarea>
data() {
return {
textValue: ''
}
},
methods: {
onInput(e) {
if (e.detail.value.length <= 5000) {
this.textValue = e.detail.value;
}
}
}
- 考虑使用字节数限制替代字符数限制 对于需要精确控制输入长度的场景,建议改用字节数校验:
function getByteLength(str) {
return new Blob([str]).size;
}