前端一键复制解决方案分享

需求背景

用户需要对流水号 进行复制使用,前端的展示是通过样式控制,超出省略号表示,鼠标悬浮展示完整流水号。此处的鼠标悬浮展示采用的是:title='',这样就无法对文本进行选中。

下面是给出一键复制的不同的解决方案,希望对大家有所帮助。

使用UI框架中的Popover 弹出框
如下图所示:
  • 优点
    • 可以直接根据前端工程中使用到的UI库引入使用
  • 缺点
    • 需要用户手动选中文本进行复制,而且从项目全局考虑,为了样式的一致性可能会造成较大的改动
ClipboardJS

ClipboardJS 是一个轻量级的 JavaScript 库,主要用于实现剪贴板功能,让用户可以方便地复制文本。

使用方法
  • npm 安装

    javascript 复制代码
    npm install clipboard --save
复制代码
 ###### 引入

 ```javascript
 import ClipboardJS from 'clipboard'
 ```
复制代码
 ###### 样例

 ```vue
 <template>
 	<el-button type="primary" id="copy-button" @click="oneKeyCopy">一键复制</el-button>
 	<div class="container">
         <input v-model="logJson" />
     </div>
 </template>

 <script>
 import ClipboardJS from 'clipboard';
 export default {
     data() {
         return {
             logJson: '哈哈哈',
 		}
 	},
     methods: {
         oneKeyCopy() {
             let clipboard = new ClipboardJS('#copy-button', {
                 text: () => this.logJson,
             });
             clipboard.on('success', (e) => {
                 this.$message.success('复制成功!');
                 clipboard.destroy();
             });
             clipboard.on('error', () => {
                 this.$message.error('复制失败,请手动复制!');
                 clipboard.destroy();
             });
             clipboard.onClick(event => event.preventDefault()); // 阻止默认的点击事件
             clipboard.click(); // 触发点击事件以执行复制操作
             clipboard.destroy();
         },
 	}
 }
 </script>
 ```
原生JS
基本用法
js 复制代码
// content:需要复制的内容
const copyToClipboard = (content) => {
  const textarea = document.createElement("textarea")
  textarea.value = content
  document.body.appendChild(textarea)
  textarea.select()
  document.execCommand("Copy")
  textarea.remove()
}
兼容性

不同的浏览器或版本对 execCommand 的支持程度不同
4.

navigator.clipboard.writeText 是一个现代浏览器提供的 API,用于将文本写入剪贴板。

基本用法
html 复制代码
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>复制文本示例</title>
</head>
<body>
    <textarea id="text-to-copy" rows="4" cols="50">这是需要复制的文本。</textarea><br>
    <button id="copy-button">复制文本</button>

    <script>
        document.getElementById('copy-button').addEventListener('click', function() {
            const text = document.getElementById('text-to-copy').value;
            
            navigator.clipboard.writeText(text)
                .then(() => {
                    console.log('文本已复制:', text);
                    alert('文本已复制到剪贴板!');
                })
                .catch(err => {
                    console.error('复制失败:', err);
                });
        });
    </script>
</body>
</html>
代码解释
  • 通过 document.getElementById 获取文本域和按钮元素。
  • 为按钮添加点击事件监听器。
  • 在点击事件中,获取文本域中的值,并调用 navigator.clipboard.writeText(text)
  • 使用 .then() 方法处理成功情况,并在控制台输出信息或显示提示。
  • 使用 .catch() 方法处理错误情况。
兼容性

navigator.clipboard 是现代浏览器支持的特性(如 Chrome, Firefox, Edge 等),在某些旧版浏览器中可能不被支持。建议在使用前检查浏览器的兼容性。

总结

推荐方案2,方案1的使用需要考虑项目样式的一致性,可能会导致较多的内容改动;方案4和方案3均存在不兼容的情况。

相关推荐
gnip14 分钟前
链式调用和延迟执行
前端·javascript
SoaringHeart25 分钟前
Flutter组件封装:页面点击事件拦截
前端·flutter
杨天天.27 分钟前
小程序原生实现音频播放器,下一首上一首切换,拖动进度条等功能
前端·javascript·小程序·音视频
Dragon Wu37 分钟前
React state在setInterval里未获取最新值的问题
前端·javascript·react.js·前端框架
Jinuss38 分钟前
Vue3源码reactivity响应式篇之watch实现
前端·vue3
YU大宗师41 分钟前
React面试题
前端·javascript·react.js
木兮xg41 分钟前
react基础篇
前端·react.js·前端框架
ssshooter1 小时前
你知道怎么用 pnpm 临时给某个库打补丁吗?
前端·面试·npm
IT利刃出鞘2 小时前
HTML--最简的二级菜单页面
前端·html
yume_sibai2 小时前
HTML HTML基础(4)
前端·html