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 相关文章推荐
ajax更新数据后,jquery、jq失效问题
Mar 16 Javascript
自动最大化窗口的Javascript代码
May 22 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
Aug 07 Javascript
jquery实现滑屏大图定时收缩为小banner图片的广告代码
Sep 02 Javascript
Javascript实现检测客户端类型代码封包
Dec 03 Javascript
Angularjs全局变量被作用域监听的正确姿势
Feb 06 Javascript
JavaScript代码性能优化总结(推荐)
May 16 Javascript
JavaScript动态绑定详解
Sep 14 Javascript
如何自定义微信小程序tabbar上边框的颜色
Jul 09 Javascript
微信小程序自定义组件components(代码详解)
Oct 21 Javascript
JS面向对象编程实现的Tab选项卡案例详解
Mar 03 Javascript
解决vue 退出动画无效的问题
Aug 09 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
虫族 Zerg 热键控制
2020/03/14 星际争霸
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
2015/09/25 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
Javascript使用post方法提交数据实例
2015/08/03 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
bootstrap模态框示例代码分享
2017/05/17 Javascript
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
基于axios封装fetch方法及调用实例
2018/02/05 Javascript
vue组件实现弹出框点击显示隐藏效果
2020/10/26 Javascript
react-navigation之动态修改title的内容
2018/09/26 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
详解vue使用插槽分发内容slot的用法
2019/03/28 Javascript
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
ES6中Set和Map用法实例详解
2020/03/02 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
2020/07/17 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
在Python中使用SQLite的简单教程
2015/04/29 Python
Python中map和列表推导效率比较实例分析
2015/06/17 Python
Python中表示字符串的三种方法
2017/09/06 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
2019/04/12 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
python-视频分帧&amp;多帧合成视频实例
2019/12/10 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
汽车维修与检测专业应届生求职信
2013/11/12 职场文书
村班子对照检查材料
2014/08/18 职场文书
协议书格式模板
2016/03/24 职场文书