mobile browser clipboard

在业务中遇到需求需要复制内容,那么就需要访问操作系统的clipboard,但是其实浏览器对此做了限制,根本的原因在于如果浏览器的script能随意访问操作系统的clipboard,那么很多用户的个人数据和敏感数据就会泄露,因为脚本可以收集起来然后发送到远程的服务器上

security

但是现在,浏览器支持基本的clipboard功能,但是作出了一定的限制

  1. 大多数浏览器支持,但是Mac上的safari和IOS不支持
  2. Support varies across browsers无法跨浏览器提供完整的功能
  3. 必须由用户触发,click或者press keyboard事件,script不能随意的在任意事件使用clipboard

使用 document.execCommand('copy') API

实现复制的API是document.execCommand('copy'),在使用之前,我们一般需要判断浏览器支持不支持,主要有两个API来使用document.queryCommandSupported('copy')
document.queryCommandEnabled('copy')
,但是在Chrome中,第一个API返回true,第二个API返回false,所以更常用的方法是

try {
    document.execCommand('copy')
} catch(err) {
    // handle error
}

下一步,我们要怎样让用户去复制呢?我们首先需要高亮文本内容,可以使用HTMLInputElement.select(),即input和textarea的select()方法来高亮文本,然后再由用户的一个事件来触发document.execCommand('copy')

Chrome和FF支持使用range对象来复制任意节点,主要思路就是使用getSelection()API来高亮元素的内容,然后使用document.execCommand('copy')来复制

clipboard.js

比较成熟的跨浏览器方案是使用clipboard.js,提供的API可以复制input和textarea的内容,也可以复制元素自定义属性的内容

<button class="btn" data-clipboard-text="Just because you can doesn't mean you should — clipboard.js">
    Copy to clipboard
</button>

用户只要点击了就能复制data-clipboard-text中的内容

reference

How do I copy to the clipboard in JavaScript?
Copy to Clipboard that also works on Mobile?
这篇文章比较完整的解释了clipboard的历史和使用方法
Roll Your Own Copy to Clipboard Feature in 20 Lines of JavaScript

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,169评论 19 139
  • 设置通用设备管理信任
    FlyTheKite阅读 143评论 2 0
  • 春日里的雨滴滴答答下个不停,让人心燥又难受。每次打电话给你,心像被刀绞一样。好想替你分担,可我却无能为力,本要退休...
    小小Evan阅读 625评论 0 0
  • 该怎么相信自己的直觉?
    不二家beling阅读 261评论 0 0