20行JS代码实现粘贴板复制功能


Posted in Javascript onFebruary 06, 2018

使用剪贴板是一项基本技能。作为码农都应知道, Tab , Ctrl/Cmd + A , Ctrl / Cmd + C 以及 Ctrl / Cmd + V 分别是自动聚焦、复制、粘贴的快捷键。

而对普通用户可能就不太容易了。即使用户知道剪贴板是什么,(除了)那些眼神极好或反应很快的人,其他情况下很难以突出显示他们想要的确切文字。若用户不知道键盘快捷键,也看不到隐藏的编辑菜单,或从未使用右键菜单或不知道长按触屏弹出选项菜单,那么他很可能无法察觉到复制功能。

那么我们是否应该提供一个“复制到剪贴板”按钮来帮助用户?这功能应该会很有用,即使是对快捷键的人非常熟悉的用户来说。

关于剪贴板的安全

几年前,浏览器不可能直接使用剪贴板。开发人员不得不通过Flash来实现。

剪贴板看起来无关紧要,但想象一下,如果浏览器能够随意查看和操作内容,会发生什么。JS脚本(包括第三方脚本)能查看剪贴板内的文本信息,并将密码,敏感信息甚至整个文档发送到远程服务器。

现在的剪贴板基本功能有限,有如下限制:

  1. 大多数浏览器支持剪贴板,除了Safari。
  2. 支持因浏览器而异 ,有些功能不完整或有问题。
  3. 事件必须由用户必须发起,如点击鼠标或按下键盘。脚本不能自由访问剪贴板。

document.execCommand()

此方法就是实现剪贴板的关键,它可以传入 cut , copy , paste 三种参数。从最常用的 document.execCommand('copy') 开始介绍。

在使用之前,我们应该检查浏览器是否支持 copy 命令: document.queryCommandSupported('copy'); document.queryCommandEnabled('copy'); ,这两个方法效果相同。

但在Chrome下,尽管Chrome确实支持使用 copy 命名,但两个方法都返回 false 。所以最好是将检查代码包在一个 try-catch 代码块中。

下一步,我们应该允许用户复制什么呢?必须突出显示文本,所有浏览器都可用 select() 方法选择文本input和textarea内的文本。同时Firefox和Chrome / Opera也支持 document.createRange 方法,该方法允许从任何元素中选择文本,如下:

// select text in #myelement node
  var
   myelement = document.getElementById('#myelement'),
   range = document.createRange();
  range.selectNode(myelement);
  window.getSelection().addRange(range);

但IE / Edge不支持。

clipboard.js

若你不想自己实现一个较为健壮的跨浏览器剪贴板方法的话, clipboard.js 可以帮你。它有好几种设置选项的方式,如H5的data属性,设置绑定触发元素以及目标元素,如:

<input id="copyme" value="text in this field will be copied" />
<button data-clipboard-target="#copyme">copy</button>

自己动手实现

clipboard.js大小仅2Kb,若仅实现如下的部分功能的话,那么可以在20行的代码内实现:

仅部分表单元素可被复制

若在不支持的浏览器中(没错,就是指Safari),可突出显示选中文本,并提示用户按 Ctrl / Cmd + C 。

