# 复制到剪切板
在工作中有一个业务场景是在移动端复制内容,而移动端可能会在Android、iOS和PC端的浏览器运行,这就要求复制内容这一功能具有很强的兼容性。
经过调研发现可以有以下两种方法可以实现复制功能:
- 使用clipboard.js实现复制
- 原生方式实现复制
# 1、clipboard.js
clipboard.js是非常强大的复制工具,可以实现复制、剪切,而且js包的体积也非常小,仅有3kb,使用起来也非常简单,兼容性也很好。
使用方法
<!--引入js-->
<script src="dist/clipboard.min.js"></script>
<!-- Target -->
<input id="foo" value="https://github.com/zenorocha/clipboard.js.git">
<!-- Trigger -->
<button class="btn" data-clipboard-target="#foo">
<img src="assets/clippy.svg" alt="Copy to clipboard">
</button>
<!--js-->
new ClipboardJS('.btn');
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
兼容性

其他功能
- 支持剪切功能
<!--剪切功能-->
<!-- Target -->
<textarea id="bar">Mussum ipsum cacilds...</textarea>
<!-- Trigger -->
<button class="btn" data-clipboard-action="cut" data-clipboard-target="#bar">
Cut to clipboard
</button>
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- 支持事件反馈
var clipboard = new ClipboardJS('.btn');
clipboard.on('success', function(e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
e.clearSelection();
});
clipboard.on('error', function(e) {
console.error('Action:', e.action);
console.error('Trigger:', e.trigger);
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
尽管clipboard.js功能很强大,兼容性很好,但是还是引入了3kb的js包,如果能用原生的方式实现是不是更好呢?
# 2、原生方式
废话不多说,上代码:
<!--html-->
<input id="title1" type="text" value="复制功能测试" readonly="readonly" />
<!--js-->
function copyToClipboard() {
var Url2 = document.getElementById("title1");//要复制文字的节点
if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) {//区分iPhone设备
window.getSelection().removeAllRanges();//这段代码必须放在前面否则无效
var range = document.createRange();
// 选中需要复制的节点
range.selectNode(Url2);
// 执行选中元素
window.getSelection().addRange(range);
// 执行 copy 操作
var successful = document.execCommand('copy');
// 移除选中的元素
window.getSelection().removeAllRanges();
} else {
Url2.select(); // 选择对象
document.execCommand("Copy"); // 执行浏览器复制命令
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
上述是在网络上找的复制代码的方式,经过测试发现在大多数机型下复制到剪切板是没有问题的,但是在iOS下的某些机型复制不成功,如iPhone 7、iPhone 8等其他机型。
那么问题来了,如何才能复制成功呢?见以下代码:
<!--html-->
<textarea id='share-link' value='待复制的内容' className='share-link' readonly='readonly'>
</textarea>
<!--js-->
function copyToClipboard() {
let url = document.getElementById('share-link');//要复制文字的节点
url.select(); // 选择对象
if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) {//区分iPhone设备
url.setSelectionRange(0, 待复制的内容的长度)
}
document.execCommand('Copy'); // 执行浏览器复制命令
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
注意:原生方式需要对iOS系统做兼容处理,不然复制不上。示例中用的是textarea,亦可用input。
在实际项目开发中,我选择原生的方式,相比clipboard.js方式,原生的代码更简单,而且不用引入第三方库,理论上加载速度会更快,用户体验更流畅
# 3、总结
复制功能在很多场景都会用到,如今把自己踩得坑写下来,记录那些难忘的补坑经历,然后一步步的成长,享受这种痛并快乐的时光。
以上总结了两种复制到剪切板的方法,前者为第三方库,功能强大,可实现各种场景的复制功能。后者为原生方式,代码量并不多,可实现基本的复制功能。在写代码时可根据自己所需选择合适的复制方式。
← 微信分享朋友、朋友圈 vim 命令 →