小工具知识网

当前位置: 首页 > 行业知识 > 前端实现一键复制及阻止用户复制功能

行业知识

前端实现一键复制及阻止用户复制功能

2026-11-15 07:25:14 来源:互联网转载

一、前端实现复制

1. document.execCommand(‘copy’)

已弃用:  不再推荐使用该特性。虽然一些浏览器仍然支持它,但也许已从相关的 web 标准中移除,也许正准备移除或出于兼容性而保留。请尽量不要使用该特性,并更新现有的代码。请注意,该特性随时可能无法正常工作。

这里是借用 input 或 textarea 来实现。

实现一个复制的方法
// src/hooks/useCopy.tsimport {ElMessage} from 'element-plus';/** * 实现文字复制 * @param copyValue 将要复制的文字 */export const useCopy = (copyValue: string) => {      // 创建输入框      let inputDom = document.createElement('input');      // 给输入框value赋值      inputDom.value = copyValue;      // 把input框添加到body上      document.body.appendChild(inputDom);      // 选中输入框中的内容      inputDom.select();            // 复制文字到剪切板      const hasCopy = document.execCommand('Copy');      ElMessage({          type: hasCopy ? 'success' : 'error',          message: hasCopy ? '复制成功' : '复制失败'     });                  // 删除创建的dom节点      document.body.removeChild(inputDom);}
引用复制方法
      {{ value }}    复制  import { useCopy } from "@/hooks/useCopy";let value = "11212fdgafaweaqwreqrqr";let handleCopy = () => {  useCopy(value);};

2. navigator.clipboard 实现复制文字

只有在用户事先授予网站或应用对剪切板的访问许可之后,才能使用异步剪切板读写方法。Chrome 浏览器规定,只有 HTTPS 协议的页面才能使用这个 API。不过,开发环境(localhost)允许使用非加密协议。

复制方法的实现
// src/hooks/useCopy.tsimport {ElMessage} from 'element-plus';/** * 实现文字复制 * @param copyValue 将要复制的文字 */export const useCopy = (copyValue: string) => {  try {    // 如果浏览器支持则会放回 Clipboard 对象,否则返回 undefined    const clipboard = navigator.clipboard;    if (clipboard) {      clipboard.writeText(copyValue).then(() => {        ElMessage({          type: 'success',          message: '复制成功'        });      });    } else {      ElMessage({        type: 'error',        message: '该浏览器不支持复制,请尝试换其它浏览器!'      });    }  } catch (error) {    console.log('error:', error);  }};
引用复制方法
      {{ value }}    复制  import { useCopy } from "@/hooks/useCopy";let value = "11212fdgafaweaqwreqrqr";let handleCopy = () => {  useCopy(value);};

3. navigator.clipboard 实现复制图片

          复制      import imgSrc from "@/assets/images/login_bg2.png";export default {  setup() {    const src = imgSrc;    const handleCopy = () => {      let imgBlob;      fetch(src).then(async (res) => {        try {          // 图片转换成流          imgBlob = await res.blob();          // const text = new Blob(["cccccccccc"], { type: "text/plain" });          // 实现图片复制          const item = new ClipboardItem({ [imgBlob.type]: imgBlob });          await navigator.clipboard.write([item]);          console.log("文本复制成功");          // 实现图片读取(粘贴)          const clipboardContents = await navigator.clipboard.read();          clipboardContents.forEach(async (item: any) => {            const blob = await item.getType("image/png");            const imgDom = document.createElement("img");            imgDom.style.width = "100%";            imgDom.style.height = "100%";            imgDom.src = URL.createObjectURL(blob);            const pDom = document.getElementById("image-container");            pDom?.appendChild(imgDom);          });        } catch (error) {          console.log("error:", error);        }      });    };    return {      src,      handleCopy,    };  },};

二、前端实现阻止用户复制文本

监听用户右键复制操作(可以整个系统复制监听,也可以对某段文字进行监听),当用户进行复制时,判断用户当前有无权限,只有有权限才可以复制,否则不可以并进行一系列操作。

实现

            身份:      {{ isVip ? "会员" : "普通用户" }}        {{ value }}          切换身份      import { useCopy } from "@/hooks/useCopy";import { ElMessage } from "element-plus";import { onMounted, ref } from "vue";let value = "11212fdgafaweaqwreqrqr";let isVip = ref(true);onMounted(() => {  const textDom = document.getElementById("vip-text")!;  textDom.addEventListener("copy", (e) => {    e.preventDefault();    if (isVip.value) {      // 获取手表选中内容, 加 "" 是为了把获取的对象转字符串      const selectContent = window.getSelection() + "";      // 此处使用 navigator.clipboard 来实现文字的复制      useCopy(selectContent);      window.getSelection()?.empty();    } else {      ElMessage({        type: "error",        message: "请先升级为VIP会员",      });    }  });});

上一篇:SpringBoot集成ElasticSearch(ES)

下一篇:织梦网播放器嵌入指南,一键添加媒体播放功能!