背景
以前我们一涉及到复制粘贴功能,实现思路一般都是:
-
创建一个 textarea 标签
-
让这个 textarea 不可见(定位)
-
给这个 textarea 赋值
-
把这个 textarea 塞到页面中
-
调用 textarea 的 select 方法
-
调用 document.execCommand('copy')
-
删除 textarea 标签
代码如下
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();
};
navigation.clipboard
上面说的是以前的方式,前几天在看 vueuse 源码的时候,发现了一个复制粘贴的 api,是 navigation 上的 clipboard
writeText
navigation.clipboard.writeText 是一个异步方法,用来将特定的值复制起来,方便你去别的地方粘贴,具体的用法如下
<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 是一个异步方法,用来粘贴你刚刚复制的值
<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>