uni-app iOS端 input或textarea组件快速输入标点符号导致光标丢失

发布于 1周前 作者 htzhanglong 来自 Uni-App

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端输入了标点符号过快的情况下导致光标丢失,导致后续输入无效

bug复现操作.zip


3 回复

后续测试官方demo 绑定v-model也会复现bug,在输出中文标点符号时最容易出现光标丢失的情况


后续测试用value绑定变量 @input事件里赋值也会出现该情况

在开发uni-app应用时,特别是在iOS平台上,可能会遇到inputtextarea组件在快速输入标点符号时导致光标丢失的问题。这通常是由于输入法处理、事件触发顺序或组件渲染机制的问题。尽管这个问题可能由多种因素引起,但我们可以通过一些技术手段来尝试解决或缓解这个问题。

以下是一个示例代码,它展示了如何使用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>

在这个示例中,我们监听textareainput事件,并检查每次输入后光标前的字符是否为标点符号。如果是,我们尝试在Vue的$nextTick中调整光标位置,以确保DOM更新完成后执行。这种方法虽然简单,但可能需要根据具体的应用场景进行调整和优化。

请注意,由于uni-app和原生iOS输入法的交互可能涉及复杂的系统级行为,这个问题可能无法完全通过前端代码解决。在某些情况下,可能需要与iOS原生开发团队合作,共同调试和解决问题。

回到顶部