JavaScript 中的复制粘贴操作

JS实现一键复制、选中复制、选中多行复制 阅读详情
AI摘要

本文介绍了在Web开发中实现复制粘贴操作的多种方法,包括使用ClipboardAPI的read()、readText()、write()、writeText()方法,以及弃用的Document.execCommand()。此外,还提到了clipboard.js库的使用,以及如何监听剪贴板的copy、cut、paste事件。重点讲解了ClipboardAPI的安全限制和权限管理,强调了在实际应用中的兼容性和安全性问题。

在日常业务开发,比如复制后增加版权信息,点击复制,等场景中需要进行复制粘贴的操作,以下是几种实现方案。

Clipboard API

Clipboard API 提供了响应剪贴板命令(剪切、复制和粘贴)与异步读写系统剪贴板的能力。从权限 API (Permissions API) 获取权限之后,才能访问剪贴板内容;如果用户没有授予权限,则不允许读取剪贴板内容。

可以使用全局的 Navigator.clipboard 来访问剪贴板。

Navigator.clipboard 属性返回 Clipboard 对象,所有操作都通过这个对象进行。

Clipboard 对象提供了四个方法,用来读写剪贴板。它们都是异步方法,返回 Promise 对象。

read( ) 方法

read() 方法可以从剪贴板读取任意数据,可以是文本数据,也可以是二进制数据(比如图片)。该方法需要用户明确给予许可。

read() 方法返回一个 Promise 对象。一旦该对象的状态变为 resolved,就可以获得一个数组,每个数组成员都是 ClipboardItem 对象的实例。

ClipboardItem 对象表示一个单独的剪贴项,每个剪贴项都拥有 types 属性和 getType( ) 方法。

ClipboardItem.types 属性返回一个数组,里面的成员是该剪贴项可用的 MIME 类型,比如某个剪贴项可以用 HTML 格式粘贴,也可以用纯文本格式粘贴,那么它就有两个 MIME 类型(text/html 和 text/plain)。

ClipboardItem.getType(type) 方法用于读取剪贴项的数据,返回一个 Promise 对象。该方法接受剪贴项的 MIME 类型作为参数,返回该类型的数据,该参数是必需的,否则会报错。

示例:

//获取权限
navigator.permissions
.query({
  name: 'clipboard-read'
})
.then(result => {
  if (result.state == 'granted' || result.state == 'prompt') {
	//读取剪贴板
	navigator.clipboard.read().then(data => {
	  console.log(data)
	})
  } else {
	alert('请允许读取剪贴板!')
  }
})

readText( ) 方法

readText() 方法可以从剪贴板读取文本内容。该方法需要用户明确给予许可。

示例:

//获取权限
navigator.permissions
.query({
  name: 'clipboard-read'
})
.then(result => {
  if (result.state == 'granted' || result.state == 'prompt') {
	//读取剪贴板
	navigator.clipboard.readText().then(text => {
	  console.log(text)
	})
  } else {
	alert('请允许读取剪贴板!')
  }
})

write( ) 方法

write() 方法可以将任意数据写入剪贴板,可以是文本数据,也可以是二进制数据。该方法不需要用户许可。

write() 方法接受一个 ClipboardItem 实例作为参数,表示写入剪贴板的数据。

示例:

//写入一张图片
const imgURL = 'https://dummyimage.com/300.png'
const data = await fetch(imgURL)
const blob = await data.blob()
await navigator.clipboard.write([
	new ClipboardItem({
	  [blob.type]: blob
	})
])

注意,Chrome 浏览器目前只支持写入 PNG 格式的图片。

writeText( ) 方法

writeText() 方法可以写入文本内容至剪贴板。该方法不需要用户许可。

示例:

navigator.clipboard.writeText('写入剪贴板文本内容')

安全限制

由于用户可能把敏感数据(比如密码)放在剪贴板,允许脚本任意读取会产生安全风险,所以这个 API 的安全限制比较多。

首先,Chrome 浏览器规定,只有 HTTPS 协议的页面才能使用这个 API。不过,开发环境(localhost)允许使用非加密协议。

