首页 > 其他分享 >【日常记录】【JS】Clipboard API 剪切板API

【日常记录】【JS】Clipboard API 剪切板API

时间:2024-03-26 17:33:11浏览次数:39  
标签:JS write API Clipboard 复制 剪切板 document data

文章目录

1、Clipboard API

Clipboard 接口实现了 Clipboard API,如果用户授予了相应的权限,其就能提供系统剪贴板的读写访问能力。在 Web 应用程序中,Clipboard API 可用于实现剪切、复制和粘贴功能。

所有 Clipboard API 的方法都是异步的;它们返回一个 Promise 对象,在剪贴板访问完成后被兑现。如果剪贴板访问被拒绝,promise 也会被拒绝。

在js 上, navigator.clipboard

  1. 谷歌浏览器规定,只有 HTTPS 协议的页面才能使用这个 API。不过,开发环境(localhost)允许使用非加密协议。
  2. 读取剪切板的时候,会有一个弹框,只有允许了,才可以读取
    在这里插入图片描述

2、方法

2.1 read

理论上,该方法可以返回任意数据(与 readText() 不同,readText() 只能返回文本)。 浏览器通常支持读取文本、HTML 和 PNG 图像数据 — 有关详细信息,请参阅浏览器兼容性。

经过测试,只读读取剪切板的第一条内容

  • 返回值:promise
navigator.clipboard.read()

2.2 readText

这个方法只能读取剪切板的文本内容

  • 返回值:promise
const destination = document.getElementById("outbox");
destinationImage.addEventListener("click", () => {
  navigator.clipboard
    .readText()
    .then((clipText) => {
		// 内容
	});
});

2.3 write

Clipboard 接口的 write() 方法将任意数据(如图像)写入剪贴板,完成后完成返回的 Promise。 这可用于实现剪切和复制功能。
该方法理论上可以写入任意数据(与 writeText() 不同,writeText() 只能写入文本)。 浏览器通常支持写入文本、HTML 和 PNG 图像数据 — 有关详细信息,请参阅浏览器兼容性。

实际测试了一下,只有png 支持度最好

// Get canvas can add an event handler for the click event.
const canvas = document.getElementById("canvas");
canvas.addEventListener("click", copyCanvasContentsToClipboard());

async function copyCanvasContentsToClipboard() {
  // Copy canvas to blob
  const blob = await canvas.toBlob();
  // Create ClipboardItem with blob and it's type, and add to an array
  const data = [new ClipboardItem({ [blob.type]: blob })];
  // Write the data to the clipboard
  await navigator.clipboard.write(data);
}

2.4 writeText

剪贴板接口的 writeText() 方法将指定的文本写入系统剪贴板,返回一个 Promise,该 Promise 在系统剪贴板更新后解析。

3、阻止用户复制内容

在这里插入图片描述

右击选择,复制 或者 按键盘的 ctrl+c 都能触发这个事件

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <div class="div1">
    <h3>禁止复制</h3>
    <span>
      Lorem ipsum dolor sit amet consectetur adipisicing elit. Esse, nostrum provident qui quis eveniet, voluptatum
      porro
      expedita labore ex quasi numquam eligendi iusto animi deleniti quod obcaecati id cupiditate sint!
    </span>
  </div>
  <hr>
  <script>
    document.addEventListener('copy', function (e) {
      e.preventDefault() // 阻止默认行为,就是阻止用户复制
      console.log('正在复制~~~');
      // alert('禁止复制')
      navigator.clipboard.writeText('禁止复制!!!!')
    })
  </script>
</body>

</html>

在这里插入图片描述

4、在复制的文字后面追加内容

类似于 csdn、掘金,复制别人文章的内容后,后面追加了 一些内容

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <input type="text">
  <button>复制</button>
  <script>
    let inputEle = document.querySelector('input')
    let btnEle = document.querySelector('button')
    btnEle.onclick = function (e) {
      navigator.clipboard.writeText(inputEle.value + '\n呆呆狗编写,交钱了吗,让你复制了吗')

    }
  </script>
</body>

</html>

5、读取剪切板内容

准备一张图
在这里插入图片描述
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    navigator.clipboard.read()
      .then(data => {
        data.forEach(clipboardItem => {
          console.log('剪贴板数据:', clipboardItem);
          clipboardItem.types.forEach(type => {
            clipboardItem.getType(type).then(async data => {
              console.log('遍历当前项数据', data);
              if (type == "text/plain") {
                // 文本
                let spanEl = document.createElement('span');
                spanEl.innerText = await data.text();
                document.body.appendChild(spanEl);
              } else if (type == "image/png") {
                let imgEl = document.createElement('img');
                imgEl.src = URL.createObjectURL(data);
                document.body.appendChild(imgEl);
              } else if (type == "text/html") {
                let spanEl = document.createElement('span');
                spanEl.innerHTML = await data.text();
                document.body.appendChild(spanEl);
              }
            });
          });
        });
      })
      .catch(err => {
        console.error('无法读取剪贴板内容:', err);
      });
  </script>
</body>

</html>

6、让图片插入到剪切板

浏览器支持png,其他的不支持

