JavaScript复制内容到剪贴板的两种常用方法


Posted in Javascript onFebruary 27, 2018

常见方法

查了一下万能的Google,现在常见的方法主要是以下两种:

第三方库:clipboard.js
原生方法:document.execCommand()

分别来看看这两种方法是如何使用的。

clipboard.js

这是clipboard的官网:https://clipboardjs.com/,看起来就是这么的简单。

引用

直接引用:

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

包: npm install clipboard --save ,然后 import Clipboard from 'clipboard';

使用

从输入框复制
现在页面上有一个 <input> 标签,我们需要复制其中的内容,我们可以这样做:

<input id="demoInput" value="hello world">
<button class="btn" data-clipboard-target="#demoInput">点我复制</button>
import Clipboard from 'clipboard';
const btnCopy = new Clipboard('btn');

注意到,在 <button> 标签中添加了一个 data-clipboard-target 属性,它的值是需要复制的 <input>id,顾名思义是从整个标签中复制内容。

直接复制

有的时候,我们并不希望从 <input> 中复制内容,仅仅是直接从变量中取值。如果在 Vue 中我们可以这样做:

<button class="btn" :data-clipboard-text="copyValue">点我复制</button>

import Clipboard from 'clipboard';
const btnCopy = new Clipboard('btn');
this.copyValue = 'hello world';

事件

有的时候我们需要在复制后做一些事情,这时候就需要回调函数的支持。

在处理函数中加入以下代码:

// 复制成功后执行的回调函数
clipboard.on('success', function(e) {
 console.info('Action:', e.action); // 动作名称,比如:Action: copy
 console.info('Text:', e.text); // 内容,比如:Text:hello word
 console.info('Trigger:', e.trigger); // 触发元素:比如:<button class="btn" :data-clipboard-text="copyValue">点我复制</button>
 e.clearSelection(); // 清除选中内容
});

// 复制失败后执行的回调函数
clipboard.on('error', function(e) {
 console.error('Action:', e.action);
 console.error('Trigger:', e.trigger);
});

小结

文档中还提到,如果在单页面中使用 clipboard ,为了使得生命周期管理更加的优雅,在使用完之后记得 btn.destroy() 销毁一下。

clipboard 使用起来是不是很简单。但是,就为了一个 copy 功能就使用额外的第三方库是不是不够优雅,这时候该怎么办?那就用原生方法实现呗。

document.execCommand()方法

先看看这个方法在 MDN 上是怎么定义的:

which allows one to run commands to manipulate the contents of the editable region.

意思就是可以允许运行命令来操作可编辑区域的内容,注意,是可编辑区域。

定义

bool = document.execCommand(aCommandName, aShowDefaultUI, aValueArgument)

方法返回一个 Boolean 值,表示操作是否成功。

  • aCommandName :表示命令名称,比如: copy, cut 等(更多命令见命令);
  • aShowDefaultUI:是否展示用户界面,一般情况下都是 false;
  • aValueArgument:有些命令需要额外的参数,一般用不到;

兼容性

这个方法在之前的兼容性其实是不太好的,但是好在现在已经基本兼容所有主流浏览器了,在移动端也可以使用。

JavaScript复制内容到剪贴板的两种常用方法

使用

从输入框复制
现在页面上有一个 <input> 标签,我们想要复制其中的内容,我们可以这样做:

<input id="demoInput" value="hello world">
<button id="btn">点我复制</button>

js代码

const btn = document.querySelector('#btn');
btn.addEventListener('click', () => {
	const input = document.querySelector('#demoInput');
	input.select();
	if (document.execCommand('copy')) {
		document.execCommand('copy');
		console.log('复制成功');
	}
})

其它地方复制

有的时候页面上并没有 <input> 标签,我们可能需要从一个 <div> 中复制内容,或者直接复制变量。

还记得在 execCommand() 方法的定义中提到,它只能操作可编辑区域,也就是意味着除了 <input>、<textarea> 这样的输入域以外,是无法使用这个方法的。

这时候我们需要曲线救国。

<button id="btn">点我复制</button>

js代码

const btn = document.querySelector('#btn');
btn.addEventListener('click',() => {
	const input = document.createElement('input');
	document.body.appendChild(input);
 	input.setAttribute('value', '听说你想复制我');
	input.select();
	if (document.execCommand('copy')) {
		document.execCommand('copy');
		console.log('复制成功');
	}
 document.body.removeChild(input);
})