其次,调用时需要明确获得用户的许可。权限的具体实现使用了 Permissions API ,跟剪贴板相关的有两个权限:clipboard-write(写权限)和 clipboard-read(读权限)。“写权限”自动授予脚本,而“读权限”必须用户明确同意给予。也就是说,写入剪贴板,脚本可以自动完成,但是读取剪贴板时,浏览器会弹出一个对话框,询问用户是否同意读取。

Document.execCommand()

这个 API 已弃用,不推荐使用它,但是为了兼容还是了解一下吧。

document.execCommand() 方法用于操纵可编辑区域的内容。

document.execCommand('copy')

document.execCommand('copy') 实现复制操作

示例:

<input id="copyContent" value="需要被复制内容">
<button id="copyBtn">点我复制</button>
const copyBtn = document.querySelector('#copyBtn');
const copyContent = document.querySelector('#copyContent');
// 复制操作要放在事件监听函数里面,由用户触发(比如用户点击按钮)。
copyBtn.addEventListener('click', () => {
	copyContent.select();
	document.execCommand('copy');
})

document.execCommand('paste')

document.execCommand('paste') 实现粘贴操作

示例:

<input id="paste" placeholder="粘贴">
const pasteText = document.querySelector('#paste');
pasteText.focus();
document.execCommand('paste');

Chrome、Firefox 不支持 document.execCommand('paste')

clipboard.js

除了使用原生 JS 外,还可以使用一些第三方的库,比如 clipboard.js 来实现复制文本到剪贴板的操作。

安装

npm 安装

npm install clipboard --save

script 标签引入

<script src="dist/clipboard.min.js"></script>

使用

1、用一个元素当触发器来复制另一个元素的文本,需要传递 DOM 选择器,HTML 元素或 HTML 元素列表来实例化它。

2、在触发器元素上添加 data-clipboard-target 属性,该属性值是一个元素选择器,用来匹配另一个需要被复制的元素。

示例:

<div id="copyContent">需要被复制的内容</div>
<button id="copyBtn" data-clipboard-target="#copyContent">点击复制</button>
//触发器
var clipboard = new ClipboardJS('#copyBtn')

clipboard.on('success', function (e) {
  console.log('复制成功!')
  console.log('操作文本内容:', e.text)
  console.log('触发操作的DOM元素:', e.trigger)
  e.clearSelection()
})

clipboard.on('error', function (e) {
  console.log('复制失败')
  console.log('触发操作的DOM元素:', e.trigger)
})

另外,触发器元素上也可以定义 data-clipboard-action 属性为 copy 或 cut ,来明确操作是复制还是剪切,如果忽略了这个属性,则默认是复制。值为 cut 时仅适用于 input 或 textarea 元素。

<input id="copyContent" value="需要被复制的内容"/>
<button id="copyBtn" data-clipboard-target="#copyContent" data-clipboard-action="cut">点击剪切</button>
//触发器
var clipboard = new ClipboardJS('#copyBtn')

clipboard.on('success', function (e) {
  console.log('复制成功!')
  console.log('操作文本内容:', e.text)
  console.log('触发操作的DOM元素:', e.trigger)
  e.clearSelection()
})

clipboard.on('error', function (e) {
  console.log('复制失败')
  console.error('触发操作的DOM元素:', e.trigger)
})

如果在触发器元素上定义 data-clipboard-text 属性,则不需要另一个元素来复制其内容。data-clipboard-text 属性值就是需要被复制的内容。

示例:

<button id="copyBtn" data-clipboard-text="需要被复制的内容">点击复制</button>
//触发器
var clipboard = new ClipboardJS('#copyBtn')

clipboard.on('success', function (e) {
  console.log('复制成功!')
  console.log('操作文本内容:', e.text)
  console.log('触发操作的DOM元素:', e.trigger)
  e.clearSelection()
})

clipboard.on('error', function (e) {
  console.log('复制失败')
  console.error('触发操作的DOM元素:', e.trigger)
})

事件监听

copy 事件

用户向剪贴板放入数据时,将触发 copy 事件。

示例:

