文本复制兼容方案最佳实现落地。

文章目录


一、navigator.clipboard.writeText

navigator.clipboard.writeText 是一个Web API,它允许网页脚本将文本数据写入用户的系统剪贴板。这个API是异步的,并且设计用于提高安全性和用户体验,因为它要求网页必须是在用户交互(如点击或按键事件)的上下文中才能访问剪贴板。

样例代码如下:

c 复制代码
// 假设你有一个按钮,用户点击它会触发文本复制
document.getElementById('copyButton').addEventListener('click', async function() {
  // 要复制的文本
  const textToCopy = '这是一段要复制到剪贴板的文本';
 
  try {
    // 使用 navigator.clipboard.writeText 复制文本
    await navigator.clipboard.writeText(textToCopy);
    console.log('文本已成功复制到剪贴板!');
  } catch (err) {
    console.error('无法复制文本:', err);
  }
});

二、方案落地

使用上面的方案会出现部署到生产环境和测试环境不生效,换成下面方法做兼容就可以了

c 复制代码
<template>
  <div class="box">
    <div class="gameId">{{ resStr }}</div>
    <button id="copyButton" @click="copyText">复制内容</button>
  </div>

  <el-dialog
    v-model="dialogVisible"
    title="提示"
    width="500"
    :before-close="handleClose"
  >
    <span style="color: red">文本已复制</span>
    <template #footer>
      <div class="dialog-footer">
        <el-button
          style="width: 50px"
          type="primary"
          @click="dialogVisible = false"
        >
          确定
        </el-button>
      </div>
    </template>
  </el-dialog>
</template>

<script setup>
import { useRoute } from "vue-router";
import { ref } from "vue";
const route = useRoute();
const resStr = ref("");
const str = Object.values(route.query).join("");
resStr.value = JSON.parse(str).join(",");

const dialogVisible = ref(false);

// 开发环境这个版本可以用,生产环境需要做兼容性判断
// 复制文本
// const copyText = () => {
//   try {
//     navigator.clipboard.writeText(resStr);
//     dialogVisible.value = true;
//   } catch (err) {
//     ElMessage.error("文本复制失败");
//   }
// };

// 这个是用于兼容性判断  生成环境和测试环境都兼容
async function copyText() {
  if ("clipboard" in navigator) {
    try {
      await navigator.clipboard.writeText(resStr.value);
      dialogVisible.value = true;
    } catch (err) {}
  } else {
    // 回退方案:使用document.execCommand('copy')
    const textArea = document.createElement("textarea");
    textArea.value = resStr.value;
    document.body.appendChild(textArea);
    textArea.select();
    try {
      const successful = document.execCommand("copy");
      const msg = successful ? "successful" : "unsuccessful";
    } catch (err) {}
    document.body.removeChild(textArea);
  }
}
</script>

总结

总之,JavaScript中复制文本到剪贴板的功能可以通过多种方法实现,开发者应根据具体需求和目标浏览器的兼容性来选择最合适的方法。同时,还需要注意安全性和用户体验方面的考虑。

相关推荐
卖报的小行家_5 分钟前
读《Vue.js设计与实现》第四章·响应系统的作用与实现
前端
七月丶7 分钟前
🚀 前端缓存踩坑指南:如何优雅地解决浏览器缓存问题?
前端
沉默王二8 分钟前
更快更强!字节满血版DeepSeek在IDEA中真的爽!
java·前端·程序员
树上有只程序猿11 分钟前
3分钟,了解一下Vue3中的插槽到底是个啥
vue.js
掘金酱14 分钟前
👏 用idea传递无限可能!AI FOR CODE挑战赛「创意赛道」作品提交指南
前端·人工智能·trae
Hamm16 分钟前
咦,你的Git仓库贡献者里怎么有这么多大佬???
前端·git·github
潜龙在渊灬33 分钟前
前端 UI 框架发展史
javascript·vue.js·react.js
陈卓4101 小时前
Redis-限流方案
前端·redis·bootstrap
顾林海1 小时前
Flutter Dart 运算符全面解析
android·前端
孤寂大仙v1 小时前
【Linux笔记】理解文件系统(上)
linux·运维·笔记