算是曲线救国成功了吧。在使用这个方法时,遇到了几个坑。

遇到的坑

在Chrome下调试的时候,这个方法时完美运行的。然后到了移动端调试的时候,坑就出来了。

对,没错,就是你,ios。。。

1、点击复制时屏幕下方会出现白屏抖动,仔细看是拉起键盘又瞬间收起

知道了抖动是由于什么产生的就比较好解决了。既然是拉起键盘,那就是聚焦到了输入域,那只要让输入域不可输入就好了,在代码中添加 input.setAttribute('readonly', 'readonly'); 使这个 <input> 是只读的,就不会拉起键盘了。

2、无法复制

这个问题是由于 input.select() 在ios下并没有选中全部内容,我们需要使用另一个方法来选中内容,这个方法就是 input.setSelectionRange(0, input.value.length);。

完整代码如下:

const btn = document.querySelector('#btn');
btn.addEventListener('click',() => {
	const input = document.createElement('input');
 input.setAttribute('readonly', 'readonly');
 input.setAttribute('value', 'hello world');
 document.body.appendChild(input);
	input.setSelectionRange(0, 9999);
	if (document.execCommand('copy')) {
		document.execCommand('copy');
		console.log('复制成功');
	}
 document.body.removeChild(input);
})

总结

以上就是关于JavaScript如何实现复制内容到剪贴板,附上几个链接:

execCommand MDN

execCommand兼容性

clipboard.js

Javascript 相关文章推荐
如何实现浏览器上的右键菜单
Jul 10 Javascript
Javascript实现页面跳转的几种方式分享
Oct 26 Javascript
让input框实现类似百度的搜索提示(基于jquery事件监听)
Jan 31 Javascript
js放大镜放大购物图片效果
Jan 18 Javascript
基于Vue开发数字输入框组件
Dec 19 Javascript
利用原生js实现html5小游戏之打砖块(附源码)
Jan 03 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
Sep 05 jQuery
Vuex 使用 v-model 配合 state的方法
Nov 13 Javascript
jQuery实现的简单日历组件定义与用法示例
Dec 24 jQuery
Vue使用zTree插件封装树组件操作示例
Apr 25 Javascript
详解iframe跨域的几种常用方法(小结)
Apr 29 Javascript
实例分析javascript中的异步
Jun 02 Javascript
Vue中this.$router.push参数获取方法
Feb 27 #Javascript
angularJs-$http实现百度搜索时的动态下拉框示例
Feb 27 #Javascript
angularjs数组判断是否含有某个元素的实例
Feb 27 #Javascript
angular json对象push到数组中的方法
Feb 27 #Javascript
angularjs实现table增加tr的方法
Feb 27 #Javascript
关于redux-saga中take使用方法详解
Feb 27 #Javascript
浅析Visual Studio Code断点调试Vue
Feb 27 #Javascript
You might like
PHP批量采集下载美女图片的实现代码
2013/06/03 PHP
php 中文字符串首字母的获取函数分享
2013/11/04 PHP
测试php连接mysql是否成功的代码分享
2014/01/24 PHP
PHP SPL标准库中的常用函数介绍
2015/05/11 PHP
js中符号转意问题示例探讨
2013/08/19 Javascript
ajax提交表单实现网页无刷新注册示例
2014/05/08 Javascript
jQuery中removeData()方法用法实例
2014/12/27 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
vue-cli2.9.3 详细教程
2018/04/23 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
2018/05/15 Javascript
webpack+vue+express(hot)热启动调试简单配置方法
2018/09/19 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
vue弹出框组件封装实例代码
2019/10/31 Javascript
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
Python采用Django开发自己的博客系统
2020/09/29 Python
python学习教程之使用py2exe打包
2017/09/24 Python
PyQt5利用QPainter绘制各种图形的实例
2017/10/19 Python
详解python Todo清单实战
2018/11/01 Python
python爬虫爬取幽默笑话网站
2019/10/24 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
请写出char *p与"零值"比较的if语句
2014/09/24 面试题
大学生最常用的自我评价
2013/12/07 职场文书
光盘行动倡议书
2014/02/02 职场文书
财务总监岗位职责
2014/03/07 职场文书
社区六一儿童节活动总结
2015/02/11 职场文书
施工安全保证书
2015/05/09 职场文书
阿甘正传观后感
2015/06/01 职场文书
2016年中学清明节活动总结
2016/04/01 职场文书
如何理解PHP核心特性命名空间
2021/05/28 PHP
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android