使用剪贴版复制网页内容

新版 API

MDN 文档地址: Clipboard API - Web API | MDN

该 API 被设计用来取代使用 document.execCommand() 的剪贴板访问方式。

write 方法

这里只讨论如何进行复制

假设页面上有这样的 html 代码。

html 复制代码
  <div class="md-preview">
    <el-button type="primary" @click="copyDom">复制</el-button>
    <section id="output">
     <!- 需要复制的区域-->
    </section>
  </div>

复制到剪贴版总共需要三个步骤:

  1. 获取 DOM 元素
  2. 构建 ClipboardItem 参数
  3. 写入剪贴版
javascript 复制代码
async function copy() {
      const dom = document.getElementById("output");

      try {
        const htmlContent = dom?.innerHTML;

        const htmlBlob = new Blob([htmlContent || ""], { type: "text/html" });
        const clipboardItem = new ClipboardItem({ "text/html": htmlBlob });
        await navigator.clipboard.write([clipboardItem]);
      } catch (error) {
        console.log(error);
      }
}

可以将这个函数放进按钮的点击事件里。

旧版 API

由于旧版 API 已经在 MDN 上声明 遗弃 了,能不使用就不用。

MDN 文档:document.execCommand - Web API | MDN

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

这里给出参考代码:旧版 API 不支持 async/await 方式。

js 复制代码
const dom = document.getElementById("output");
dom?.focus();
window.getSelection()?.removeAllRanges();

const range = document.createRange();
if (dom && dom.firstChild && dom.lastChild) {
  range.setStartBefore(dom.firstChild);
  range.setEndAfter(dom.lastChild);
  window.getSelection()?.addRange(range);
  document.execCommand("copy");
  window.getSelection()?.removeAllRanges();
}

注意:一旦建立了 Range 对象,在使用它的大多数方法之前需要设置它的边界点。

拓展

由于新版 API 的使用必须处于安全上下文环境中,即只能用 https 或 localhost 进行访问。

读取剪贴版内容,浏览器会弹出权限框,让用户选择是否"允许读取剪贴版"。

相关推荐
2501_940041746 分钟前
前端工程化进阶:5个高交互与可视化项目提示词
前端
你很易烊千玺7 分钟前
JS 异步 从零讲(大白话 + 真实场景 + 可运行案例)
前端·javascript·vue.js
why技术2 小时前
AI Coding开始进入第四个时代,我还没上车呢!
前端·人工智能·后端
大家的林语冰3 小时前
CSS 已死?DOM 性能黑洞!Pretext 排版革命让你在文本间跳舞,没有 DOM 也能纵享丝滑~
前端·javascript·css
vipbic3 小时前
我也该升级了,陪伴了我7年的博客
前端
Lee川3 小时前
RAG 实战:从一篇掘金文章出发,拆解检索增强生成的全链路
前端·人工智能·后端
Lee川4 小时前
MCP 高德地图实战:当 AI 学会使用工具,一个协议如何重塑大模型的行动边界
前端·人工智能·后端
ZC跨境爬虫4 小时前
跟着 MDN 学CSS day_14:(尺寸调整技能测试与实战解析)
前端·css·ui·html·tensorflow
kyriewen4 小时前
用魔法打败魔法:我让AI替我去面试前端岗,AI面试官给我打了92分,还发了offer
前端·javascript·面试
IT_陈寒4 小时前
Redis批量删除踩了坑,原来DEL命令不是万能的
前端·人工智能·后端