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>
相关推荐
ZC跨境爬虫2 分钟前
UI前端美化技能提升日志day6:(使用苹果字体+计算样式对比差异)
前端·javascript·css·ui·状态模式
胡志辉的博客5 分钟前
前端反调试:常见套路、识别方法与绕过思路
前端·javascript·web安全·状态模式·安全威胁分析·代码混淆
牛奶19 分钟前
老板问我接口设计,我甩给他一个文档
前端·restful·graphql
gskyi23 分钟前
UniApp Vue3 数据透传终极指南
javascript·vue.js·uni-app
gskyi24 分钟前
uni-app 高阶实战:onLoad与getCurrentPages深度技巧
前端·javascript·vue.js·uni-app
月明水寒32 分钟前
IDEA2026.1 vue文件报错
前端·javascript·vue.js·intellij-idea·idea·intellij idea
IpdataCloud33 分钟前
不同业务如何选IP查询更新频率?离线与在线协同策略
前端·网络协议·tcp/ip·html
牛奶34 分钟前
不经过服务器,两个人怎么直接通话?
前端·websocket·webrtc
神探小白牙38 分钟前
3D饼图,带背景图和自定义图例(threejs)
开发语言·前端·javascript·3d·vue
IT_陈寒40 分钟前
SpringBoot自动配置的坑差点没把我埋了
前端·人工智能·后端