在任何给定的网页上复制一段文本(例如段落,代码段或URL)并不罕见。 为此,用户首先必须选择文本,然后使用浏览器中的菜单(上下文菜单)或键盘快捷键来复制所选内容。

但是,就UX而言,如果它可能经常发生,我们可以简化该过程。 例如,在Github中,有一个按钮可以复制存储库URL。

在Bit.ly中,您会找到类似的内容来复制短URL。 对于用户而言,此按钮确实非常方便,可以复制明确要复制的内容。

由于浏览器的限制,添加此类功能曾经是一个真正的麻烦。 大多数开发人员不得不求助于依赖Flash的库,例如Clippy 。 幸运的是,现在我们有了一个JavaScript库,使我们可以更轻松地实现它。 它称为Clipboard.js ,在本入门教程中,我将教您如何有效地部署它。

安装

要将Clipboard.js安装到您的Web项目中,请下载文件,将其放在网站目录中的适当文件夹中,然后将其链接到文档中。 或者,我们可以从CDN中的托管文件加载它,因此将其添加到HTML页面的底部:

<script src="//cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.4.0/clipboard.min.js"></script>

现在,我们在文档中需要两个元素。 首先是保存我们要复制内容的目标 。 目标元素可以是例如包含短URL的input (具有ID):

<input id="post-shortlink" value="https://ac.me/qmE_jpnYXFo">

第二个要素是触发器 。 在我们的例子中,这个元素是一个按钮。 触发器元素必须使用数据属性 data-clipboard-target ,其值通过其ID指向目标元素:

<button class="button" id="copy-button" data-clipboard-target="#post-shortlink">Copy</button>

这些元素放置到位后,通过在脚本标签中或单独JavaScript文件中添加Clipboard.js来打开它:

(function(){
new Clipboard('#copy-button');
})();

答对了! 现在,通过单击按钮,我们应该能够在输入元素中复制缩短的URL。

进阶

在一些情况下,添加的ID,类和data-*属性到目标   我们内容的元素是不可行的-处理大量旧内容以及多个目标元素时可能会发生这种情况。

举例来说,假设我们有一个网站,其内容包括段落和许多代码片段。 我们将使用PrismJS ,这是一个很棒的库,用于以正确突出显示的语法显示代码。 PrismJS不带有“ copy”实用程序,因此我们决定使用Clipboard.js来实现。 但是,问题是,我们在我们的网站上有数百页的内容。

这就是Clipboard.js API发挥作用的地方。

研究API

Clipboard.js呈现了两个事件, success事件和error事件,它们分别使我们能够确定它是有效复制了内容还是失败了。 该error可能会在Safari中发生,因为它不支持复制/剪切   Clipboard.js所依赖的execCommand方法中的命令。

此外,这些事件还返回以下属性:

  • action :返回我们针对目标元素的动作。 这将返回copycut
  • text :仅在success事件后返回。 它返回已从目标元素复制或剪切的文本。
  • trigger :返回触发copycut动作的元素。

这些API使我们能够将Clipboard.js实现到我们的内容中,而无需直接修改其包装元素。 在我们的案例中,我们可以使用它们将“复制”实用程序添加到旧内容中的代码段中。

Clipboard.js + PrismJS

至此,我们应该已经安装了PrismJS(将文件下载到您的项目文件夹中,在文档中引用JavaScript)。 在我们的页面标记中,每个代码段都包装在precode元素中,并带有language-{name}类名。 在此示例中,我们使用的是LESS代码,因此我们将其添加了class language-less类,如下所示:

<pre>
<code class="language-less">@bg: transparent;
.element {
& when not (@bg = transaprent) {
background: @bg;
}
}</code>
</pre>

添加复制按钮

现在,我们必须在每个pre元素中包含一个按钮,以复制相应的代码。 首先,我们使用getElementsByTagName方法选择内容,以获取内容中的所有pre标签。

var pre = document.getElementsByTagName('pre');

我们最有可能有两个或两个以上pre内容中的标签,所以我们通过每一个需要循环pre ,我们已经选择。

for (var i = 0; i < pre.length; i++) {
}

for循环中,添加以下行以包含按钮。

