复制所绑定元素文本的vue自定义指令

news/2025/2/23 20:35:16

最近写了一个复制所绑定元素文本的vue自定义指令,给大家分享一下。

javascript">import { ElMessage } from 'element-plus'

// data-* 属性名
const dataCopyBtnTextAttribute = 'data-copy-btn-text'
// 复制按钮的class,结合项目实际进行设置
const copyBtnClass = 'icon-copy'

// 复制文本的方法
const copyText = data => {
  const input = document.createElement('input')
  input.setAttribute('readonly', 'readonly')
  input.setAttribute('value', data)
  input.style.position = 'absolute'
  input.style.left = '-100px'
  input.style.top = '-100px'
  input.style.opacity = '0'
  document.body.appendChild(input)
  input.select()
  document.execCommand('copy')
  setTimeout(() => {
    document.body.removeChild(input)
  })
}

// 设置 data-* 属性
function setSign(el) {
  el.setAttribute(dataCopyBtnTextAttribute, el.innerText)
}

// 移除 data-* 属性
function removeSign(el) {
  el.removeAttribute(dataCopyBtnTextAttribute)
}

// 获取 data-* 属性
function getSign(el){
  return el.getAttribute(dataCopyBtnTextAttribute)
}

// 生成复制按钮
function getCopyBtn(el){
   const iDom = document.createElement('i')
   iDom.className = `iconfont ${copyBtnClass}`
   Object.assign(iDom.style,{
    color:'blue',
    cursor:'pointer',
    marginLeft:'4px'
   })
    // 添加点击事件 
   iDom.addEventListener('click',() => {
    copyText(el.innerText)
    ElMessage({
      message: '复制成功',
      type: 'success',
      duration:1000
    })
   }) 
   return iDom
}

// 添加复制按钮
function addCopyBtn(el){
  // 当节点内容发生变化时,移除复制按钮,当复制的文本有值时,重新添加复制按钮
  if(getSign(el) !== el.innerText){
    removeCopyBtn(el)
    if(!!el.innerText){
      el.appendChild(getCopyBtn(el))
      setSign(el)
    }
  }
}

// 移除复制按钮
function removeCopyBtn(el){
  removeSign(el)
  var copyBtns = el.querySelectorAll(`.${copyBtnClass}`);
  copyBtns.forEach((element) => {
    el.removeChild(element)
    element = null
  })
}

export default {
  mounted(el, binding) {
    addCopyBtn(el)
  },
  updated(el, binding) {
    addCopyBtn(el)
  },
  beforeUnmount(el, binding){
    removeCopyBtn(el)
  }
}

http://www.niftyadmin.cn/n/5863751.html

相关文章

Windows和Linux下,通过C++实现获取蓝牙版本号

在 C 中获取蓝牙版本号,不同的操作系统有不同的实现方式,下面分别介绍在 Windows 和 Linux 系统下的实现方法。 Windows 系统 在 Windows 系统中,可以使用 Windows API 来与蓝牙设备交互,获取蓝牙版本号。以下是一个示例代码&…

Vite 和 Webpack 的区别和选择

简介 Nuxt3 默认使用 Vite 作为构建工具,但也可以配置为使用 Webpack。‌ 关于两者的区别和详细结构化解析可以参考文章:vite和webpack底层逻辑差异 两者实例化案例可以参考文章 : Webpack和Vite插件的开发与使用_vite使用webpack-CSDN博客 简…

《Head First设计模式》读书笔记 —— 单件模式

文章目录 为什么需要单件模式单件模式典型实现剖析定义单件模式本节用例多线程带来的问题解决问题优化 Q&A总结 《Head First设计模式》读书笔记 相关代码: Vks-Feng/HeadFirstDesignPatternNotes: Head First设计模式读书笔记及相关代码 用来创建独一无二的&a…

【MATLAB例程】RSSI/PLE定位与卡尔曼滤波NLOS抑制算法,附完整代码

本 MATLAB 代码实现了基于接收信号强度指示(RSSI)和路径损耗模型(PLE)的定位算法,并结合卡尔曼滤波技术进行非视距(NLOS)干扰抑制。通过模拟真实运动轨迹,代码展示了如何在存在NLOS干扰的情况下进行有效的定位。订阅专栏后,可阅读完整代码,可直接运行 文章目录 运行结…

Python strip() 方法详解:用途、应用场景及示例解析(中英双语)

Python strip() 方法详解:用途、应用场景及示例解析 在 Python 处理字符串时,经常会遇到字符串前后存在多余的空格或特殊字符的问题。strip() 方法就是 Python 提供的一个强大工具,专门用于去除字符串两端的指定字符。本文将详细介绍 strip(…

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_array_init 函数

ngx_array_init 定义在 src/core/ngx_array.h static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size) {/** set "array->nelts" before "array->elts", otherwise MSVC thinks* that "…

游戏引擎学习第117天

仓库:https://gitee.com/mrxiao_com/2d_game_3 加载代码并考虑优化 今天的内容主要集中在游戏开发中的性能优化部分,特别是SIMD(单指令多数据)优化。在前一周,已经完成了一些基本的优化,使得代码运行速度提高了大约三…

【C语言】(一)数据在计算机中的存储与表示

目录 一、存储单位(比特/字节) 二、数制/进制(二/八/十/十六) 三、码制(原码/反码/补码/移码) 四、二进制表示小数 (一)定点数 (二)浮点数 十进制转化…