JS 方法实现复制粘贴

背景

以前我们一涉及到复制粘贴功能,实现思路一般都是:

  • 创建一个 textarea 标签

  • 让这个 textarea 不可见(定位)

  • 给这个 textarea 赋值

  • 把这个 textarea 塞到页面中

  • 调用 textarea 的 select 方法

  • 调用 document.execCommand('copy')

  • 删除 textarea 标签

代码如下

javascript 复制代码
const legacyCopy = (value: string) => {
    const ta = document.createElement('textarea');
    ta.value = value ?? '';
    ta.style.position = 'absolute';
    ta.style.opacity = '0';
    document.body.appendChild(ta);
    ta.select();
    document.execCommand('copy');
    ta.remove();
  };

上面说的是以前的方式,前几天在看 vueuse 源码的时候,发现了一个复制粘贴的 api,是 navigation 上的 clipboard

writeText

navigation.clipboard.writeText 是一个异步方法,用来将特定的值复制起来,方便你去别的地方粘贴,具体的用法如下

html 复制代码
<body>
  <div>
    <button id="btn">复制</button>
    <input id="input" />
  </div>
  <script>
    const btn = document.getElementById('btn')
    const input = document.getElementById('input')
    let value = ''

    btn.onclick = async () => {
      await navigator.clipboard.writeText(value);
    }
    input.oninput = (e) => {
      value = e.target.value
    }
  </script>
</body>

就能实现复制,并且可以 ctrl + v 进行粘贴

readText

navigation.clipboard.writeText 是一个异步方法,用来粘贴你刚刚复制的值

html 复制代码
<body>
  <div>
    <button id="copy">复制</button>
    <input id="input" />
  </div>
  <div>
    <button id="paste">粘贴</button>
    <span id="span"></span>
  </div>
  <script>
    const copy = document.getElementById('copy')
    const paste = document.getElementById('paste')
    const input = document.getElementById('input')
    const span = document.getElementById('span')
    let value = ''

    copy.onclick = async () => {
      await navigator.clipboard.writeText(value);
    }
    paste.onclick = async () => {
      span.innerHTML = await navigator.clipboard.readText()
    }
    input.oninput = (e) => {
      value = e.target.value
    }
  </script>
</body>
相关推荐
getapi2 分钟前
Express 是一个基于 Node.js 的轻量级、灵活的 Web 应用框架,广泛用于构建后端服务和 API
前端·node.js·express
卿雪3 分钟前
认识Redis:Redis 是什么?好处?业务场景?和MySQL的区别?
服务器·开发语言·数据库·redis·mysql·缓存·golang
渣波4 分钟前
🧳 我的 React Trip 之旅(5):我的 AI 聊天机器人,今天又把用户气笑了
前端·javascript
..空空的人6 分钟前
C++基于protobuf实现仿RabbitMQ消息队列---接口介绍
开发语言·c++·rabbitmq
boombb7 分钟前
数据驱动与CSS预定义样式:实现灵活多变的Banner布局
前端
JIngJaneIL9 分钟前
基于Java失物招领系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·vue
鼎道开发者联盟10 分钟前
当界面会思考:AIGUI八要素驱动DingOS实现“感知-生成-进化“闭环
前端·人工智能·ai·gui
豐儀麟阁贵10 分钟前
9.3获取字符串信息
java·开发语言·前端·算法
kusedexingfu14 分钟前
如何理解python中的闭包
开发语言·python
苦夏木禾17 分钟前
使用css制作一个环形进度展示圈
前端·css