js、vue2、vue3、uniapp環(huán)境下實現(xiàn)復制內(nèi)容到剪貼板的方式代碼
一、主流環(huán)境實現(xiàn)方法
1. 原生 JavaScript
兼容主流瀏覽器的實現(xiàn)代碼:
/**
* 原生JS復制內(nèi)容到剪貼板
* @param {string} text - 要復制的文本內(nèi)容
* @returns {Promise<boolean>} - 復制成功/失敗
*/
function copyToClipboard(text) {
// 方案1:使用現(xiàn)代API Clipboard(推薦)
if (navigator.clipboard && window.isSecureContext) {
return navigator.clipboard.writeText(text)
.then(() => {
alert('復制成功!');
return true;
})
.catch(err => {
console.error('剪貼板寫入失敗:', err);
alert('復制失敗,請重試!');
return false;
});
}
// 方案2:降級方案(兼容老瀏覽器)
const textArea = document.createElement('textarea');
textArea.value = text;
// 隱藏textarea避免頁面閃爍
textArea.style.position = 'fixed';
textArea.style.opacity = 0;
document.body.appendChild(textArea);
textArea.select();
try {
const successful = document.execCommand('copy');
if (successful) {
alert('復制成功!');
} else {
alert('復制失敗,請手動復制!');
}
return successful;
} catch (err) {
console.error('execCommand復制失敗:', err);
alert('復制失敗,請重試!');
return false;
} finally {
document.body.removeChild(textArea);
}
}
// 調(diào)用示例
document.getElementById('copyBtn').addEventListener('click', () => {
copyToClipboard('這是要復制的內(nèi)容');
});- 核心邏輯:優(yōu)先使用現(xiàn)代的 navigator.clipboard API(需安全上下文),降級用 document.execCommand('copy') + 臨時 textarea。
- 前置條件:navigator.clipboard 僅在 HTTPS 或 localhost 下可用。
2. Vue2
選項式 API 實現(xiàn)代碼:
<template>
<button @click="copyToClipboard('Vue2復制的內(nèi)容')">復制內(nèi)容</button>
</template>
<script>
export default {
methods: {
copyToClipboard(text) {
// 復用原生JS核心邏輯,結(jié)合Vue的響應式提示
if (navigator.clipboard && window.isSecureContext) {
return navigator.clipboard.writeText(text)
.then(() => {
this.$message?.success('復制成功') || alert('復制成功');
})
.catch(() => {
this.$message?.error('復制失敗') || alert('復制失敗');
});
}
// 降級方案
const textArea = document.createElement('textarea');
textArea.value = text;
textArea.style.position = 'fixed';
textArea.style.opacity = 0;
document.body.appendChild(textArea);
textArea.select();
try {
const success = document.execCommand('copy');
this.$message?.[success ? 'success' : 'error']?.(
success ? '復制成功' : '復制失敗'
) || alert(success ? '復制成功' : '復制失敗');
} catch (err) {
this.$message?.error('復制失敗') || alert('復制失敗');
} finally {
document.body.removeChild(textArea);
}
}
}
};
</script>- 核心邏輯:復用原生 JS 復制邏輯,結(jié)合 Vue2 全局提示(如 Element UI 的 this.$message)優(yōu)化用戶體驗。
3. Vue3
組合式 API + Setup Script 實現(xiàn)代碼:
<template>
<button @click="copyToClipboard('Vue3復制的內(nèi)容')">復制內(nèi)容</button>
</template>
<script setup>
import { ElMessage } from 'element-plus'; // 按需引入UI庫提示
/**
* Vue3復制到剪貼板
* @param {string} text - 要復制的文本
*/
const copyToClipboard = async (text) => {
try {
// 優(yōu)先使用Clipboard API
if (navigator.clipboard && window.isSecureContext) {
await navigator.clipboard.writeText(text);
ElMessage.success('復制成功');
return;
}
// 降級方案
const textArea = document.createElement('textarea');
textArea.value = text;
textArea.style.position = 'fixed';
textArea.style.opacity = 0;
document.body.appendChild(textArea);
textArea.select();
const success = document.execCommand('copy');
if (success) {
ElMessage.success('復制成功');
} else {
ElMessage.error('復制失敗,請手動復制');
}
document.body.removeChild(textArea);
} catch (err) {
ElMessage.error('復制失敗,請重試');
}
};
</script>- 核心邏輯:使用 async/await 簡化異步邏輯,結(jié)合 Vue3 生態(tài)的 UI 庫提示,更貼合 Vue3 編碼風格。
4. UniApp
跨端兼容實現(xiàn)代碼:
<template>
<button @click="copyToClipboard('UniApp復制的內(nèi)容')">復制內(nèi)容</button>
</template>
<script setup>
import { uniShowToast } from '@dcloudio/uni-app';
/**
* UniApp跨端復制到剪貼板
* @param {string} text - 要復制的文本
*/
const copyToClipboard = (text) => {
// UniApp提供了統(tǒng)一的跨端API,無需自己寫兼容
uni.setClipboardData({
data: text,
success: () => {
uniShowToast({
title: '復制成功',
icon: 'success'
});
},
fail: () => {
uniShowToast({
title: '復制失敗',
icon: 'none'
});
}
});
};
</script>- 核心邏輯:直接使用 UniApp 封裝的 uni.setClipboardData API,自動適配小程序、App、H5 等端,無需手動處理兼容。
5. 微信小程序
原生小程序語法實現(xiàn)代碼:
<!-- index.wxml -->
<button bindtap="copyToClipboard">復制內(nèi)容</button>
// index.js
Page({
/**
* 微信小程序復制到剪貼板
*/
copyToClipboard() {
const text = '微信小程序復制的內(nèi)容';
wx.setClipboardData({
data: text,
success: () => {
wx.showToast({
title: '復制成功',
icon: 'success'
});
},
fail: () => {
wx.showToast({
title: '復制失敗',
icon: 'none'
});
}
});
}
});- 核心邏輯:使用微信小程序原生 API wx.setClipboardData,僅能在微信環(huán)境運行,無需處理 DOM 相關(guān)邏輯。
二、各實現(xiàn)方式優(yōu)缺點對比
技術(shù)環(huán)境 | 實現(xiàn)方式核心 | 優(yōu)點 | 缺點 |
原生 JS | Clipboard API/execCommand | 無框架依賴、靈活性高、純前端實現(xiàn) | 需手動處理兼容、HTTPS 限制、需操作 DOM |
Vue2 | 封裝原生 JS 邏輯 | 貼合 Vue2 語法、可結(jié)合 UI 提示 | 仍需處理瀏覽器兼容、依賴 DOM 環(huán)境 |
Vue3 | 異步封裝原生 JS 邏輯 | 代碼更簡潔、支持 TS、異步清晰 | 仍需處理瀏覽器兼容、依賴 DOM 環(huán)境 |
UniApp | uni.setClipboardData | 跨端兼容、無需手動寫兼容、無 DOM | 依賴 UniApp 框架、性能略低于原生 |
微信小程序 | wx.setClipboardData | 原生支持、無 DOM 操作、適配微信 | 僅能在微信環(huán)境運行、無跨端能力 |
三、匯總總結(jié)
核心關(guān)鍵點
- 跨端優(yōu)先選 UniApp
UniApp 的 uni.setClipboardData 是最優(yōu)解,一套代碼適配所有端,無需處理兼容問題。
- 純 Web 端選 Vue3 / 原生 JS
Vue3 實現(xiàn)更簡潔,原生 JS 適合無框架場景,優(yōu)先用 navigator.clipboard(HTTPS),降級用 execCommand。
- 微信專屬選小程序原生 API
wx.setClipboardData 適配微信生態(tài),性能和體驗最優(yōu),無需處理 DOM 相關(guān)問題。
選型建議
- 多端應用(小程序 / H5 / App):直接用 UniApp 的 uni.setClipboardData。
- 純 Web 端:Vue 項目(Vue2/Vue3)封裝原生 JS 邏輯,純靜態(tài)頁面用原生 JS 兼容方案。
- 微信專屬小程序:用微信原生 wx.setClipboardData。
通用注意事項
- 原生 JS 的 navigator.clipboard 僅在 HTTPS 或 localhost 環(huán)境可用。
- 所有環(huán)境的復制功能都需用戶主動觸發(fā)(如點擊按鈕),無法自動復制(瀏覽器/小程序安全限制)。
- UniApp 和微信小程序的 API 是異步的,需通過 success/fail 回調(diào)處理結(jié)果,不可同步獲取復制狀態(tài)。
到此這篇關(guān)于js、vue2、vue3、uniapp環(huán)境下實現(xiàn)復制內(nèi)容到剪貼板的方式代碼的文章就介紹到這了,更多相關(guān)js、vue2、vue3、uniapp復制內(nèi)容到剪貼板內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript 未結(jié)束的字符串常量常見解決方法
做JavaScript的時候,發(fā)現(xiàn)老是出現(xiàn)錯誤:“未結(jié)束的字符串常量”. 自己找了下應該是傳參數(shù)的時候,有特殊字符引起的.網(wǎng)上也找了下,也有好多出現(xiàn)這種情況.做下總結(jié),以方便以后查閱.2010-01-01

