通过 JavaScript 在浏览器中获取或设置剪贴板中的内容,常用于一键复制或使用网页油猴复制限制文本
使用 execCommand (已弃用)写入文本到剪贴板
document.onclick = function() { let text = 'hello world' let dom_input = document.createElement('input') dom_input.value = text document.body.appendChild(dom_input) dom_input.select() document.execCommand("Copy") dom_input.parentElement.removeChild(dom_input)}
注意
用户和页面要先有交互(点击行为)才能复制成功
使用 clipboard (标准推荐)
提示
使用 clipboard 只能获取剪贴板中的文字和图片,并且需要用户授权,某些操作需要有用户交互(点击行为)
从剪贴板读取文本
navigator.clipboard.readText().then((text) => { console.log(text)}, (error) => { console.log(error) })
从剪贴板读取文件
document.onclick = function() { navigator.clipboard.read().then((file_list) => { for(let item of file_list) { for(let file_type of item.types) { console.log('文件类型', file_type) item.getType(file_type).then(res => { if(['text/html', 'text/plain'].includes(file_type)) { res.text().then(text => { console.log(text) }, (error) => { console.log(error) }) } else { open(URL.createObjectURL(res)) } }, (error) => { console.log(error) }) } } }, (error) => { console.log(error) })}
写入文本到剪贴板
navigator.clipboard.writeText('hello world').then(function() { console.log('success')}, function(error) { console.log(error)} )
写入文件到剪贴板
let input = document.createElement('input')input.type = 'file'document.body.appendChild(input)input.onchange = function(ev) { let f = ev.target.files[0] let item = [ new ClipboardItem({ 'image/png': new Blob([f], {type: 'image/png'}) }) ] // 写入图片 let text = [ new ClipboardItem({ 'text/plain': new Blob(['hello world'], {type: 'text/plain'}) }) ] // 写入文本 navigator.clipboard.write(item).then(function() { console.log('success') }, function(error) { console.log(error) })}
注意
以上代码均在 Chrome 107.0.5304.88 测试通过,但不能保证其他浏览器也能用,其中 clipboard.write()
存在 bug 不建议使用。