document.addEventListener('copy', function (event) {
  alert('触发复制事件')
  //剪切板数据
  console.log(event.clipboardData)
})
clipboardData 对象

上面示例中,事件对象的 clipboardData 属性包含了剪贴板数据。它是一个对象,有以下属性和方法。

setData( ) 方法

Event.clipboardData.setData(type, data):在 cut 和 copy 事件中修改剪贴板数据,需要指定数据类型。

示例:

<div id="copyContent">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dignissimos expedita temporibus facere mollitia nemo at voluptatibus dicta commodi neque iusto nesciunt earum suscipit deserunt delectus numquam cum nulla libero fugit.
</div>
var copyContent = document.querySelector('#copyContent');
copyContent.addEventListener('copy', (event) => {
	const selection = document.getSelection();
	//复制文本内容转大写
	event.clipboardData.setData('text/plain', selection.toString().toUpperCase());
	event.preventDefault();
});
getData( ) 方法

Event.clipboardData.getData(type):在 paste 事件中获取剪贴板数据,需要指定数据类型。

示例:

document.addEventListener('paste', function (event) {
  alert('触发粘贴事件')
  //获取粘贴文本内容
  var text = event.clipboardData.getData('text/plain');
  console.log('粘贴内容:',text)
})
items 属性

Event.clipboardData.items:一个类似数组的对象,包含了所有剪贴项,不过通常只有一个剪贴项。

cut 事件

cut 事件则是在用户进行剪切操作时触发,它的处理跟 copy 事件完全一样,也是从 Event.clipboardData 属性拿到剪切的数据。

示例:

document.addEventListener('cut', function () {
	alert('触发剪切事件')
	//剪切板数据
	console.log(event.clipboardData)
})

paste 事件

用户使用剪贴板数据,进行粘贴操作时,会触发 paste 事件。

示例:

document.addEventListener('paste', async (e) => {
  e.preventDefault();
  //获取剪贴板里的文本数据
  const text = await navigator.clipboard.readText();
  console.log('粘贴文本: ', text);
});

相关示例

参考文章

Web 一键复制与粘贴

剪贴板复制粘贴操作汇总

JavaScript复制内容到剪贴板

剪贴板操作 Clipboard API 教程

复制粘贴插件——clipboard.js的使用

JavaScript实现复制粘贴功能的原理与应用 在Web开发中,复制粘贴功能是一项常见需求。通过JavaScript,我们可以实现在网页上点击按钮或其他交互元素后将指定内容复制到剪贴板,也可以将剪贴板中的内容粘贴到指定位置。实现复制功能的基本原理是使用Clipboard API,它提供了访问和操作剪贴板内容的方法。不过,为了满足代码占比不高于50%的要求,我们将使用第三方库clipboard.js,这是一个轻量级的JavaScript库,提供了简单易用的复制粘贴功能。 阅读详情

相关推荐

JS解除切屏限制、解除快捷键操作屏蔽 解除复制粘贴限制

// 解除切屏限制 window.onblur = null; window.onblur = function() {console.debug(1);} // 解除快捷键操作屏蔽 window.onkeyup = window.onkeydown = window.onkeyPress = document.onkeyup = document.onkeydown = document.onkeyPress = document.body.onkeyup = document.body.onkey

书香水墨 4937

js实现复制功能

js实现复制功能一、具体场景二、实现方式1. document.execCommand(1)具体实现(2)方法特点2.navigator.clipboard.writeText(1)具体实现(2)方法特点 一、具体场景 前端有时需要实现点击按钮复制的功能,这个时候就不能让用户去手动选择内容右键复制了。 二、实现方式 1. document.execCommand (1)具体实现 复制时,先选中文本,然后调用document.execCommand(‘copy’),选中的文本就会进入剪贴板。这就需要借助输入框

个人博客 1万+

JavaScript 读写剪贴板之方式汇总

JavaScript操作剪贴板虽然存在安全问题,但在某些应用场景下还是很方便的,比如复制一个link 等,JavaScript操作剪贴板的方式有: 方式1. 使用navigator 的Clipboard 对象 方式2. 使用 document.execCommand 方式3. window.clipboardData 对象 方式4. 使用一些封装的第三方库