这个是png的图片
在这里插入图片描述
现在的剪切板是空的
在这里插入图片描述

执行下面代码后,插入成功了
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <button>让图片插入倒剪切板</button>
  <script src="https://cdn.bootcdn.net/ajax/libs/axios/1.5.0/axios.js"></script>
  <script>
    let btnEl = document.querySelector('button')
    btnEl.addEventListener('click', function () {
      axios({
        // url: '//resource.teld.cc/teldimage/142/fdb66c6e900e420795bfc2e8a07ba071.png',
        url: '//resource.teld.cc/teldimage/142/60602b3255ec4a809beebc75a7743f43.png',
        // url: '//resource.teld.cc/teldimage/142/7481cc7f72d94dd6a1bff1312ca66ca9.gif', // Failed to execute 'write' on 'Clipboard': Type image/gif not supported on write.
        // url: '//resource.teld.cc/teldimage/142/7f3df4a214f94b2099a41ba249048c8e.jpg',// DOMException: Failed to execute 'write' on 'Clipboard': Type image/jpeg not supported on write.
        // url: '//resource.teld.cc/telddoc/142/7bacb70e6d184509a7df1a5a7e76305d.pdf',// PDF 格式不支持写入。DOMException: Failed to execute 'write' on 'Clipboard': Type application/pdf not supported on write.
        responseType: "blob"
      })
        .then(res => {
          console.log(res.data);
          navigator.clipboard.write([new ClipboardItem({
            // 'image/png': res.data
            [res.data.type]: res.data
          })]).then(res => {
            console.log('写入成功', res);
          })
        })
    })
  </script>
</body>

</html>

标签:JS,write,API,Clipboard,复制,剪切板,document,data
From: https://blog.csdn.net/qq_45634593/article/details/137035550

相关文章

  • js/jquery:5行代码实现点击按钮复制文字到剪贴板
     方法1:<pid="p1">Hello,I'mTEXT1</p><buttononclick="copyToClipboard_js('p1')">复制文字1(js)</button><script>functioncopyToClipboard_js(element){vartemp=document.createElement(&quo......
  • .NET6 Minimal API 集成Autofac
    前提集成Autofac前需要先添加两个依赖包可以通过NuGet进行安装,使用以下命令:dotnetaddpackageAutofacdotnetaddpackageAutofac.Extensions.DependencyInjection集成Autofac在不使用MinimalAPI之前我们集成Autofac大概如下:在Program.cs文件中publicstaticclas......
  • js 非常好用且优雅的步骤校验、提交校验、自定义校验写法
    很多form表单和其它场景,在提交前或进入下一步前需要校验逻辑,这里总结了一个通用方法: constform={name:'',age:20,time:['2100-01-01','2100-01-01']}constvalidForm=()=>{//校验状态总结let......
  • 37.html+css+js网页设计实例/“音乐”酒吧主题介绍/web前端期末大作业/
    一、前言本实例以“音乐”酒吧为主题设计,响应式web,应用html+css+js,包括图片轮翻效果、视频、音频、留言板等,供大家参考。【关注作者|获取更多源码(2000+个Web案例源码)|优质文章】;您的支持是我创作的动力!看到这里就【点赞收藏博文】,Web开发、课程设计、毕业设计有兴趣的联系我交......
  • js使用正则从字符串中取出img标签
    要使用正则表达式从字符串中提取<img>标签,您可以使用以下代码:conststr=`Sometext<imgsrc="image.jpg"alt="Image">andmoretext<imgsrc="another.png"alt="Another">`;constregex=/<img[^>]*>/g;constimgTags......
  • 【附源码】Node.js毕业设计个人健康信息记录移动应用app(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着科技的进步和互联网的普及,移动应用已经成为人们日常生活中不可或缺的一部分。在健康管理领域,个人健康信息记录移动应用APP的开发和应用也日益受到关注......
  • 【附源码】Node.js毕业设计个人健康管理小助手(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着社会节奏的加快和工作压力的增大,个人健康管理成为了人们日益关注的焦点。传统的健康管理方式往往需要用户手动记录健康数据,如饮食、运动、睡眠等,然后进......
  • 【附源码】Node.js毕业设计个人财务管理系统(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在当今社会,随着经济的快速发展和人们生活水平的提高,个人财务管理已经成为了我们生活中不可或缺的一部分。无论是日常生活的消费记录、投资理财,还是购房、购......
  • ISBN信息查询api接口
     基本说明:接口地址:http://data.isbn.work/openApi/getInfoByIsbn?isbn={isbn}&appKey={appkey}返回格式:json请求方式:get请求示例:http://data.isbn.work/openApi/getInfoByIsbn?isbn=9787513159074&appKey=ae1718d4587744b0b79f940fbef69e77伽薇 809137232请求参数说明:名......
  • 代码随想录算法训练营第二十七天|●39. 组合总和 ● 40.组合总和II ● 131.分割回文串
    39组合总和题目链接/文章讲解:https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html视频讲解:https://www.bilibili.com/video/BV1KT4y1M7HJ一开始自己写的大概和答案差不多,但是弄不明白回溯要传递的参数,但是自己一开始想到了终止条件,如果>7了就......