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 相关文章推荐
JavaScript 组件之旅(四):测试 JavaScript 组件
Oct 28 Javascript
JavaScript 继承机制的实现(待续)
May 18 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
Nov 08 Javascript
jQuery判断元素上是否绑定了指定事件的方法
Mar 17 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
Jun 27 Javascript
webpack教程之webpack.config.js配置文件
Jul 05 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
Jan 18 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
Jan 20 Javascript
微信小程序左滑删除功能开发案例详解
Nov 12 Javascript
webpack优化的深入理解
Dec 10 Javascript
微信小程序视图控件与bindtap之间的问题的解决
Apr 08 Javascript
H5+css3+js搭建带验证码的登录页面
Oct 11 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
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
php 在字符串指定位置插入新字符的简单实现
2016/06/28 PHP
php 生成签名及验证签名详解
2016/10/26 PHP
共享自己写一个框架DreamScript
2007/01/20 Javascript
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
jquery实现tr元素的上下移动示例代码
2013/12/20 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
2019/07/04 Javascript
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
django接入新浪微博OAuth的方法
2015/06/29 Python
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
在Python 中同一个类两个函数间变量的调用方法
2019/01/31 Python
python递归法实现简易连连看小游戏
2020/03/25 Python
pytest中文文档之编写断言
2019/09/12 Python
TensorFlow——Checkpoint为模型添加检查点的实例
2020/01/21 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
通过CSS3的object-fit来调整图片适配尺寸的技巧简介
2016/02/27 HTML / CSS
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
自荐信结尾
2013/10/27 职场文书
劳动之星获奖感言
2014/02/01 职场文书
原材料检验岗位职责
2014/03/15 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
群众路线教师自我剖析材料
2014/09/29 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书
Python机器学习算法之决策树算法的实现与优缺点
2021/05/13 Python
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle
CSS中使用grid布局实现一套模板多种布局
2022/07/15 HTML / CSS