当前位置:   article > 正文

VUE 输入框实现光标插入,设置光标位置并删除光标内容_contenteditable手动光标删除内容

contenteditable手动光标删除内容

最近做项目遇到这样一个需求,可以往输入框指定光标出插入内容,并且当删除插入的内容时会先将插入的内容进行光标选中给用户进行提示,当再次删除时才删除内容。而这个需求的核心就在 setSelectionRange(设置光标位置) 这个dom api上,找到他就都简单了。

一、实现光标插入

        实现光标插入首先需要我们在输入框失去焦点时记录下光标的位置,然后就很简单了,做一个字符串的分割和拼接就搞定。

  1. <div>
  2. <span>模板变量:</span>
  3. <ul class="vira">
  4. <li v-for="(item, ind) in labelSuffix.propList" :key="item.valuie"
  5. @click="insertVal(item.code)">
  6. {{ item.code }}
  7. </li>
  8. </ul>
  9. </div>
  10. <el-input @blur="campaignNameBlur" type="textarea" maxlength="400" show-word-limit
  11. @keydown.delete.native="del" :autosize="{ minRows: 4, maxRows: 10 }"
  12. v-model="template.content">
  13. </el-input>
  14. <script>
  15. data(){
  16. retrun{
  17. template:{
  18. content:""//输入框内容
  19. },
  20. labelSuffix:{
  21. propList: [
  22. {valuie: "{GoodsLink}", code: "#商品详情#"},
  23. {valuie: "{OrderLink}", code: "#订单详情#"}
  24. ],
  25. },
  26. cursorPosition:""//保存光标位置
  27. }
  28. }
  29. methods:{
  30. // 失去焦点时保存光标位置
  31. campaignNameBlur(e) {
  32. this.cursorPosition = e.srcElement.selectionStart
  33. },
  34. // 插入内容
  35. insertVal(val) {
  36. let num = this.cursorPosition
  37. let type = typeof num
  38. let cont = this.template.content
  39. if (type == "number") {//插入到指定光标处
  40. let right = cont.slice(0, num)
  41. let left = cont.slice(num)
  42. this.template.content = right + val + left
  43. } else {//没有指定插入直接添加到最后
  44. this.template.content += val;
  45. }
  46. },
  47. }
  48. <script/>

二、设置光标位置,提示用户删除操作

  1. del(e) {
  2. let content = this.template.content
  3. if(!content)return//没有内容就不用进行后面操作
  4. let start = e.target.selectionStart//光标起始位置
  5. let end = e.target.selectionEnd//光标结束位置
  6. if(start == end){//删除操作判断,
  7. let left = content.slice(end-6,end)
  8. let right = content.slice(end-1,end+5)//因为我们的变量长度都为6,所以截取左右长
  9. 度为6的字符串
  10. let arr = this.labelSuffix.propList.map(item=>item.code)
  11. if(arr.includes(left)){//判断变量中是否存在,存在则设置光标位置,不存在则不用管
  12. e.target.setSelectionRange(end-6,end)//设置光标位置
  13. e.preventDefault()//阻止浏览器的默认行为,防止删除
  14. }else if(arr.includes(right)){
  15. e.target.setSelectionRange(end-1,end+5)
  16. e.preventDefault()
  17. }
  18. }
  19. },

最后就此完成,如下为附上效果视频

光标操作

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/114670
推荐阅读
相关标签
  

闽ICP备14008679号