可编辑div:处理光标插入加手写

该博客讨论了如何在可编辑的div中插入和处理HTML标签,特别是使用JavaScript实现光标定位、添加链接以及处理已选中内容的方法。内容涉及`contenteditable`属性、DOM操作和文本处理技巧。
摘要由CSDN通过智能技术生成

在这里插入图片描述

html:

// contenteditable: 可编辑属性,true or false
// ref: 定位dom
<div contenteditable="true" class="card-content" ref="cardAreaRef" placeholder="请输入或在右侧选择"></div>

js:
选中右侧或底部

// link:想添加的标签,啥都行
// (this.$refs.cardAreaRef as any).focus(): 定位光标位置
checkColumn (item: any) {
    // this.contentForm.dynamicTags.push(item)
    const ele = (this.$refs.cardAreaRef as any)
    const link = `<el-link  :underline="false" type="primary" contenteditable="false" class="link_edit" data-id="${item.id}">
              #${item.name}</el-link>`;
    (this.$refs.cardAreaRef as any).focus()
    // document.getElementById('sdsds').focus()
    this.insertLinkArea(link) // 光标插入
    this.formatterSmsContent(ele) // 遍历处理div的数据
  }

添加到焦点位置

/**
   * name: 添加到焦点位置
   * params: html(要插入的标签,此处是el-link)
   * method: click
   */
  insertLinkArea (html: any) {
    let sel: any
    let range: any
    if (window.getSelection) {
      sel = window.getSelection()
      if (sel.getRangeAt && sel.rangeCount) {
        range = sel.getRangeAt(0)
        range.deleteContents()
        const el = document.createElement('div')
        el.innerHTML = html
        const frag = document.createDocumentFragment()
        let node; let lastNode
        while ((node = el.firstChild)) {
          lastNode = frag.appendChild(node)
        }
        range.insertNode(frag)
        if (lastNode) {
          range = range.cloneRange()
          // range.setStartAfter(lastNode)
          range.collapse(true)
          sel.removeAllRanges()
          sel.addRange(range)
        }
      }
    }
  }

选中右侧字段之后做的处理


/**
   * name: 选中右侧字段之后做的处理
   * params: value(可编辑div的dom)
   * params:value.childNodes (遍历dom的子节点,包括插入的和手写的)
   */
  formatterSmsContent (value: any) {
    const list: any[] = []
    let result: any = ''
    value.childNodes.forEach((k: any) => {
      switch (k.nodeName) {
        case '#text': {
         // 处理刚开始输入内容时k.data显示29个空白的问题
         const reg = /^[\s]{29}$/g
         if (!reg.test(k.data)) {
          str += k.textContent
           strLength += Number(k.textContent.length
          break
        }
        case 'EL-LINK': {
          str += k.attributes['data-title'].value
          strLength += Number(k.attributes['data-count'].value)
          break
        }
        default: {
        str += k.textContent
        strLength += Number(k.textContent.length)
        // 为了解决粘贴复制带标签到输入框
        value.innerHTML = value.innerText
        }
      }
    })
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值