复制粘贴(二):操作剪贴板 navigator.clipboard

使用 navigator.clipboard 可以随时获取剪贴板对象(也就是说,在 copy/paste 事件外也可以用)

但是,此操作必须用户允许:

readText

readText() 获取剪贴板中的文本内容

html 复制代码
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>
  <body>
    <div>
      <p>文字<input type="button" value="按钮" /><span>hello</span></p>
    </div>
    <input type="button" value="查看剪切板文本" onclick="getClipboardText()" />
    <script>
      async function getClipboardText() {
        const text = await navigator.clipboard.readText();
        console.log(text);
      }
    </script>
  </body>
</html>

选择 div 中的全部内容,复制

点击"查看剪切板文本按钮",控制台输出:文字hello

read

read() 获取剪贴板内容

js 复制代码
async function getClipboard() {
  const clipboardItems = await navigator.clipboard.read();
  for (const clipboardItem of clipboardItems) {
    const types = clipboardItem.types;
    // console.log("types", types); // 输出 ['text/plain', 'text/html']
    for (const type of types) {
      const blob = await clipboardItem.getType(type);
      const blobText = await blob.text();
      console.log(type, blob, blobText);
    }
  }
}

输出结果:

上图的含义是:剪贴板中有两类数据:text/plain(纯文本) 、 text/html(文本格式存储的html)

纯文本数据内容是:文字hello

html 数据内容是:<span>文字</span><input type="button" value="按钮"/><span>hello</span>(省略style属性)

writeText

js 复制代码
async function setClipboard() {
  await navigator.clipboard.writeText("你好");
}
write
html 复制代码
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>
  <body>
    <!-- 粘贴到可编辑的div中,能直观的看到效果 -->
    <div contenteditable="true" style="height: 80px; background: #eee"></div>
    
    <input type="button" value="设置剪贴板" onclick="setClipboard()" />
    <script>
      async function setClipboard() {
        await navigator.clipboard.write([
          new ClipboardItem({
            "text/html": new Blob([`<span style="background:red">haha</span>`], {
              type: "text/html",
            }),
          }),
        ]);
      }
    </script>
  </body>
  </body>
</html>

为了方便演示效果,准备一个 contenteditable= true 的 div:

点击"设置剪贴板"按钮,然后粘贴到 div 中,结果:

相关推荐
ZC跨境爬虫4 小时前
跟着MDN学HTML_day_48:(Node接口)
前端·javascript·ui·html·音视频
kyriewen6 小时前
半夜三点线上崩了,AI替我背了锅——用AI排错,五分钟定位三年老bug
前端·javascript·ai编程
AI_paid_community8 小时前
98.5k Star!GitHub官方开源的这个工具,正在把"vibe coding"扫进历史的垃圾桶
javascript·claude
AI_paid_community8 小时前
用 Claude Code 写了一年代码,装了这 18 个 Skills 之后,我才知道自己一直在"氛围编程"
javascript·面试
隔壁老王11119 小时前
浅谈JavaScript内存管理
javascript
吹牛不交税9 小时前
tree-transfer-vue3 前端插件安装问题解决(--legacy-peer-deps)(其他插件可考虑)适用
前端·javascript·vue.js
Appoint_x9 小时前
设计稿自己会说话:我用 Claude 给 Figma 做了个 AI 上下文插件
前端·javascript
豹哥学前端9 小时前
浏览器console里的双中括号 `[[ ]]`
前端·javascript·ecmascript 6
你很易烊千玺10 小时前
JS 数组所有变态遍历・完整案例 + 场景 + 对比
javascript·数组