当前位置: 首页 > Web前端 > JavaScript

JavaScript中的复制粘贴操作

时间:2023-03-27 13:36:46 JavaScript

在日常业务开发中,比如复制后添加版权信息,点击复制等,需要在场景中进行复制粘贴操作。以下是几种实现方案。剪贴板API剪贴板API提供了响应剪贴板命令(剪切、复制和粘贴)以及异步读取和写入系统剪贴板的能力。在从PermissionsAPI获得权限之前,无法访问剪贴板内容;如果用户不授予权限,则不允许读取剪贴板内容。可以使用全局Navigator.clipboard访问剪贴板。Navigator.clipboard属性返回剪贴板对象,通过它执行所有操作。Clipboard对象提供四种读取和写入剪贴板的方法。它们都是返回Promise对象的异步方法。read()方法read()方法可以从剪贴板中读取任意数据,可以是文本数据,也可以是二进制数据(比如图片)。此方法需要用户的明确许可。read()方法返回一个Promise对象。一旦对象的状态被解析,一个数组就可用,它的每个成员都是ClipboardItem对象的一个??实例。ClipboardItem对象表示一个单独的剪贴板项目,每个剪贴板项目都有一个类型属性和一个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实例作为参数,表示写入剪贴板的数据。示例://写入图像constimgURL='https://dummyimage.com/300.png'constdata=awaitfetch(imgURL)constblob=awaitdata.blob()awaitnavigator.clipboard.write([newClipboardItem({[blob.type]:blob})])注意Chrome目前只支持写入PNG格式的图片。writeText()方法writeText()方法可以将文本内容写入剪贴板。此方法不需要用户许可。示例:navigator.clipboard.writeText('writeclipboardtextcontent')安全限制由于用户可能将敏感数据(如密码)放入剪贴板,允许脚本任意读取会造成安全隐患,因此该API的安全限制较多.首先,Chrome浏览器规定只有HTTPS协议的页面才能使用这个API。但是,开发环境(本地主机)允许使用非加密协议。其次,调用时需要明确获得用户的许可。权限的具体实现使用PermissionsAPI。与剪贴板相关的权限有两种:clipboard-write(写权限)和clipboard-read(读权限)。“写入权限”自动授予脚本,而“读取权限”必须在用户明确同意的情况下授予。也就是说,写入剪贴板可以由脚本自动完成,但是在读取剪贴板时,浏览器会弹出对话框询问用户是否同意读取。Document.execCommand()API已被弃用,不推荐使用它,但让我们了解一下它的兼容性。document.execCommand()方法用于操作可编辑区域的内容。document.execCommand('copy')document.execCommand('copy')复制操作示例:点我复制constcopyBtn=document.querySelector('#copyBtn');constcopyContent=document.querySelector('#copyContent');//复制操作应该放在事件监听函数中,由用户触发(比如用户点击按钮)。copyBtn.addEventListener('click',()=>{copyContent.select();document.execCommand('copy');})document.execCommand('paste')document.execCommand('paste')实现粘贴操作示例:constpasteText=document.querySelector('#paste');pasteText.focus();document.execCommand('paste');Chrome和Firefox不支持document.execCommand('paste')除了使用原生JS,clipboard.js还可以使用一些第三方库,比如clipboard.js来实现复制文本到剪贴板的操作。安装npm安装npminstallclipboard--savescripttagimport使用1.使用一个元素作为触发器复制另一个元素的文本,需要传递DOM选择容器、HTML元素或HTML元素列表来实例化它。2.将data-clipboard-target属性添加到触发器元素。属性值是一个元素选择器,用于匹配另一个需要复制的元素。示例:要复制的内容

点击复制//triggervarclipboard=newClipboardJS('#copyBtn')clipboard.on('成功',function(e){console.log('复制成功!')console.log('操作文本内容:',e.text)console.log('触发操作的DOM元素:',e.trigger)e.clearSelection()})clipboard.on('error',function(e){console.log('复制失败')console.log('触发器operationDOMelement:',e.trigger)})另外,也可以在trigger元素上定义data-clipboard-action属性为copy或cut,明确操作是copy还是cut。如果忽略此属性,则默认为copy。cut的值仅适用于input或textarea元素。点击剪切//triggervarclipboard=newClipboardJS('#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('DOMelementthattriggeredtheaction:',e.trigger)})如果您在触发器元素上定义了data-clipboard-text属性,则不需要另一个元素来复制其内容。data-clipboard-text属性值就是需要复制的内容。例子:Clicktocopy//triggervarclipboard=newClipboardJS('#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('copyfailed')console.error('触发操作的DOM元素:',e.trigger)})事件监听器copy事件copy事件在用户将数据放入剪贴板时触发。例子:document.addEventListener('copy',function(event){alert('triggercopyevent')//剪贴板数据console.log(event.clipboardData)})clipboardDataobject在上面的例子中,事件的clipboardData属性object包含剪贴板数据。它是一个具有以下属性和方法的对象。setData()方法Event.clipboardData.setData(type,data):要在剪切和复制事件中修改剪贴板数据,需要指定数据类型。例子:让痛苦本身成为一种负担,减肥才会被追求。没有人做出最有价值的权宜之计时间灵活,但快乐叫方便,也不知道它们到底是什么.getSelection();//复制文本内容为大写toString().toUpperCase());event.preventDefault();});getData()方法Event.clipboardData.getData(type):获取粘贴事件中的剪贴板数据,需要指定数据类型。示例:document.addEventListener('paste',function(event){alert('triggerapasteevent')//获取粘贴的文本内容vartext=event.clipboardData.getData('text/plain');console.log('Pastecontent:',text)})itemspropertyEvent.clipboardData.items:一个类数组对象,包含了所有的裁剪项,但通常只有一个裁剪项。cutevent当用户进行切割操作时,会触发cut事件。它的处理和复制事件完全一样,也是从Event.clipboardData属性中获取剪切的数据。示例:document.addEventListener('cut',function(){alert('triggercutevent')//剪贴板数据console.log(event.clipboardData)})paste事件用户使用剪贴板数据进行粘贴操作,粘贴事件被触发。示例:document.addEventListener('paste',async(e)=>{e.preventDefault();//获取剪贴板中的文本数据consttext=awaitnavigator.clipboard.readText();console.log('pasteText:',text);});相关例子点击复制读取剪贴板图片复制追加版权信息参考文章Web一键复制粘贴剪贴板复制粘贴操作总结JavaScript复制内容到剪贴板剪贴板操作剪贴板API教程复制粘贴插件-clipboard.js的使用