前言
最近有一个需求是在文章列表中实现一个【复制链接】的功能。如图:
点击【复制链接】之后,链接将复制到剪切板。可在浏览器中进行粘贴打开。
最终实现方法
最终的实现方法很简单,引一个插件,一行代码搞定。这里演示一个简单的 Demo。
- 下载 copy-to-clipboard
npm i copy-to-clipboard --save
- 引入 copy 方法,在点击按钮时调用 copy 方法
import copy from 'copy-to-clipboard';
function coppyUrl(url){
copy(url);
alert('复制成功');
};
function App(){
return <button onClick={()=>coppyUrl('https://www.baidu.com/')}><button>
};
export default App;
中间踩坑
刚开始在网上找了各种 js 实现复制链接的办法。要么出现浏览器兼容性,要么主要是针对原生 DOM 操作。在此记录一下。
1. 只兼容 IE 浏览器
效果:
原理:
- 使用 window.clipboardData.setData 方法。不过该方法只兼容 IE 浏览器。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<textarea id="input" style="width: 300px; height: 100px">
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Maxime expedita corporis culpa voluptates deleniti eveniet voluptatem laborum facere quos fugit, obcaecati corrupti repellat voluptatibus iste quae! Illum sint quibusdam velit?</textarea
>
<button type="button" onClick="copyUrl()">
点此复制文本框的内容
</button>
<script language="javascript">
function copyUrl() {
var input = document.getElementById("input");
window.clipboardData.setData("Text", input.value);
alert("复制成功!");
}
</script>
</body>
</html>
2. 浏览器自带的方法实现原生 DOM 复制
效果:
原理:
- 使用文本域或者输入框的
input.select()
方法。 - 执行浏览器的
document.execCommand("copy")
命令。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div>
<textarea id="input" style="width:300px;height:100px">
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Maxime expedita corporis culpa voluptates deleniti eveniet voluptatem laborum facere quos fugit, obcaecati corrupti repellat voluptatibus iste quae! Illum sint quibusdam velit?</textarea
>
<div><button onclick="copyText()" style="cursor: pointer;">点此复制文本框的内容</button></div>
</div>
<script>
function copyText() {
var input = document.getElementById("input");
//input.value = text; // 修改文本框的内容
input.select(); // 选中文本
document.execCommand("copy"); // 执行浏览器复制命令
alert("复制成功");
}
</script>
</body>
</html>
兼容 Firefox 48.0、Chrome 60.0、IE 8 。
3. 使用 clipboard 插件
效果:
原理:
- 引入 clipboard 插件。
- 在点击元素中,使用 data-clipboard-action 指定操作类型(copy or cut)。使用 data-clipboard-target 指定复制的目标元素。
- 实例化 ClipboardJS 对象,参数为点击元素的类名或者id名。
注意:根据 clipboard 插件的版本不同,有的需要实例化 Clipboard 对象。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div>
<textarea id="input" style="width: 300px; height: 100px">
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Maxime expedita corporis culpa voluptates deleniti eveniet voluptatem laborum facere quos fugit, obcaecati corrupti repellat voluptatibus iste quae! Illum sint quibusdam velit?</textarea
>
<div>
<button id="btn" data-clipboard-action="copy" data-clipboard-target="#input" style="cursor: pointer">
点此复制文本框的内容
</button>
</div>
</div>
<script src="./clipboard.js"></script>
<script>
//使用 dom 属性实现复制功能
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);
alert("复制成功");
e.clearSelection();
});
clipboard.on("error", function (e) {
console.error("Action:", e.action);
console.error("Trigger:", e.trigger);
});
</script>
</body>
</html>