像clipboard.js一样,先创建一个button用于触发方法,它具有一个data属性 data-copytarget ,指向要copy的元素(即 #website )

<input type="text" id="website" value="http://www.sitepoint.com/" />
<button data-copytarget="#website">copy</button>
一个立即执行函数表达式绑定click事件的函数,该函数用于解析 data-copytarget 属性内容,选择对应字段的文本并执行 document.execCommand('copy') ,。若失败,文本保持选中状态,显示提示框:
(function() {
 'use strict';
 // click events
 document.body.addEventListener('click', copy, true);
 // event handler
 function copy(e) {
  // find target element
  var
   t = e.target,
   c = t.dataset.copytarget,
   inp = (c ? document.querySelector(c) : null);
  // is element selectable?
  if (inp && inp.select) {
   // select text
   inp.select();
   try {
    // copy text
    document.execCommand('copy');
    inp.blur();
   }
   catch (err) {
    alert('please press Ctrl/Cmd+C to copy');
   }
  }
 }
})();

示例

虽然在上例中,算上样式和动画的代码,代码已经超过20行了,但动画和样式是可选的。

总结:

  1. 通过 .select() 选择要复制的表单元素的内容
  2. 调用 document.execCommand("copy") 方法
  3. 调用 .blur() 方法,从表单元素中移除焦点
  4. 将第2、3步包在 try catch 块中,在不支持的浏览器下则提示

其他方式

有很多新颖的剪贴板应用方式。例如 Trello.com ,将鼠标悬停在卡片上时,可以按 Ctrl / Cmd + C 并将该卡片的链接地址复制到剪贴板。其背后实现的方式为:先创建一个包含URL的隐藏表单元素,然后选中并复制其内容。非常巧妙且实用 —— 我怀疑很少有用户知道这个功能!

总结

以上所述是小编给大家介绍的20行JS代码实现粘贴板复制功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
删除select中所有option选项jquery代码
Aug 12 Javascript
js阻止默认事件与js阻止事件冒泡示例分享 js阻止冒泡事件
Jan 27 Javascript
在AngularJS中使用AJAX的方法
Jun 17 Javascript
js实现select选择框效果及美化
Aug 19 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
Dec 27 Javascript
vue项目打包部署_nginx代理访问方法详解
Sep 20 Javascript
关于layui导航栏不展示下拉列表的解决方法
Sep 25 Javascript
element实现合并单元格通用方法
Nov 13 Javascript
js+canvas实现纸牌游戏
Mar 16 Javascript
JS中队列和双端队列实现及应用详解
Sep 29 Javascript
VueCli生产环境打包部署跨域失败的解决
Nov 13 Javascript
关于对TypeScript泛型参数的默认值理解
Jul 15 Javascript
JS中offset和匀速动画详解
Feb 06 #Javascript
Bootstrap实现的表格合并单元格示例
Feb 06 #Javascript
JavaScript实现获取select下拉框中第一个值的方法
Feb 06 #Javascript
AngularJS实时获取并显示密码的方法
Feb 06 #Javascript
详解使用React进行组件库开发
Feb 06 #Javascript
fullpage.js最后一屏滚动方式
Feb 06 #Javascript
解决npm安装Electron缓慢网络超时导致失败的问题
Feb 06 #Javascript
You might like
用PHP查询搜索引擎排名位置的代码
2010/01/05 PHP
for循环连续求和、九九乘法表代码
2012/02/20 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
PHP strip_tags保留多个HTML标签的方法
2016/05/22 PHP
php简单压缩css样式示例
2016/09/22 PHP
做网页的一些技巧
2007/02/01 Javascript
用 Javascript 验证表单(form)中多选框(checkbox)值
2009/09/08 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
2015/04/06 Javascript
nodejs实现遍历文件夹并统计文件大小
2015/05/28 NodeJs
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
Jquery轮播效果实现过程解析
2016/03/30 Javascript
jQuery页面加载初始化的3种方法(推荐)
2016/06/02 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
AngularJS基础 ng-keyup 指令简单示例
2016/08/02 Javascript
微信小程序 开发之顶部导航栏实例代码
2017/02/23 Javascript
angular过滤器实现排序功能
2017/06/27 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
浅谈Postman解决token传参的问题
2018/03/31 Javascript
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
[45:32]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
加拿大高尔夫超市:Golf Town
2018/01/12 全球购物
Java程序员常见面试题
2015/07/16 面试题
毕业生在校学习的自我评价分享
2013/10/08 职场文书
成品仓管员工作职责
2013/12/29 职场文书
总经理岗位职责范本
2014/02/02 职场文书
2016年情人节问候语
2015/11/11 职场文书
高中美术教学反思
2016/02/17 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js
SQL写法--行行比较
2021/08/23 SQL Server
python和C/C++混合编程之使用ctypes调用 C/C++的dll
2022/04/29 Python