网页端获取用户剪贴板内容

需求:页面有一个"粘贴"按钮,点击后获取用户剪贴板内容并填充到指定输入框中

点击按钮触发"粘贴"事件

html 复制代码
<el-button type="primary" size="small" @click="paste">粘贴</el-button>

paste方法体如下:

javascript 复制代码
// 粘贴
async paste() {
  try {
    await navigator.clipboard.readText();
    console.log("授权成功,允许读取剪贴板");
    getClipBoardData()
      .then((res) => {
        console.log("粘贴", res);
        if (res && res.msg === "success") {
          this.inputValue= res.data;
          return;
        }
        this.$message.error("粘贴失败:" + res.msg);
      })
      .catch((e) => {
        console.log("粘贴失败", e);
        this.$message.error("粘贴失败:" + e);
      });
  } catch (error) {
    console.log("没有权限", error);
    this.$message.error("没有剪贴板读取权限,请手动粘贴到输入框");
  }
}

注:

  1. 使用 await navigator.clipboard.readText() 方法判断是否有剪贴板读取权限,如果没有网页会自动弹出询问授权的弹窗;
  2. getClipBoardData 方法见下方:

剪贴板内容获取及处理

将剪贴板内容的获取以及数据格式处理单独封装到了 clipboard.js 文件中,示例方法体如下:

javascript 复制代码
/**
 * 获取剪切板内容,请在调用此方法前确认已获得剪贴板授权
 */
export function getClipBoardData() {
  return new Promise((resolve, reject) => {
    // 检查浏览器支持
    if (!navigator.clipboard || !navigator.permissions) {
      reject("当前浏览器不支持剪贴板读取API");
      return;
    }
    // 请求用户授权
    navigator.permissions
      .query({
        name: "clipboard-read",
      })
      .then((permission) => {
        if (permission.state === "granted") {
          // 用户已授权,读取剪贴板文本
          navigator.clipboard
            .read()
            .then((items) => {
              const data = {
                type: "", // 文件类型:text or image
                data: null,
                msg: "",
              };
              // 查找文本类型项
              const textItem = items.find((item) =>
                item.types.includes("text/plain")
              );
              if (textItem) {
                // 正常的文本内容
                data.type = "text";
                textItem
                  .getType("text/plain")
                  .then((blob) => {
                    const reader = new FileReader();
                    reader.onload = (event) => {
                      const text = event.target.result;
                      console.log("剪贴板文本内容:", text);
                      data.data = text;
                      data.msg = "success";
                      resolve(data);
                      // 处理文本内容(如显示在页面)
                      // document.getElementById("clipboardContent").innerText = text;
                    };
                    reader.readAsText(blob);
                  })
                  .catch((err) => {
                    console.error("读取文本失败:", err);
                    data.msg = "读取文本失败";
                    resolve(data);
                  });
                return;
              }
              // 剪切板内容不符
              data.type = "";
              data.data = null;
              data.msg = "剪切板内容不符";
              resolve(data);
            })
            .catch((err) => {
              console.error("读取剪贴板失败:", err);
              reject("读取剪贴板失败");
            });
        } else {
          console.error("剪贴板读取权限被拒绝", permission.state);
          // 注:浏览器要求剪贴板操作必须在 HTTPS 环境中执行
          reject("剪贴板读取权限被拒绝");
        }
      })
      .catch((err) => {
        console.error("权限查询失败:", err);
        reject("权限查询失败");
      });
  });
}

注:getClipBoardData 方法中由于业务需求目前只做了文本格式数据的判断及处理,还可以通过文件类型判断是否为图片 以及 应用数据,具体可结合个人业务做调整;

补充

写入内容到剪贴板:

javascript 复制代码
await navigator.clipboard.writeText("写入的内容")

监听网页的"粘贴"事件,示例:

javascript 复制代码
// 监听整个网页文档的 paste 粘贴事件
document.addEventListener('paste', (event) => {
  const clipboardData = event.clipboardData || window.clipboardData;
  if (clipboardData) {
    const items = clipboardData.items;
    for (let i = 0; i < items.length; i++) {
      const item = items[i];
      console.log(`类型: ${item.type}`);
      if (item.type.indexOf('text') !== -1) {
        item.getAsString((text) => {
          console.log('文本内容:', text);
        });
      }
    }
  }
})

注:

  1. HTTPS环境要求‌:剪贴板API只能在安全上下文(HTTPS)中使用,本地localhost除外
  2. 用户手势触发‌:所有剪贴板操作必须由用户主动触发(点击、按键等事件)
  3. 权限机制‌:读取剪贴板需要明确授权,写入剪贴板通常也需要用户交互上下文
相关推荐
换日线°13 分钟前
前端炫酷展开效果
前端·javascript·vue
CappuccinoRose1 小时前
React框架学习文档(七)
开发语言·前端·javascript·react.js·前端框架·reactjs·react router
Hi_kenyon2 小时前
Ref和Reactive都是什么时候使用?
前端·javascript·vue.js
摇滚侠2 小时前
【程序员入门系列】jQuery 零基础入门到精通!Jquery 选择器 API
前端·javascript·jquery
im_AMBER2 小时前
Leetcode 111 两数相加
javascript·笔记·学习·算法·leetcode
止观止3 小时前
告别 require!TypeScript 5.9 与 Node.js 20+ 的 ESM 互操作指南
javascript·typescript·node.js
酒鼎4 小时前
学习笔记(7-01)函数闭包
javascript
半梅芒果干4 小时前
vue3 实现无缝循环滚动
前端·javascript·vue.js
冰敷逆向4 小时前
京东h5st纯算分析
java·前端·javascript·爬虫·安全·web
多多*4 小时前
2026年最新 测试开发工程师相关 Linux相关知识点
java·开发语言·javascript·算法·spring·java-ee·maven