for (var i = 0; i < pre.length; i++) {
var isLanguage = pre[i].children[0].className.indexOf('language-');
if ( isLanguage === 0 ) {
var button           = document.createElement('button');
button.className = 'copy-button';
button.textContent = 'Copy';
pre[i].appendChild(button);
}
}

让我们回顾一下代码。 我们首先验证是否有一个添加了language-前缀类的code元素。 如果不是这种情况,我们将不包含该按钮。

因此,我们将按钮添加到pre元素中。 每个按钮都设置有一个类, copy-button和“复制”文本,如下所示:

<pre>
<code class="language-less">@bg: transparent;
.element {
&amp; when not (@bg = transparent) {
background: @bg;
}
}</code>
<button class="copy-button">Copy</button>
</pre>

现在,它应该在每个代码段中都可见:

运行剪贴板

现在我们运行Clipboard,因此每个按钮都通过将目标元素设置为相对于触发器.copy-button的上一个元素来复制代码。 在我们的例子中,该元素是code

var copyCode = new Clipboard('.copy-button', {
target: function(trigger) {
return trigger.previousElementSibling;
}
});

现在,我们可以使用按钮了。 单击按钮时,它应该复制代码段。 但是,让我们通过使用自定义事件来走得更远。

使用自定义事件

让我们想象一下,我们希望使用户的复制体验更具交互性。 当用户单击按钮并成功复制代码后,我们希望将按钮文本从“复制”更改为“已复制”。 为此,添加以下内容:

copyCode.on('success', function(event) {
event.clearSelection();
event.trigger.textContent = 'Copied';
window.setTimeout(function() {
event.trigger.textContent = 'Copy';
}, 2000);
});

上面的代码执行三件事:

  • 首先,我们使用剪贴板中的clearSelection()实用程序功能清除复制内容区域内的选择。 添加此项是可选的。
  • 然后我们将内容设置为“复制”
  • 最后,我们在两秒钟后将其恢复为“复制”。

在不支持execCommand的错误情况下(例如在Safari中,在撰写本文时),我们将按钮文本更改为“按“ Ctrl + C”进行复制” 。 添加以下代码:

copyCode.on('error', function(event) {
event.trigger.textContent = 'Press "Ctrl + C" to copy';
window.setTimeout(function() {
event.trigger.textContent = 'Copy';
}, 2000);
});

而已! 现在,我们有一个功能齐全的交互式复制按钮。 我们剩下的任务是为按钮设置样式,但我将完全由您自己决定。

结语

Clipboard.js是一个方便JavaScript库,它使将复制实用程序添加到网页的复杂性大大降低。 在本教程中,我们研究了基础知识,然后研究了一些高级知识,包括公开的API和自定义事件。

Clipboard.js依赖于Selection和execCommand,因此它只能在支持以下两种方法的浏览器中运行:Chrome 42,Firefox 41,Internet Explorer 9和Opera9。如上所述,Safari用户很不走运。

最后,希望您喜欢本教程,并且不要忘记该演示 。

翻译自: https://webdesign.tutsplus.com/tutorials/copy-to-clipboard-made-easy-with-clipboardjs--cms-25086

