前端实现一键复制
muxi229 2024-08-29 14:03:02 阅读 52
前言
需求: 因项目需要License认证,认证页面有服务器信息。 服务器信息可一键复制发送给技术人员,方便生成license。使用navigator.clipboard 全局对象就是来处理剪贴板的,对于clipboard 的API,JS剪切板操作一文写的很清楚。
问题: 项目发布后发现,只有我开发环境可以实现一键复制。原因:只有 HTTPS 协议的页面才能使用Clipboard API。不过,开发环境(localhost)允许使用非加密协议
解决方案: 使用clipboard.js插件
下面是两种方式实现一键复制,需要的 小伙伴各取所需
项目效果如下:
一、JS实现一键复制
限制:js Clipboard API 对安全性有要求,项目需使用https
html代码
<code> <fieldset id="systemField">code>
<legend>服务器信息</legend>
<div style="padding:10px">code>
<div class="copyDiv">code>
<button id="copyBtn">{ -- -->{replicatedShow ? "已复制":"一键复制"}}</button>code>
</div>
<div id="systemInfoBtn">code>
<div class="text item">code>
<span>MAC地址: </span> <span class="spanLabel">{ -- -->{systemForm.macAddressList}}</span>code>
</div>
<div class="text item">code>
<span>CPU序列号: </span> <span class="spanLabel">{ -- -->{systemForm.cpuSerial}}</span>code>
</div>
<div class="text item">code>
<span>主板序列号: </span> <span class="spanLabel">{ -- -->{systemForm.mainBoardSerial}}</span>code>
</div>
</div>
</div>
</fieldset>
js代码
mounted: function () { -- -->
const clipboard = navigator.clipboard;
const button = document.getElementById("copyBtn");
button.addEventListener("click", async () => {
if (!clipboard) {
this.$Tips.tipWarningBox("当前浏览器不支持剪切板复制!");
return;
}
var content = document.getElementById("systemInfoBtn").innerText;
try {
//将信息写入剪切板,显示已复制,3s后显示一键复制
await clipboard.writeText(content);
this.replicatedShow = true;
setTimeout(() => {
this.replicatedShow = false;
}, 3000);
} catch (error) {
console.log("failed", error);
}
});
},
完整代码
<template lang="html">code>
<div v-loading="loading" class="licenseDiv">code>
<fieldset id="systemField">code>
<legend>服务器信息</legend>
<div style="padding:10px">code>
<div class="copyDiv">code>
<button id="copyBtn">{ -- -->{replicatedShow ? "已复制" :"一键复制"}}</button>code>
</div>
<div id="systemInfoBtn">code>
<div class="text item">code>
<span>MAC地址: </span> <span class="spanLabel">{ -- -->{systemForm.macAddressList}}</span>code>
</div>
<div class="text item">code>
<span>CPU序列号: </span> <span class="spanLabel">{ -- -->{systemForm.cpuSerial}}</span>code>
</div>
<div class="text item">code>
<span>主板序列号: </span> <span class="spanLabel">{ -- -->{systemForm.mainBoardSerial}}</span>code>
</div>
</div>
</div>
</fieldset>
</div>
</template>
<script>
export default { -- -->
data() {
return {
loading: false,
systemForm: { },
replicatedShow: false,
};
},
created: function () {
this.getSystemData();
},
mounted: function () {
const clipboard = navigator.clipboard;
const button = document.getElementById("copyBtn");
button.addEventListener("click", async () => {
if (!clipboard) {
this.$Tips.tipWarningBox("当前浏览器不支持剪切板复制!");
return;
}
var content = document.getElementById("systemInfoBtn").innerText;
try {
await clipboard.writeText(content);
this.replicatedShow = true;
setTimeout(() => {
this.replicatedShow = false;
}, 3000);
} catch (error) {
console.log("failed", error);
}
});
},
methods: {
getSystemData() {
this.systemForm.macAddressList = "01:30:16:9a:92:04";
this.systemForm.cpuSerial = "0F3BFBDF120405F0";
this.systemForm.mainBoardSerial =
"VMware-42 1a 76 d2 8c 6f 58 c4-a8 85 78 51 11 71 cd 3a";
},
},
};
</script>
<style lang="less" scoped>code>
.licenseDiv { -- -->
padding: 10px;
width: 45%;
height: 100vh;
margin: 2% auto;
}
.text {
font-size: 12px;
}
.item {
padding: 4px 0;
}
.spanLabel {
padding-left: 6px;
color: #b1b0b0;
}
.copyDiv {
float: right;
margin: -20px -8px 0 0;
display: none;
}
// 鼠标悬浮显示按钮
#systemField:hover .copyDiv {
display: block;
}
// 按钮样式
#copyBtn {
display: inline-block;
line-height: 1;
white-space: nowrap;
cursor: pointer;
background: #fff;
border: 1px solid #dcdfe6;
color: #606266;
-webkit-appearance: none;
text-align: center;
box-sizing: border-box;
outline: 0;
margin: 0;
transition: 0.1s;
font-weight: 500;
padding: 3px;
// padding: 12px 20px;
font-size: 12px;
border-radius: 3px;
}
// 按钮悬浮效果
#copyBtn:hover {
color: #409eff;
border-color: #c6e2ff;
background-color: #ecf5ff;
}
</style>
文本选中效果
项目中没有用到这个效果,把代码贴出来,有备无患
//文本选中效果
function selectText(element) {
if (window.getSelection && document.createRange) {
var selection = window.getSelection();
var range = document.createRange();
range.selectNodeContents(element);
selection.removeAllRanges();
selection.addRange(range);
} else if (document.body.createTextRange) { // 支持 IE < 9
var textRange = document.body.createTextRange();
textRange.moveToElementText(element);
textRange.select();
}
}
// 使用方法:
var element = document.getElementById('systemInfoBtn');
selectText(element);
二、clipboard.js插件实现一键复制
官网文档非常清楚,需要的小伙伴直接去看官网
1.安装插件
npm install clipboard --save
2.在所需组件引入
import Clipboard from “clipboard”
3.传入一个DOM 选择器, HTML 元素, 或者 HTML 元素数组作为参数,来实例化对象
var clipboard = new Clipboard(“#copyBtn”) //调用就能复制
4.使用
触发器的data-clipboard-target要与复制目标的id一致
html代码:
<!--触发器 data-clipboard-target="#systemInfoBtn"-->code>
<div class="copyDiv">code>
<button id="copyBtn" data-clipboard-target="#systemInfoBtn">{ -- -->{replicatedShow ? "已复制" :"一键复制"}}</button>code>
</div>
<!--目标 id="systemInfoBtn" -->code>
<div id="systemInfoBtn">code>
<div class="text item">code>
<span>MAC地址: </span> <span class="spanLabel">{ -- -->{systemForm.macAddressList}}</span>code>
</div>
<div class="text item">code>
<span>CPU序列号: </span> <span class="spanLabel">{ -- -->{systemForm.cpuSerial}}</span>code>
</div>
<div class="text item">code>
<span>主板序列号: </span> <span class="spanLabel">{ -- -->{systemForm.mainBoardSerial}}</span>code>
</div>
</div>
js代码:
let self = this;
const button = document.getElementById("copyBtn");
button.addEventListener("click", async () => { -- -->
var clipboard = new Clipboard("#copyBtn");
//复制成功后的操作:改为已复制,3s后还原为一键复制
clipboard.on("success", function (e) {
self.replicatedShow = true;
//取消对文本的选择
e.clearSelection();
setTimeout(() => {
self.replicatedShow = false;
}, 3000);
});
clipboard.on("error", function (e) {
self.$Tips.tipWarningBox("当前浏览器不支持剪切板复制!");
});
完整代码
<template lang="html">code>
<div v-loading="loading" class="licenseDiv">code>
<fieldset id="systemField">code>
<legend>服务器信息</legend>
<div style="padding:10px">code>
<div class="copyDiv">code>
<button id="copyBtn" data-clipboard-target="#systemInfoBtn">{ -- -->{replicatedShow ? "已复制" :"一键复制"}}</button>code>
</div>
<div id="systemInfoBtn">code>
<div class="text item">code>
<span>MAC地址: </span> <span class="spanLabel">{ -- -->{systemForm.macAddressList}}</span>code>
</div>
<div class="text item">code>
<span>CPU序列号: </span> <span class="spanLabel">{ -- -->{systemForm.cpuSerial}}</span>code>
</div>
<div class="text item">code>
<span>主板序列号: </span> <span class="spanLabel">{ -- -->{systemForm.mainBoardSerial}}</span>code>
</div>
</div>
</div>
</fieldset>
</div>
</template>
<script>
export default { -- -->
data() {
return {
loading: false,
systemForm: { },
replicatedShow: false,
};
},
created: function () {
this.getSystemData();
},
mounted: function () {
let self = this;
const button = document.getElementById("copyBtn");
button.addEventListener("click", async () => {
//实例化对象
var clipboard = new Clipboard("#copyBtn");
//复制成功后的操作:改为已复制,3s后还原为一键复制
clipboard.on("success", function (e) {
//取消本文选择效果
self.replicatedShow = true;
e.clearSelection();
setTimeout(() => {
self.replicatedShow = false;
}, 3000);
});
clipboard.on("error", function (e) {
self.$Tips.tipWarningBox("当前浏览器不支持剪切板复制!");
});
});
},
methods: {
getSystemData() {
this.systemForm.macAddressList = "01:30:16:9a:92:04";
this.systemForm.cpuSerial = "0F3BFBDF120405F0";
this.systemForm.mainBoardSerial =
"VMware-42 1a 76 d2 8c 6f 58 c4-a8 85 78 51 11 71 cd 3a";
},
},
};
</script>
<style lang="less" scoped>code>
.licenseDiv { -- -->
padding: 10px;
width: 45%;
height: 100vh;
margin: 2% auto;
}
.text {
font-size: 12px;
}
.item {
padding: 4px 0;
}
.spanLabel {
padding-left: 6px;
color: #b1b0b0;
}
.copyDiv {
float: right;
margin: -20px -8px 0 0;
display: none;
}
// 鼠标悬浮显示按钮
#systemField:hover .copyDiv {
display: block;
}
// 按钮样式
#copyBtn {
display: inline-block;
line-height: 1;
white-space: nowrap;
cursor: pointer;
background: #fff;
border: 1px solid #dcdfe6;
color: #606266;
-webkit-appearance: none;
text-align: center;
box-sizing: border-box;
outline: 0;
margin: 0;
transition: 0.1s;
font-weight: 500;
padding: 3px;
// padding: 12px 20px;
font-size: 12px;
border-radius: 3px;
}
// 按钮悬浮效果
#copyBtn:hover {
color: #409eff;
border-color: #c6e2ff;
background-color: #ecf5ff;
}
</style>
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。