如何用20行JS代码实现粘贴板功能

开发 前端
使用剪贴板是一项基本技能。作为码农都应知道,Tab,Ctrl/Cmd + A,Ctrl / Cmd + C以及Ctrl / Cmd + V分别是自动聚焦、复制、粘贴的快捷键。而对普通用户可能就不太容易了。那么我们是否应该提供一个“复制到剪贴板”按钮来帮助用户?这功能应该会很有用,即使是对快捷键的人非常熟悉的用户来说。

[[219976]]

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

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

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

关于剪贴板的安全

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

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

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

1.大多数浏览器支持剪贴板,除了Safari。(译注,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方法,该方法允许从任何元素中选择文本,如下:

 

  1. // select text in #myelement node 
  2. var 
  3.   myelement = document.getElementById('#myelement'), 
  4.   range = document.createRange(); 
  5.  
  6. range.selectNode(myelement); 
  7. window.getSelection().addRange(range); 

但IE / Edge不支持。

clipboard.js

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

 

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

 

自己动手实现

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

1.仅部分表单元素可被复制

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

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

 

  1. <input type="text" id="website" value="http://www.sitepoint.com/" /> 
  2.  
  3. <button data-copytarget="#website">copy</button> 

 

一个立即执行函数表达式绑定click事件的函数,该函数用于解析data-copytarget属性内容,选择对应字段的文本并执行document.execCommand('copy')。若失败,文本保持选中状态,显示提示框:

 

  1. (function() {  
  2.  'use strict' 
  3.  // click events  
  4.  document.body.addEventListener('click', copy, true);  
  5.  // event handler  
  6.  function copy(e) {  
  7.    // find target element  
  8.    var  
  9.      t = e.target,  
  10.      c = t.dataset.copytarget,  
  11.      inp = (c ? document.querySelector(c) : null);  
  12.    // is element selectable?  
  13.    if (inp && inp.select) {  
  14.      // select text  
  15.      inp.select();  
  16.      try {  
  17.        // copy text  
  18.        document.execCommand('copy');  
  19.        inp.blur();  
  20.      }  
  21.      catch (err) {  
  22.        alert('please press Ctrl/Cmd+C to copy');  
  23.      }  
  24.    }  
  25.  }  
  26. })(); 

示例

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

总结:

1.通过.select()选择要复制的表单元素的内容

2.调用document.execCommand("copy")方法

3.调用.blur()方法,从表单元素中移除焦点

4.将第2、3步包在try catch块中,在不支持的浏览器下则提示

其他方式

 

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

责任编辑:庞桂玉 来源: 程序人生
相关推荐

2021-12-02 10:11:44

鸿蒙HarmonyOS应用

2023-02-06 07:17:22

2022-03-26 22:28:06

加密通信Python

2020-02-28 15:33:12

代码人工智能检测

2015-08-10 11:09:09

Python代码Python

2020-04-10 12:25:28

Python爬虫代码

2015-09-21 09:36:54

20 亿代码谷歌

2015-09-18 11:47:45

代码Google管理

2018-06-19 08:35:51

情感分析数据集代码

2011-07-22 13:22:10

Java.NETDataTable

2021-12-16 06:21:16

React组件前端

2021-03-02 10:57:39

二叉树二叉堆节点

2009-06-16 10:44:50

JS代码折叠Visual Stud

2022-03-14 09:57:30

Python代码

2020-07-20 09:20:48

代码geventPython

2020-04-02 15:39:51

代码编译器前端

2022-07-07 15:50:19

Python开发功能

2021-06-18 10:12:09

JS代码前端

2022-03-21 10:13:09

sftp 服务器参数配置

2020-09-23 14:29:28

代码算法Tarjan
点赞
收藏

51CTO技术栈公众号