使用Clipboard.js轻松实现“复制到剪贴板”相关推荐

  1. js实现粘贴板js插件clipboard.js实现一键复制粘贴功能

    js实现粘贴板js插件clipboard.js实现一键复制粘贴功能 简介 下载 引入插件 使用 一个节点的复制 多个节点的复制 剪切文本框 复制输入框 简介 clipboard.js 提供了一种更好. ...

  2. Clipboard.js:不用Flash实现剪贴板功能的轻量级JavaScript库

    Zeno Rocha发布了一个专门用于从web页面向本地计算机的剪贴板复制文本的JavaScript库:Clipboard.js. \\ 在每一个Github仓库页面的侧边栏上都有一个小部件,用来显示 ...

  3. html5 复制到剪贴板 兼容,js/jQuery实现复制到剪贴板功能,兼容所有浏览器

    因为工作的原因,需要实现这样一个功能:点击按钮,复制文本内容. 百度了一下,大都语焉不详,最终找到了一篇很好的博文,有讲解,有实例,捣鼓了一会,最终实现了功能. 网址在这里http://www.cnb ...

  4. js 一键复制html,js插件clipBoard.js实现一键复制

    clipboard.js不需要jquery依赖,也不需要flash的支持,而另一个插件zClip需要依赖于flash,clipboard.js显得更加灵活. 引入clipboard.js 使用方法va ...

  5. 在vue移动端项目中,配合clipboard.js插件,复制一段密令(类似淘宝支付宝口令)的文本到剪切板...

    需求 开发过程中遇到的需求需要复制 请求过来的一段密令(类似支付宝淘宝口令)到剪切板. pc端的文本复制到剪切板 如果是在pc端的话,可以直接使用原生js进行编写,代码如下: <textarea ...

  6. clipboard.js,点击复制到系统剪切板,适合移动端、PC端复制

    官网地址:https://clipboardjs.com/ GitHub地址:https://github.com/zenorocha/clipboard.js/ 下载后的文件目录: demo中有示例 ...

  7. JS实现各种复制到剪贴板

    一.实现点击按钮,复制文本框中的的内容 <script type="text/javascript"> function copyUrl2() { var Url2=d ...

  8. 【转】js实现复制到剪贴板功能,兼容所有浏览器

    2019独角兽企业重金招聘Python工程师标准>>> 两天前听了一个H5的分享,会议上有一句话,非常有感触:不是你不能,而是你对自己的要求太低.很简单的一句话,相信很多事情不是大家 ...

  9. js实现一键复制到剪切板上_js实现各种复制到剪贴板的方法

    一.实现点击按钮,复制文本框中的的内容 function copyUrl2() { var Url2=document.getElementById("biao1"); Url2. ...

  10. html5 复制到剪贴板 兼容,JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)

    两天前听了一个H5的分享,会议上有一句话,非常有感触:不是你不能,而是你对自己的要求太低.很简单的一句话,相信很多事情不是大家做不到,真的是对自己的要求太低,如果对自己要求多一点,那么你取得的进步可能 ...

最新文章

  1. hql中常用函數介紹二
  2. 【转】汇总:LDA理论、变形、优化、应用、工具库
  3. Windows下UEFI环境的搭建
  4. 线性表的顺序表示和实现(严蔚敏版)
  5. mysql temporary_mysql – 如何在同一个查询中多次引用TEMPORARY表?
  6. 单片机学校实训老师上课需要的工具以及源码分享
  7. MyBatis3-以接口方式编程
  8. easyui datagrid一般创建模板
  9. C语言 | 输出魔方矩阵
  10. 写给2018考研的你
  11. Istio:Mixer功能架构与实践
  12. uniapp——获取退出登录
  13. 年薪50万的程序员_2018年这类程序员工资最高!年薪50万只能算一般
  14. 中英文数字混合的复合格式处理
  15. 【大数据运维监控】Prometheus水平扩展Cortex的架构分析
  16. “永恒之蓝”第一弹-关于防范感染勒索蠕虫病毒的紧急通知
  17. [交易策略]MACD金叉买死叉卖模型回测
  18. Swift使用代码进行约束
  19. 简单构建新闻数据对股票的情绪因子(大盘因子)
  20. ERROR 1130: Host xxx.xxx.xxx.xxx is not allowed to connect to this MySQL server

热门文章

  1. 手机模拟门禁卡!NFC蓝牙读卡器!
  2. Android项目(完整版+免费版)
  3. 数字信号处理常见知识点汇总
  4. 图像的峰值信噪比(PSNR)的计算方法
  5. 微信翻译助手小程序 day2 -翻译功能页
  6. c 语言所有符号,c语言 符号
  7. 地图上导出坐标html文件格式,【教程】奥维地图如何导出含坐标的高清tiff影像图,实现ArcGIS加载使用...
  8. 从 6 万用户评论中,选出 23 门全世界最好的 CS 免费课!
  9. adb命令刷入kingroot_一加5工具箱:一加5玩机神器|刷机工具箱|解锁上锁|刷机root|解密data,一键Xposed...
  10. OBS直播如何连麦和多人连麦