Js实现粘贴板中写入text

简介: 很久不写前端代码了,最近整一个chrome插件时,希望将数据保存到粘贴版,试了好几种方式,结果发现都不太好使,直接基于输入框来实现赋值粘贴可行,若直接往粘贴板中写数据却没试出来;作为一个前端菜鸟就只能猥琐一点的实现了

很久不写前端代码了,最近整一个chrome插件时,希望将数据保存到粘贴版,试了好几种方式,结果发现都不太好使,直接基于输入框来实现赋值粘贴可行,若直接往粘贴板中写数据却没试出来;作为一个前端菜鸟就只能猥琐一点的实现了


下面是一个JS实现向粘贴板中写文本的方式


/**
 * 写入粘贴板
 */
function toCopy(text) {
    // 将传进来的参数强转为字符串
    text = String(text);
    input = document.createElement('INPUT');
    input.style.opacity  = 0;
    input.style.position = 'absolute';
    input.style.left = '-9999px';
    document.body.appendChild(input);
    input.value = text;
    input.select();
    input.setSelectionRange(0, text.length);
    document.execCommand('copy');
    document.body.removeChild(input);
}
复制代码


从上面的实现可以了解其基本思路:


  • 创建一个不可见的input
  • 然后将text复制到这个input
  • 然后利用document.execCommand来实现拷贝功能
  • 最后移除这个input


注意事项



www.zhangxinxu.com/wordpress/2…


上面这种方法虽说支持了粘贴板写文本的基本诉求,但同时也存在一些问题

性能隐患


日常开发,我们需要复制的内容一般是一段口令,一个链接,内容信息并不大,使用 execCommand() 方法完全没问题,是无感知的。


但是,如果需要复制的是非常大段的内容,则 execCommand() 方法可能会引起卡顿,因为 execCommand() 方法是一个同步方法,必须等复制操作结束,才能继续执行后面的代码。


无法修改复制内容


这个缺点主要针对的是输入框的部分内容复制到粘贴板,但是因为上面的方法实际上是拷贝我们需要的文本内容,所以就不存在这个问题


浏览器兼容


下面是不同的浏览器的兼容场景,在实际使用时也需要注意

image.png


2.Clipboard API



接下来是另外的一种方式,非常简单的一行就可以实现基本诉求


if (navigator.clipboard) {
    navigator.clipboard.writeText(text);
}
复制代码


需要注意的是,上面这个case,直接调用的时候,会提示Document is not focused.,详情可以参考

stackoverflow.com/questions/5…


3. 整合



接下来将上面两个代码封装一下,实现一个文字复制到找剪切板

function toCopy(text) {
    if (navigator.clipboard) {
        navigator.clipboard.writeText(text);
        return;
    }
    // 将传进来的参数强转为字符串
    text = String(text);
    input = document.createElement('INPUT');
    input.style.opacity  = 0;
    input.style.position = 'absolute';
    input.style.left = '-9999px';
    document.body.appendChild(input);
    input.value = text;
    input.select();
    input.setSelectionRange(0, text.length);
    document.execCommand('copy');
    document.body.removeChild(input);
}



相关文章
|
1月前
|
JSON 前端开发 JavaScript
JS前端读取本地上传的File文件对象内容(包括Base64、text、JSON、Blob、ArrayBuffer等类型文件)
JS前端读取本地上传的File文件对象内容(包括Base64、text、JSON、Blob、ArrayBuffer等类型文件)
|
JavaScript 算法 前端开发
【前端算法】JS实现数字千分位格式化
JS实现数字千分位格式化的几种思路,以及它们之间的性能比较
293 1
|
存储 前端开发 算法
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
139 0
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
|
存储 机器学习/深度学习 JavaScript
JS 你最少用几行代码实现深拷贝?
JS 你最少用几行代码实现深拷贝?
JS 你最少用几行代码实现深拷贝?
|
JavaScript 前端开发 算法
JavaScript实现一段时间之后关闭广告
简介:通过JavaScript实现在一段时间之后,广告消失。
101 0
JavaScript实现一段时间之后关闭广告
|
JavaScript 前端开发 算法
JS实现鼠标悬停变色
本文实现的是利用JS实现当鼠标悬停在表格上的时候,表格发生变色。 CSS渲染 JS逻辑 `
183 0
JS实现鼠标悬停变色
|
JavaScript 前端开发 数据安全/隐私保护
JS实现关闭图片窗口
通过事件的绑定来实现,关闭二维码的效果。
132 0
JS实现关闭图片窗口
|
前端开发 JavaScript Windows
js实现body背景图自动扩缩 光靠css几乎无法实现这样的效果
js实现body背景图自动扩缩 光靠css几乎无法实现这样的效果
165 0
js实现body背景图自动扩缩 光靠css几乎无法实现这样的效果
|
存储 JavaScript
js实现多选、全选、反选、取消选择(篇一)
js实现多选、全选、反选、取消选择(篇一)
351 0
js实现多选、全选、反选、取消选择(篇一)
|
JavaScript 前端开发
利用JavaScript实现二级联动
利用JavaScript实现二级联动 要实现JavaScript二级联动效果,首先要确定需要哪些技术: 二维数组 for in循环 new Option(text,value,true,true) add(option,null) onchange() 表单事件 HTML代码: <!-- <input type="text" id="text"> --> 请选择省份: <select name="" id="provinces"> <!-- <option value="江苏省">江苏省</option>