el-input textarea 禁止输入中文字符,@input特殊字符实时替换,光标位置保持不变

使用<el-input type="textarea">组件来自Vue的Element UI库时,如果想在输入时实时监听输入并替换某些内容,同时又希望保持光标位置不变(即在内容被替换后光标不自动跳到内容的最后位置),可以通过以下方式来实现:

方法1:使用input事件和setSelectionRange方法

在Vue中,监听input事件,然后使用JavaScript的setSelectionRange方法来设置光标位置。

复制代码
<template>
  <el-input
    type="textarea"
    ref="myTextarea"
    v-model="inputText"
    @blur="handleblur"
    @input="handleInput"
  ></el-input>
</template>
 
<script>
export default {
  data() {
    return {
      inputText: ''
    };
  },
  methods: {
    handleInput() {
      // 获取光标位置
      let cursorPosition = this.$refs.myTextarea.$refs.textarea.selectionStart;
      // 对输入内容进行替换处理,这里以简单的中文逗号替换英文逗号为例
      this.inputText = this.inputText.replace(/,/g, ',');
      // 恢复光标位置
      this.$nextTick(()=>{
        this.$refs.myTextarea.$refs.textarea.setSelectionRange(cursorPosition, cursorPosition)
      })
    },
    handleblur() {
      // 失去焦点,处理多个逗号和连续超过两个逗号替换成只要一个逗号
      if(this.inputText) {
        this.inputText = this.inputText.trim().replace(/\s*(,)\s*/g, ',').replace(/,{2,}/g, ',')
      }
    },
  }
};
</script>
方法2:使用计算属性控制显示值和内部值分离

如果不在input事件中直接操作DOM,可以通过计算属性来控制显示的文本和实际的文本存储在不同的变量中。

复制代码
<template>
  <el-input
    type="textarea"
    ref="myTextarea"
    v-model="inputText"
    @blur="handleblur"
    @input="handleInput"
  ></el-input>
</template>
 
<script>
export default {
  data() {
    return {
      inputText: '', // 显示给用户的文本,可能经过处理或未处理
      internalText: '', // 实际存储的文本
    };
  },
  watch: {
    internalText(newVal) {
      this.inputText= newVal; // 确保视图更新时,显示的文本也是最新的内部文本
    }
  },
  methods: {
    handleInput() {
      // 处理文本
      let newValue = this.$refs.myTextarea.$refs.textarea.value.replace(/,/g, ',');
      // 获取光标位置
      let cursorPosition = this.$refs.myTextarea.$refs.textarea.selectionStart;
      // 更新显示值(但不触发渲染)
      this.$refs.myTextarea.$refs.textarea.value = newValue;
      // 恢复光标位置
      this.$nextTick(()=>{
        this.$refs.myTextarea.$refs.textarea.setSelectionRange(cursorPosition, cursorPosition)
      })
      // 更新内部存储的文本值,不会触发视图更新,除非通过watch监听器
      this.internalText = newValue;
    },
    handleblur() {
      // 失去焦点,处理多个逗号和连续超过两个逗号替换成只要一个逗号
      if(this.inputText) {
        this.inputText = this.inputText.trim().replace(/\s*(,)\s*/g, ',').replace(/,{2,}/g, ',')
      }
    },
  }
};
</script>
相关推荐
thatway19891 小时前
闲聊-关于AI终结者的警醒
前端
努力的小郑2 小时前
突发!Claude Code 51万行源码全网裸奔:一场史诗级“开源”事故,国内大厂笑麻了
前端·后端·ai编程
七度黑光2 小时前
用 openclaw 给故障复盘打分:质量审核自动化实践
运维·服务器·前端·数据库·自动化
HashTang2 小时前
Claude Code 源码中 REPL.tsx 深度解析:一个 5005 行 React 组件的架构启示
前端·后端·ai编程
wendycwb3 小时前
前端城市地址根据最后一级倒推,获取各层级id的方法
前端·vue.js·typescript
终端鹿3 小时前
Vue3 模板引用 (ref):操作 DOM 与子组件实例 从入门到精通
前端·javascript·vue.js
千寻girling3 小时前
不知道 Java 全栈 + AI 编程有没有搞头 ?
前端·人工智能·后端
小码哥_常4 小时前
Android开发:精准捕获应用的前后台行踪
前端
蜡台4 小时前
Vue 打包优化
前端·javascript·vue.js·vite·vue-cli
木斯佳4 小时前
前端八股文面经大全:快手前端一面 (2026-03-29)·面经深度解析
前端·宏任务·原型链·闭包