最近使用Vue開發Line(日韓的一款類似中國微信平臺)的內嵌H5.裡面的有一個需求就是將當前連結貼上,然後傳送到pc端,在電腦上進行開啟。所有蒐集找到了一下幾種情況:
1.不帶input輸入框的原生js方法
這種情況適用於複製非輸入框中的文字到剪下板
<h1 id="content">被複制的內容</h1>
<button id="button">點選複製</button>
<script>
(function(){
button.addEventListener(`click`, function(){
var copyDom = document.querySelector(`#content`);
//建立選中範圍
var range = document.createRange();
range.selectNode(copyDom);
//移除剪下板中內容
window.getSelection().removeAllRanges();
//新增新的內容到剪下板
window.getSelection().addRange(range);
//複製
var successful = document.execCommand(`copy`);
try{
var msg = successful ? "successful" : "failed";
alert(`Copy command was : ` + msg);
} catch(err){
alert(`Oops , unable to copy!`);
}
})
})()
</script>
2.帶輸入框的原生js方法
用於複製input,textarea中的文字
<input type="text" id="input" value="17373383"> <br>
<button type="button" id="button">複製輸入框中內容</button>
<script>
(function(){
button.addEventListener(`click`, function(){
input.select();
document.execCommand(`copy`);
alert(`複製成功`);
})
})()
</script>
這種方法也可以進行延深,充當和方法1一樣的用途。動態建立一個input輸入框,將其內容置為想複製的內容,最後在將其移除或者隱藏即可。
3.js複製內容到剪貼簿外掛(clipboard.js)
引用方式:
- NPM
npm install --save clipboard
- CDN
<script src="https://cdn.bootcss.com/clipboard.js/2.0.1/clipboard.js"></script>
<!--預設是擷取.btn中的 data-clipboard-text的屬性值-->
<!-- <button class="btn" data-clipboard-text="3">Copy</button> -->
<!--擷取input輸入框中的值-->
<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>
<script src="https://cdn.bootcss.com/clipboard.js/2.0.1/clipboard.js"></script>
<script>
var clipboard = new ClipboardJS(`.btn`);
clipboard.on(`success`, function (e) {
console.log(e);
});
clipboard.on(`error`, function (e) {
console.log(e);
});
</script>
裡面還有很多高階用法,可以前往官網邏輯更多細節 Clipboard官網
4. Vue框架提供的剪下板外掛 vue-clipboard2
import Vue from `vue`
import VueClipboard from `vue-clipboard2`
VueClipboard.config.autoSetContainer = true // add this line
Vue.use(VueClipboard)
Sample1
<div id="app"></div>
<template id="t">
<div class="container">
<input type="text" v-model="message">
<button type="button"
v-clipboard:copy="message"
v-clipboard:success="onCopy"
v-clipboard:error="onError">Copy!</button>
</div>
</template>
<script>
new Vue({
el: `#app`,
template: `#t`,
data: function () {
return {
message: `Copy These Text`
}
},
methods: {
onCopy: function (e) {
alert(`You just copied: ` + e.text)
},
onError: function (e) {
alert(`Failed to copy texts`)
}
}
})
</script>
Sample2
<div id="app"></div>
<template id="t">
<div class="container">
<input type="text" v-model="message">
<button type="button" @click="doCopy">Copy!</button>
</div>
</template>
<script>
new Vue({
el: `#app`,
template: `#t`,
data: function () {
return {
message: `Copy These Text`
}
},
methods: {
doCopy: function () {
this.$copyText(this.message).then(function (e) {
alert(`Copied`)
console.log(e)
}, function (e) {
alert(`Can not copy`)
console.log(e)
})
}
}
})
</script>