点击粘贴

点击实现复制粘贴剪切

// 点击复制粘贴剪切,要求点击按钮区域阻止默认行为 onmousedown="event.preventDefault()"
class ClickPaste {
  private _selectedText = ''
  private _mockStart = 0
  private _mockEnd = 0

  // 将选中的字符串缓存起来,并且记住光标选中的起始终止位置
  cacheGetSelection() {
    const text = window.getSelection()?.toString()
    if (text) {
      this._selectedText = text
    }
    const offset = window.getSelection()?.focusOffset
    const target = window.getSelection()?.focusNode?.childNodes[
      offset || 0
    ] as HTMLInputElement
    if (
      window.getSelection() &&
      target &&
      (target.toString() === '[object HTMLInputElement]' ||
        target.toString() === '[object HTMLTextAreaElement]')
    ) {
      if (target === document.activeElement) {
        this._mockStart = target.selectionStart as number
        this._mockEnd = target.selectionEnd as number
      }
    }
  }


  // 将内容放进剪切板
  async copyToClipboard(str: string) {
    if (this._selectedText) {
      try {
        if (navigator.clipboard) {
          await navigator.clipboard.writeText(str)
        }
      } catch (error) {
        // eslint-disable-next-line no-console
        console.warn('Please check navigator.clipboard permission.', error)
      }
    }
  }

  // 从剪切板读取内容
  async readFromClipboard() {
    let str = ''
    try {
      if (navigator.clipboard) {
        str = await navigator.clipboard.readText()
      }
    } catch (error) {
      // eslint-disable-next-line no-console
      console.warn('Please check navigator.clipboard permission.', error)
    }
    return str
  }

  // 剪切 , 判断 selectedText 是否有内容,把内容写进剪切板
  async defaultCut() {
    if (this._selectedText) {
      // 获取当前焦点输入框,把输入框内的文字截取掉,并且把截取的内容写进剪切板
      const activeInput = document.activeElement
      if (
        activeInput?.tagName && ['INPUT', 'TEXTAREA'].includes(activeInput?.tagName)
      ) {
        let value = (activeInput as HTMLInputElement).value as string
        if (value && this._mockStart !== null && this._mockEnd !== null) {
            value = value.slice(0, this._mockStart) + value.slice(this._mockEnd)
            ;(activeInput as HTMLInputElement).value = value
        }
      }
      await this.copyToClipboard(this._selectedText)
    }
  }

  // 粘贴,从剪切板读取数据,写入当前激活的输入框
  async defaultPaste() {
    const clipboardStr = await this.readFromClipboard()
    const activeInput = document.activeElement
    let value = (activeInput as HTMLInputElement).value as string
    if (
        activeInput?.tagName && ['INPUT', 'TEXTAREA'].includes(activeInput.tagName)
    ) {
        value =
        value.slice(0, this._mockStart) +
        clipboardStr +
        value.slice(this._mockEnd)
        ;(activeInput as HTMLInputElement).value = value
    }
  }
}

execCommand 版点击复制

// 将内容放进剪切板
function copyToClip(str: string) {
  const ele = document.createElement('input')
  ele.style.height = '0'
  ele.setAttribute('value', str)
  document.body.appendChild(ele)
  ele.select()
  document.execCommand('copy')
  document.body.removeChild(ele)
}