一开始,在 Web 端,并没有任何可以接触到 clipborad 的内容。以前,我们想要执行 copy/paste/cut 只能借助 flash。但现在,伟大的 H5 又或者说 W3C 推出了关于 H5 操控 clipboard 的草案。最出名的就是两个 API:
document.execCommand() ClipboardEvent
我们一步一步来了解一下。先来看一下经典 execCommand 的使用。
复制操作
input 复制
我们需要先了解一下,基本的复制过程:
选中(select)
复制(command + c || ctrl + c)
execCommand 也是遵循这一过程来实现这样的效果。如果我们想使用 execCommand 执行 copy 的话,那么应该先选中你想复制的元素。
这里,另外还会使用到一个新的 API, window.getSelection()。具体来说就是:
getSelection(): 用来获得当前选中的元素的内容。一般而言就是用鼠标选中页面上的内容。
toString(): 用来将选中的内容直接变为 text 文本。
基本使用就是:
// 输出选中的文本
window.getSelection().toString();
我们一般只是使用该 API 进行辅助作用。最常见的做法就是动态创建 input 元素,然后动态制定 input[value]。执行 select(), 进行选中,然后执行 copy 即可。
# 总的代码就是
function copyContent(elementId) { // 动态创建 input 元素 var aux = document.createElement("input"); // 获得需要复制的内容 aux. set Attribute("value", document.getElementById(elementId).innerHTML); // 添加到 DOM 元素中 document.body.app end Child(aux); // 执行选中 // 注意: 只有 input 和 textarea 可以执行 select() 方法. aux.select(); // 获得选中的内容 var content = window.getSelection().toString(); // 执行复制命令 document.execCommand("copy"); // 将 input 元素移除 document.body.removeChild(aux); }
看个实例
任意复制
当然,如果你想不动态添加 input 元素,想直接 copy 的指定 DOM 元素的话,应该怎么做呢?这里就需要使用到 HTML5 新提供的 createRange() 相关方法。当然,上面的 getSelection() 也是其中之一。用到的 API 有:
document.createRange(): 用来创建选中容器。返回一个 range Object。 该 API 的兼容性,也是挺好的,手机端和 PC 端都支持。
selectNode(DOM): 返回 range Object 上挂载的方法。用来添加选中元素。只能添加一个
window.getSelection()
addRange(range): 这个方法是挂载到 getSelection() 方法下的,用来执行元素的选中。(!很重要)
上面 API 就这么一些:
直接看 demo 吧
这里,我贴一下关键代码:
var copyDOM = document.querySelector('#selector'); var range = document.createRange(); // 选中需要复制的节点 range.selectNode(copyDOM); // 执行选中元素 window.getSelection().addRange(range); // 执行 copy 操作 var successful = document.execCommand('copy'); try { var msg = successful ? 'successful' : 'unsuccessful'; console.log('copy is' + msg); } catch(err) { console.log('Oops, unable to copy'); } // 移除选中的元素 window.getSelection().remove All Ranges();
这里需要额外提醒一下,不能自动执行上述 copy 操作。即,在没有任何用户交互操作下,是不能执行 copy 等交互行为的。所以,这里需要用到 click 事件来辅助(当然,你也可以使用其他事件来进行代替)。
使用 clipboard 复制
首先, clipboard 是最近提出来的,所以它的兼容性还是需要等待时间去验证的,目前的兼容性是支持一些简单的 event。
如果,你的浏览器支持 ClipboardEvent Constructor 的话。那么 复制操作就变得异常简单。
// 当然,下面的代码应该放在某个交互的 click 事件中。
var copyEvent = new ClipboardEvent('copy', { dataType: 'text/plain', data: 'My string' }); document.dispatchEvent(copyEvent);
如果没有的话,就只能使用在 document 的 copy 事件中返回的 event.clipboardData API 来设置或者获取相关的信息。我们获得 clipboardData 对象只能通过事件回调来实现:
e.clipboardData: 只能通过 document 上的copy/paste/cut 事件来获取
document.addEvent List ener('copy', function(e){ // 设置信息,实现复制 e.clipboardData.setData('text/plain', 'Hello, world!'); e. prev entDefault(); });
clipboardData: 该 obj 还挂载两个常用的 API
format: 就是基本的 MIME type。最常用的就是 text/plain。具体内容可以参考 MIME references
data: 就是对应 MIME type 放入的具体数据内容
setData(format, data): 设置相关的数据信息,主要用于 copy 和 cut 的相关事件中。
getData(format): 一般用于 paste 事件中。用来获取 clipboard 里面的内容。不过,需要制定正确的解码格式(就是设置好正确的 MIME type)。并且,该方法只能在 paste 事件中使用。
上面感觉就是简单的介绍一下 API,接下来正式说一些干货。如果使用 clipboardData 实现自定义复制内容。这样,你不仅仅可以复制页面上简单的 text 文本,还可以复制图片信息等。
看代码
// 在指定 DOM 上绑定交互事件
DOM.addEventListener('click',function(){},false){ // 添加 copy 内容 document.addEventListener('copy',function copy (e) { msg = `<${msg}/>`; e.clipboardData.setData('text/plain', msg); e.preventDefault(); }) // 执行 copy 命令 document.execCommand('copy'); // 移除绑定事件 document.removeEventListener('copy','copy'); }
cut && paste 相关
前面看起来也挺简单的。当然,有同学会想,不是还有其他事件比如 cut, paste 吗?是不是也可以这么做呢?
额...
一开始,我也是这么想的,但现实往往会给您一个轻轻的爱抚。因为,为了防止你恶意的获取用户信息,在 Chrome 中,一般而言你是不能通过 document.execCommand('paste') 触发 paste 事件。不过,在手机端中,规矩是,你可以在可编辑的元素中触发 cut 和 paste , 只能在有效的 选中 元素中,触发 copy。
根据上面的说法,我们可以通过利用 paste 的相关方法,来具体应用到实践中。比如,防止用户粘贴信息。这特别适用于那些做题页面,防止你查资料然后 copy 相关答案。
document.addEventListener('paste',function copy (e) { e.preventDefault(); }); 当然,还有更狠的,直接禁止 copy,paste,cut 事件。 ['cut', 'copy', 'paste'].forEach((event)=>{ document.addEventListener(event, (e)=>{ e.preventDefault(); });});
方案总结
HTML5 现在能完美提供给我们的应该就是 copy 事件的使用,对于市面上的 clipboard.js 差不多也是运用上述的知识点。根据上面的描述,可以了解到,想要实现复制功能有三种渐进退化方案。以下兼容性由高到低:
input 模式
createRange
clipboard 直接操作
现在 React 比较火,这里我简单的写了一个 copybtn 组件。具体的使用 README 已经写清楚了,如果有什么不懂的地方可以 @我。
【相关推荐】
1. 免费h5在线视频教程
2. HTML5 完整版手册
以上是H5 的复制操作实例代码的详细内容。更多信息请关注PHP中文网其他相关文章!

H5和HTML5是不同的概念:HTML5是HTML的一个版本,包含新元素和API;H5是基于HTML5的移动应用开发框架。HTML5通过浏览器解析和渲染代码,H5应用则需要容器运行并通过JavaScript与原生代码交互。

HTML5的关键元素包括、、、、、等,用于构建现代网页。1.定义头部内容,2.用于导航链接,3.表示独立文章内容,4.组织页面内容,5.展示侧边栏内容,6.定义页脚,这些元素增强了网页的结构和功能性。

HTML5和H5没有区别,H5是HTML5的简称。1.HTML5是HTML的第五个版本,增强了网页的多媒体和交互功能。2.H5常用于指代基于HTML5的移动网页或应用,适用于各种移动设备。

HTML5是超文本标记语言的最新版本,由W3C标准化。HTML5引入了新的语义化标签、多媒体支持和表单增强,提升了网页结构、用户体验和SEO效果。HTML5引入了新的语义化标签,如、、、等,使网页结构更清晰,SEO效果更好。HTML5支持多媒体元素和,无需第三方插件,提升了用户体验和加载速度。HTML5增强了表单功能,引入了新的输入类型如、等,提高了用户体验和表单验证效率。

如何写出干净高效的HTML5代码?答案是通过语义化标签、结构化代码、性能优化和避免常见错误。1.使用语义化标签如、等,提升代码可读性和SEO效果。2.保持代码结构化和可读性,使用适当缩进和注释。3.优化性能,通过减少不必要的标签、使用CDN和压缩代码。4.避免常见错误,如标签未闭合,确保代码有效性。

H5通过多媒体支持、离线存储和性能优化提升网页用户体验。1)多媒体支持:H5的和元素简化开发,提升用户体验。2)离线存储:WebStorage和IndexedDB允许离线使用,提升体验。3)性能优化:WebWorkers和元素优化性能,减少带宽消耗。

HTML5代码由标签、元素和属性组成:1.标签定义内容类型,用尖括号包围,如。2.元素由开始标签、内容和结束标签组成,如内容。3.属性在开始标签中定义键值对,增强功能,如。这些是构建网页结构的基本单位。

HTML5是构建现代网页的关键技术,提供了许多新元素和功能。1.HTML5引入了语义化元素如、、等,增强了网页结构和SEO。2.支持多媒体元素和,无需插件即可嵌入媒体。3.表单增强了新输入类型和验证属性,简化了验证过程。4.提供了离线和本地存储功能,提升了网页性能和用户体验。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

SublimeText3 Linux新版
SublimeText3 Linux最新版

WebStorm Mac版
好用的JavaScript开发工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),