核心原理: 利用浏览器提供的 copy 命令
注意: 对 ipad、iphone 等苹果移动端需做单独处理
由于项目需求需要一个远程桌面的内容,开始调研了 guacamole,
一、业务组件的开发
1.1 粘贴板 clipboard.js 的使用方法
一、使用场景
在移动端开发的时候,有的应用需要用户拷贝页面的内容,方便用户操作。此时,就是需要是用粘贴板功能。
二、使用步骤
1. npm 安装 clipboard.js 插件
npm install clipboard –save
2. 页面 dom 结构
3. 在文件中引入
import clipboard from ‘@/lib/clipboard’
4. 使用方法
三、注意事项
- 如果需要在复制成功后,做业务处理,注意此时需要在 success 执行。
- 对于 success 事件中,需要注意 this 的指向问题。this 测试不是指向 vue 实例。
- currentPageUrl 用户需要拷贝的文本。
1.2 剪切 clipboard.js 的使用方法
剪切
另外,也可以定义 data-clipboard-action 属性为 copy/cut 来,明确操作是 复制 / 剪切
如果忽略了这个属性,便默认 复制
1 | 1. <!-- Target --> |
正如上例,剪切 cut 的操作只能在 和
属性复制文本
我们甚至不必需要其他承载文本的元素,仅通过 在触发元素中 添加 data-clipboard-text 属性 来完成复制
1 | <div class="viewport" ref="viewport"> |
注意:
- data-clipboard-text “级别最高”,在 data-clipboard-target 等属性存在时,复制内容及相关参数以 data-clipboard-text 为准
事件
回调函数: success / error
事件名 | 参数 |
---|---|
success | event.action copy/cut |
操作 | |
event.text copy/cut | |
操作文本内容 | |
event.triger 触发操作的 DOM | |
元素 | |
error | event.action copy/cut |
操作 | |
event.triger 触发操作的 DOM | |
元素 |
1 | 1. clipboard.install = (client) => { |
工具提示
每个应用程序有不同的设计需求,这就是为什么 clipboard.js 不包括任何 CSS 或内置的工具提示解决方案。
高级用法
如果你不想修改你的 HTML,有一个非常方便的命令式 API 供你使用。您所需要做的就是声明一个函数,执行您的操作,然后返回一个值。
例如 如果想动态的设置一个目标元素 target,则需要返回一个节点,即 动态设置点击复制的目标元素
1 | 1. new ClipboardJS('.btn', { |
如果想动态设置内容文本 text,则返回一个字符串 String
1 |
|
在 Bootstrap Modals 中或与任何其他更改焦点的库一起使用时,将希望将焦点元素设置为 container 值。
1 | 1. new ClipboardJS('.btn', { |
并且,如果在单页应用中使用时,要更精确地管理 DOM 的生命周期,可以使用以下方法清除创建的事件对象
1 | clipboard.getLocalClipboard = async () => { |
二、 业务场景
常见的在我们日常生活中,比如我们广大的程序员朋友们,在使用 IDE 编辑器时总会出现以下一种情况:
代码 c+v 也就是我们常说的 “ CV 大法 “, 而我们 IDE 编辑器的功能 cv 只会在 IDE 内部实现剪切,复制,粘贴,
这就造成了一种现象 “ 次元隔绝 “ 。
而这种现象就是由于我们使用编辑器内地代码在进行 CV 大法的时候 无法将命令执行回我们电脑内地指令,而是被
IDE 内部指令拦截 导致我们 CV 出来的东西无法复制到除 IDE 编辑器外面的其他软件或编辑器上,也就是命令没有被电脑收取,我们的数据没有存在本该电脑存储的栈中,而是被编辑器截取了,
所以这时候我们伟大的救世主” CV 大法强化升级版-剪切板组件 “ 就这样被我们诞生出来了!
2.1 剪切板雏形
由于浏览器隐私协议限制,以前浏览器是不允许直接访问剪切板的,最近几年,随着 web 应用兴起,W3C 也在逐渐拓宽 JavaScript 应用范围,现在前端也能直接操作剪切板。文中按照访问方式,分为间接访问和直接访问。
间接访问
交互事件
用户交互事件,如 paste(复制)、cut(剪切)、dragstart(拖拽)等,能够通过事件对象 Event,访问到剪切板。可以通过这部分操作,我们可以格式化、自定义剪切板中内容。在 contenteditable(可编辑)元素中,为了统一粘贴文本样式,我们可以在元素的复制事件中,对文本格式进行过滤。
1 | let editor = document.getElementById('editor) |
除了文本,我们还能获取其他内容吗?比如图像?答案是一半一半。为什么说一半一半?
正常情况下,我们用截图软件截图,这部分是能在 e.dataTransfer.files 中获取到的,截图软件实际上是将 base64 文件放到了剪切板中。但是,假如我们在操作系统中复制一张图片,在 dataTransfer 对象中,是获取不到的,这是浏览器隐私协议限制,正如 web 页面不能直接操作系统文件(虽然部分浏览器已经支持 File API)一样,遇到这种需求,需要先放一放。
在业务开发中,测试童鞋们,总是能给人一些惊喜,谁说只能粘贴,我还可以拖拽,拖拽一些奇奇怪怪的内容进去,看,又发现一个 Bug。可编辑元素默认是允许拖拽的,为避免这种方式,给我们的选择只有两个,第一,禁止拖拽,可以,但是比较暴力,第二就是改写拖拽内容,监听 dragstart 事件。
1 | let editor = document.getElementById('editor) |
直接访问
clipboard API
最近 navigator 新增了 Clipboard API,不仅能够对剪切板文本、文件读取,还提供了写的操作,但是兼容性较差。文本读写 Chrome 66 版本即支持,但是 image/png 得 76+才行。返回值是 Promise,用起来比较方便,但是对于剪切板的访问,首先需要运行在 https 服务页面中,其次需要请求用户授权,授权通过后,才能访问。基本使用示例如下:
1 | // 读取文本 |
2.2 浏览器兼容
Evevt.clipboardData 对象
clipboardData 是 JavaScript 剪切板对象,该对象提供了 3 个常用方法:
clearData(): clipboardData 对象从剪切板删除一种或多种数据格式(一个参数:数据类型)
getData(): clipboardData 对象从剪切板获取指定格式的数据(一个参数:数据类型)
setData(): clipboardData 对象赋予指定格式的数据(两个参数:数据类型,要赋予的值) *数据类型一般为“”text/plain” ”
Evevt.clipboardData 对象兼容性问题
经过尝试,clipboardData 对象内兼容大部分 px 浏览器,像 chrome,firefox、ie 等,但是在手机端兼容性不是很好,
目前 clipboardData 在 ios 上的 safari 浏览器无效,为解决移动端这个问题,我们引用一个 js 插件——clipboard.js
clipboard.js 依赖于 HTML5 推出的 Selection API 和 execCommand API
使用方法:
首先在页面中引入
1 | <script src="clipboard.min.js"></script> |
使用 clipboard.js 的自定义属性
1 | <!--使用data-clipboard-target属性指定被复制的标签--> |
高级用法:
1 | //清理Clipboard对象 |
Zero Clipboard
Zero Clipboard 作为一个独立的 js 库,它利用 Flash 进行复制,需要两个文件:ZeroClipboard.js 和 ZeroClipboard.swf 。网络上有 2 个版本,实现原理都是使用 flash 进行复制,不知道原创是谁的,也可能一家子的 2 个兄弟,这个就不管了,只要我们自己做到尊重版权,表示问心无愧,今天给大家介绍的这个版本相对来说比较简单。
首先看下图是为使用 Zero Clipboard 后生成的 flash 对象,它能兼容的 flash10 及以下版本,兼容所有的浏览器:
现在我们先使用独立的 js 库 Zero Clipboard 简单实现复制到剪贴板功能,demo 如下:
1 | <!DOCTYPE html> |
独立的 js 库 ZeroClipboard.js 是采用 flash 实现实现复制到剪贴板的功能,可以看出,使用 ZeroClipboard.js 带来功能相对比较少,不过它是独立的库,文件比较小,而使用 jquery.zclip.js 后的功能是比较丰富
三、Vue 插件兼容
安装 clipboard 插件
npm install clipboard
2.使用 clipboard
HTML 重点样式
Javascript 重点技术
剪切-复制-粘贴
鼠标区域圈选
业务逻辑处理
1 | clipboard.install = (client) => { |
- Post link: https://blog.gaocaipeng.com/2020/09/21/alqpfb/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.