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>
相关推荐
Nan_Shu_6142 小时前
Web前端面试题(1)
前端·面试·职场和发展
EveryPossible2 小时前
选择数据展示
javascript
lypzcgf2 小时前
Coze源码分析-资源库-创建知识库-前端源码-核心组件
前端·typescript·react·coze·coze源码分析·ai应用平台·agent开发平台
百思可瑞教育3 小时前
在Vue项目中Axios发起请求时的小知识
前端·javascript·vue.js·北京百思教育
患得患失9493 小时前
【个人项目】【前端实用工具】OpenAPI to TypeScript 转换器
前端·javascript·typescript
大前端helloworld3 小时前
前端梳理体系从常问问题去完善-基础篇(html,css,js,ts)
前端·javascript·面试
trsoliu3 小时前
前端基于 TypeScript 使用 Mastra 来开发一个 AI 应用 / AI 代理(Agent)
前端·人工智能
鸡吃丸子3 小时前
前端权限控制:深入理解与实现RBAC模型
前端
Larry_zhang双栖3 小时前
低版本Chrome 内核兼容性问题的优美解决
前端·chrome