JavaScript 粘贴事件、拷贝事件、获取拷贝的内容、将文本复制到剪贴板

本文展示了如何使用JavaScript监听和处理粘贴与拷贝事件,通过event.clipboardData获取或设置剪贴板内容。示例代码中,实现了在粘贴时打印文本,拷贝时设置自定义内容,并提供了异步函数来读取和写入剪贴板数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 JavaScript 粘贴事件、拷贝事件、获取拷贝的内容、将文本复制到剪贴板

// 监听粘贴事件
window.addEventListener('paste', pasteHandler)
function pasteHandler(event) {
  event = event || window.event
  const clipdata = event.clipboardData || window.clipboardData
  const value = clipdata.getData('text/plain')
  console.log(value)
}

// 监听拷贝事件,并将内容改为自定义的值
window.addEventListener('copy', copyHandler)
function copyHandler(event) {
  event = event || window.event
  event.clipboardData?.setData('text/plain', 'hello world')
  event.preventDefault()
}

// -----------------------
// 获取拷贝的内容
async function getClipboardContents() {
  try {
    const text = await navigator.clipboard.readText()
    console.log('Pasted content: ', text)
  } catch (err) {
    console.error('Failed to read clipboard contents: ', err)
  }
}

// 将文本复制到剪贴板
async function copyPageUrl() {
  try {
    await navigator.clipboard.writeText('hello world222')
  } catch (err) {
    console.error('Failed to copy: ', err)
  }
}

setTimeout(() => {
  copyPageUrl()
  getClipboardContents()
}, 2000)

### 实现带格式内容复制到剪贴板 为了实现在 Vue.js 中将带有格式的内容复制到剪贴板,可以采用 `clipboard.js` 或者更高级别的封装库如 `vue-clipboard2` 来简化操作。对于复杂场景下的富文本处理,则可能涉及到 HTML 片段的转换。 #### 使用 clipboard.js 复制纯文本或简单结构化数据 当只需要复制简单的文本字符串时,可以直接利用 `clipboard.js` 插件来完成这一功能[^2]: ```html <div> <el-input placeholder="请输入内容" v-model="input2" id="foo" style="width: 30%; padding: 30px"> <el-button slot="append" class="btn" data-clipboard-target="#foo" @click="copy">复制</el-button> </el-input> </div> <script> import ClipboardJS from 'clipboard'; export default { mounted() { new ClipboardJS('.btn'); }, }; </script> ``` 此方法适用于基本的文字输入框中的内容复制需求。 #### 利用 vue-clipboard2 进行集成开发 如果希望进一步提升用户体验以及更好地融入 Vue 生态圈内,推荐使用专门为 Vue 设计的粘贴板工具——`vue-clipboard2`。该插件允许更加灵活地配置全局选项,并支持按需加载特性[^1]: ```javascript // main.js or main.ts import Vue from 'vue'; import VueClipboard from 'vue-clipboard2'; Vue.use(VueClipboard); ``` 接着,在组件内部可以通过事件触发器轻松调用其 API 方法来进行复制动作: ```html <template> <button @click="onCopy">{{ copyText }}</button> </template> <script> export default { name: "ExampleComponent", methods: { onCopy(e) { this.$copyText('要复制的内容').then(function (e) { console.log(`成功复制 ${e.text}`); }, function (e) { console.error('无法复制', e); }); } }, computed: { copyText() { return '点击这里复制'; } } } </script> ``` 上述方式适合于大多数情况下的一般用途;然而针对特定应用场景比如涉及 RTF 文件、Markdown 文档或是其他形式的结构性文档时,则需要额外考虑如何解析源码并将其转化为可被浏览器识别的标准 MIME 类型再执行相应逻辑。 #### 高级应用:复制富文本/HTML 内容剪贴板 考虑到某些业务逻辑可能会要求保留原始样式信息而不只是裸露文字本身,此时就需要借助一些技巧了。一种常见做法是创建临时 DOM 节点用于存储目标 HTML 字符串并通过命令接口发送给操作系统级别的缓冲区: ```html <!-- 组件模板 --> <textarea ref="hiddenTextarea"></textarea> <!-- 不可见区域 --> <button @click="handleRichContentCopy">复制富文本</button> ``` ```js methods: { handleRichContentCopy() { const htmlString = '<p><strong>Hello World!</strong></p>'; // 假设这是待复制的 HTML 结构 let range, selection; if (document.body.createTextRange) { // IE 浏览器兼容方案 range = document.body.createTextRange(); range.moveToElementText(this.$refs.hiddenTextarea); range.execCommand("PasteHTML", false, htmlString); } else if (window.getSelection && document.createRange) { // 现代浏览器通用解决方案 this.$refs.hiddenTextarea.value = ''; // 清空原有值 range = document.createRange(); selection = window.getSelection(); range.selectNodeContents(this.$refs.hiddenTextarea); selection.removeAllRanges(); // 移除所有已选范围 selection.addRange(range); try { this.$refs.hiddenTextarea.focus(); // 将指定 HTML 注入当前光标位置 document.execCommand('insertHTML', false, htmlString); // 执行实际拷贝行为 document.execCommand('copy'); alert('已复制!'); } catch(err){ console.warn('未能自动复制:', err.message || err); } selection.removeAllRanges(); // 操作完成后恢复默认状态 } } }, mounted(){ // 设置隐藏域不可见但仍保持交互能力 Object.assign(this.$refs.hiddenTextarea.style,{ position:'absolute', left:"-999em" }) } ``` 这种方法能够有效地解决跨平台间关于不同编码标准所带来的差异性挑战的同时也兼顾到了视觉上的整洁度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值