uni-app iOS端 input或textarea组件快速输入标点符号导致光标丢失
uni-app iOS端 input或textarea组件快速输入标点符号导致光标丢失
类别 | 信息 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Mac |
PC版本号 | 13.6.9 |
HBuilderX | 正式 |
HBuilderX版本 | 4.24 |
手机系统 | iOS |
手机版本号 | iOS 17 |
手机厂商 | 苹果 |
手机型号 | iPhone13 |
页面类型 | vue |
vue版本 | vue3 |
打包方式 | 离线 |
项目创建方式 | HBuilderX |
操作步骤:
一个绑定v-model的input输入框 然后快速输入中文和中文的标点符号 建议用中文九宫格键盘输入
<input class="write" type="text" maxlength="15" v-model="enrollModel.name">
预期结果:
输入正常
实际结果:
输入途中会有光标丢失情况,导致后续输入无效
bug描述:
input或者textarea组件在iOS端输入了标点符号过快的情况下导致光标丢失,导致后续输入无效
后续测试官方demo 绑定v-model也会复现bug,在输出中文标点符号时最容易出现光标丢失的情况
后续测试用value绑定变量 @input事件里赋值也会出现该情况
在开发uni-app应用时,特别是在iOS平台上,可能会遇到input
或textarea
组件在快速输入标点符号时导致光标丢失的问题。这通常是由于输入法处理、事件触发顺序或组件渲染机制的问题。尽管这个问题可能由多种因素引起,但我们可以通过一些技术手段来尝试解决或缓解这个问题。
以下是一个示例代码,它展示了如何使用JavaScript和Vue(uni-app基于Vue)来监控输入事件,并尝试在输入标点符号时手动调整光标位置。这种方法可能不是万能的,但它提供了一个解决问题的思路。
<template>
<view class="container">
<textarea
v-model="inputText"
@input="handleInput"
placeholder="请输入内容"
auto-height
></textarea>
</view>
</template>
<script>
export default {
data() {
return {
inputText: '',
lastCursorPosition: 0,
};
},
methods: {
handleInput(event) {
const inputElement = event.target;
const cursorPosition = inputElement.selectionStart || 0;
const inputValue = inputElement.value;
// 检测是否输入了标点符号
const isPunctuation = /[.,!?;:()\"'\[\]{}]/g.test(inputValue[cursorPosition - 1] || '');
if (isPunctuation) {
// 尝试调整光标位置,这里简单处理为保持原位或移动到下一个位置
// 实际应用中可能需要更复杂的逻辑来处理不同情况
this.$nextTick(() => {
const newCursorPosition = Math.min(cursorPosition, inputElement.value.length);
inputElement.setSelectionRange(newCursorPosition, newCursorPosition);
});
}
// 更新最后的光标位置
this.lastCursorPosition = cursorPosition;
},
},
};
</script>
<style scoped>
.container {
padding: 20px;
}
textarea {
width: 100%;
height: 100px;
}
</style>
在这个示例中,我们监听textarea
的input
事件,并检查每次输入后光标前的字符是否为标点符号。如果是,我们尝试在Vue的$nextTick
中调整光标位置,以确保DOM更新完成后执行。这种方法虽然简单,但可能需要根据具体的应用场景进行调整和优化。
请注意,由于uni-app和原生iOS输入法的交互可能涉及复杂的系统级行为,这个问题可能无法完全通过前端代码解决。在某些情况下,可能需要与iOS原生开发团队合作,共同调试和解决问题。