oscar999的专栏 1万+

JS复制粘贴功能实现

本章记录如何通过js代码实现复制内容到剪切板,之后可以粘贴到需要的地方的功能。

qq_44886882的博客 5915

【点击按钮 复制文本】实现点击按钮复制文本内容(vue和uniapp两种方式实现)

实现点击按钮复制文本内容(vue和uniapp两种方式实现)

weixin_48596030的博客 3551

STM32移植LVGL(LittleVGL)

**STM32移植LVGL(LittleVGL)**

qq_53000374的博客 1万+

JavaScript:实现复制粘贴剪切功能

ClipboardAPI是下一代的剪贴板操作方法,比传统的方法更加强大、更合理。

lalala_dxf的博客 3万+

手把手教你用Matlab搞定GRACE RL06数据读取:冯伟老师工具箱无GUI版实战

本文详细介绍了如何使用Matlab处理GRACE RL06数据,重点解析了冯伟教授工具箱的无GUI版实战操作。通过环境配置、核心函数改造和批处理技巧,帮助科研工作者高效完成重力场数据的读取与分析,特别适合服务器集群环境下的批量处理需求。

weixin_29313817的博客 200

js关于复制粘贴的一些相关操作

在一些网站中的信息是无法进行复制粘贴的,例如我们在注册一个用户时,密码框无法进行复制粘贴,那么是如何实现的呢? 这里主要使用到了js的copy(复制)和paste(粘贴)两种方法 1:copy(复制) <h1 id="nocopy"> 这段文本不运行复制 </h1> <script> nocopyHtml = document.getElementById('nocopy') nocopyHtml.oncopy = () => {

huaweichenai的博客 866

CentOS 环境 sngrep 安装及使用

在呼叫中心类应用开发过程中,经常需要对 SIP 信令抓包,分析排查问题。通常抓包的工具非常多样,如 Wireshark、tcpdump、ngrep 等都是可选项,但是针对 SIP 信令的抓包,sngrep 则更为好用。因为 sngrep 不仅提供了图形界面,还会将一通会话的 SIP 信令关联汇总,非常直观执行以下命令下载 的相关依赖库 1.2 添加 sngrep 的源并导入 执行下面的命令新增一个源仓库配置文件 然后在该文件中写入以下配置内容 执行命令导入源仓库的公钥 1.3 安装 sngrep

谈谈1974 8147

从高德、百度地图下载POI数据?用这个工具5分钟搞定GCJ02/BD09到WGS84的坐标纠偏

本文详细解析了高德、百度地图POI数据坐标偏移问题,并提供了从GCJ02/BD09到WGS84的高效转换方案。通过开源工具如coordtransform和ArcGIS等专业软件,实现毫米级精度的坐标纠偏,适用于商业选址、GIS分析等场景,显著提升数据准确性和工作效率。

weixin_26789847的博客 449

javascript 复制粘贴操作

function CopyCode(key){ var trElements = document.all.tags("tr");//获取tr元素 var i; for(i = 0; i &lt; trElements.length; ++i) {  if(key.parentElement.parentElement.parentElement == trElements[i].parentEl...

weixin_33937778的博客 133

电机转矩、功率与转速:核心关系、公式推导与工程应用指南

在电气传动与自动化控制领域,理解旋转机械的核心物理量是进行设备选型、系统设计和故障诊断的基础。转矩、功率和转速构成了描述电机性能的“铁三角”,它们之间通过经典的物理公式紧密关联。从原理上讲,功率是单位时间内做功的能力,转矩是产生旋转运动的力矩,而转速则决定了运动快慢。这三者的关系(P = T × n / 9550)不仅是理论核心,更是工程实践中的关键计算工具,直接关系到电机的驱动能力、能耗与系统匹配。其技术价值在于,它为从微型伺服电机到大型工业传动系统的设计提供了统一的量化分析框架。在应用场景上,无论是为输

weixin_29184371的博客 258

Js对按照进行分组

利用js的reduce进行分组操作 上代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> </body> <scrip...

qq_40346450的博客 509

Windows2008使用-解决漏洞-CVE-2010-2730

随着硬件的升级,操作系统也逐渐进行了版本更新。目前阶段,Windows2016Server、Windows2022Server逐渐成为了以Windows系列的服务器平台系统。对于有些应用而言,由于其业务的固定,可能仍只能运行在Windows2008Server或者Windows2012Server上。有时候我们为安全需要,需要将相关的操作系统涉及的漏洞做修复。最近碰到在一个Windows2008R2 的操作系统漏洞CVE-2010-2730,一顿操作,终于找到了合适的方案,这里分享给大家。

mystonelxj的博客 2314

【SystemVerilog基础】SystemVerilog Assertion 概述

断言主要是描述复杂的设计行为;是传统验证方法学一个很好的补充,可以检查到电路内部细节,相当于一种白盒验证,传统的验证方法学是纯粹的黑盒验证!property跟上面的sequence差别不大,唯一有差别可能多了两个implication(|->,|=>)注意,当有前置条件时,不满足前置条件不会fail,而是伪真!上面这个因为没有前置条件,每个周期都会去检查!注意:当没有前置条件时,不满足条件会直接fail!

MoorePlus的博客 332

vxe-table4 区域选择、复制粘贴、拖动柄【最全,最规范】

left: ".vxe-table--fixed-left-wrapper .vxe-table--body-inner-wrapper", //左侧固定区域。left_header: ".vxe-table--fixed-left-wrapper .vxe-table--header-inner-wrapper", //主区域。// console.log('捕获到 keydown 事件:',args, {rowIndex,rowid,columnIndex,column});

多哥仁慈的骆驼 888

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JS禁止复制粘贴,F12操作

CSS禁止文字复制粘贴 /*禁止文字选中*/ /* html,body{ -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } */ <div unselectable="on" onselectstart="return false;" s...

林中明月间丶 4706

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JS 实现复制粘贴功能

JS 实现复制粘贴功能目前没有做过多的测试,只是测试了几个手机,介绍:支持情况(1)移动端: chrome(版本 58.0.3029.96 (64-bit))、 猎豹(V6.0.114.14559)、 QQ浏览器(Chromium53.022785.104 \ IE11.0.9600.18665)、 火狐(版本 53.02) (2)App端 苹果6(版本:10.3.1)、 华为 (版本:6.0.1)

White feathe 的博客 2万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

sortablejs拖拽时,选中复制粘贴问题

需要选中时,进行复制的区域。

yyt的博客 173

f12html复制方法,JS禁止复制粘贴,F12操作

CSS禁止文字复制粘贴/*禁止文字选中*//* html,body{-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;} */ some text 说明:unselectable针对IEonselectstart针对Chrome、Safari-moz-user-sel...

weixin_39564853的博客 2252

Windows一键JS混淆加密:功能集成到鼠标右键菜单

如您已获得JShaman VIP 码,可修改上述代码中的VIP码、使用商业接口,能使配置参数生效果、获得更好的JS混淆加密效果。操作过程,通常情况下,需要将代码复制或提交到网站或软件中,以使用JShaman为例,需要复制代码到JShaman网站,完成JS混淆加密,再把代码粘贴回来。实现此功能,需要用NodeJS运行一个脚本JS文件,以便调用JShaman WebApi接口,进行。修改注册表是为给JS文件添加右键菜单,以便在右键点击.js文件时菜单中显示“混淆加密”功能。测试,加密一个JS文件,如上图所示。

w2sft的博客 593

Auto.js实例复制粘贴

setClip("陌路天籁") toast(getClip()) paste()

weixin_46002413的博客 4908

复制粘贴

前提 引入: <script src="<?php echo $this->SURL('/js/clipboard.min.js') ?>"></script> html :data-clipboard-text = "复制的内容"; <button class="copyBtn susBtn" @click="copyFun(...

qq_36457584的博客 657
上一篇: JavaScript中对光标和选区的操作
下一篇: JavaScript实现扁平数组与树结构的相互转换
FEWY
FEWY 领域专家: 前端开发技术领域 领域专家: 前端开发技术领域
博客等级 码龄10年 504粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值