clipboard.js

将文本复制到剪贴板应该不难。配置它不需要几十个步骤,也不需要加载数百KB的js文件 。但最重要的是,它不应该依赖> Flash或任何臃肿的框架。这就是> clipboard.js存在的原因。

安装

npm 安装

  1. npm install clipboard --save

或者,如果您不喜欢包管理,只需下载一个ZIP文件

设置

  • script 引入
  1. <script src="dist/clipboard.min.js"></script>

现在需要通过传递一个DOM选择器、一个HTML标签或者一组HTML标签来实例化它

  1. new ClipboardJS('.btn'); //通过类名.btn的元素实例化

在内部,我们需要获取与选择器匹配的所有元素,并为每个元素附加事件监听器。但你猜怎么着?如果有数百个匹配项,则此操作会消耗大量内存。
因此,我们使用事件委托,它将多个事件侦听器替换为一个侦听器。

使用方法

我们正在经历一个声明性的复兴,这就是为什么我们决定利用HTML5的数据属性来获得更好的可用性

Vue中使用

1、建议在需要使用的组件引入:

  1. import Clipboard from 'clipboard'复制代码

2、在created中初始化clipboard可能会出问题,建议在mounted中初始化js。

  1. data() {
  2. return {
  3. // 复制按钮
  4. clipboard: null,
  5. }
  6. },
  7. mounted() {
  8. this.clipboard = new Clipboard(".copy-link");
  9. clipboard.on("success", function(e) {
  10. window.weui.toast("复制成功", 2000);
  11. e.clearSelection();
  12. });
  13. clipboard.on("error", function(e) {
  14. window.weui.topTips("复制失败", 2000);
  15. });
  16. }

3、Clipboard.js 重复回调问题解决方案

这一问题主要是因为,Clipboard实例在一个页面组件被声明后,若再次进入该页面,又会被实例化一次;每次实例化都会对触发Clipboard业务的DOM添加一个新的监听事件,因而造成重复监听,进一步导致被监听的事件触发重复回调。若回调事件中有DOM变更(例如弹框提示等)、异步操作(例如请求API以统计内容被复制次数等),会对用户体验造成明显影响。

解决方法:

  1. clipboard 定义一个全局变量
  2. mounted 实例化该变量
  3. 离开当前页面组件时,销毁当前Clipboard示例


  1. destroyed () {
  2. // 销毁Clipboard实例,避免在其它页面或组件中实例化Clipboard后造成再次监听,产生重复回调
  3. if (this.clipboard) {
  4. this.clipboard.destroy()
  5. }
  6. },

附上html结构

  1. <span id="phone">{{ phone }}</span>
  2. <a class="copy-link" data-clipboard-target="#phone">复制</a>

复制

相当普遍的使用场景是从其他元素复制文本。在触发元素上添加 data-clipboard-target 属性,该属性值用来匹配另一个元素选择器。

  1. <!-- Target -->
  2. <!-- <input
  3. id="bar"
  4. value="无敌大帅哥"
  5. > -->
  6. <p id="bar">无敌大帅哥</p>
  7. <!-- Trigger -->
  8. <button class="btn" data-clipboard-target="#bar" > 复制 </button>

剪切

另外,也可以定义 data-clipboard-action 属性为 copy/cut 来,明确操作是 复制 / 剪切
如果忽略了这个属性,便默认 复制

  1. <!-- Target -->
  2. <textarea id="bar">Mussum ipsum cacilds...</textarea>
  3. <!-- Trigger -->
  4. <button class="btn" data-clipboard-action="cut" data-clipboard-target="#bar">
  5. Cut to clipboard
  6. </button>

正如上例,剪切 cut 的操作只能在 <input><textarea> 标签中起作用,在其他标签中会出现事件正常调用,但是操作是失败的,粘贴板是没有改变的

通过属性复制文本

我们甚至不必需要其他承载文本的元素,仅通过 在触发元素中 添加 data-clipboard-text 属性 来完成复制

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

注意:

  • data-clipboard-text “级别最高”,在 data-clipboard-target 等属性存在时,复制内容及相关参数以 data-clipboard-text 为准

    事件

回调函数: success / error

事件名 参数
success event.action copy/cut 操作
event.text copy/cut 操作文本内容
event.triger 触发操作的DOM元素
error event.action copy/cut 操作
event.triger 触发操作的DOM元素
  1. var clipboard = new ClipboardJS('.btn');
  2. clipboard.on('success', function(e) {
  3. console.info('Action:', e.action);
  4. console.info('Text:', e.text);
  5. console.info('Trigger:', e.trigger);
  6. e.clearSelection();
  7. });
  8. clipboard.on('error', function(e) {
  9. console.error('Action:', e.action);
  10. console.error('Trigger:', e.trigger);
  11. });

工具提示

每个应用程序有不同的设计需求,这就是为什么clipboard.js不包括任何CSS或内置的工具提示解决方案。
您在这个演示站点上看到的工具提示是使用GitHub的Primer构建的。如果你正在寻找相似的外观和感觉,你可能想看看。

高级用法

如果你不想修改你的HTML,有一个非常方便的命令式API供你使用。您所需要做的就是声明一个函数,执行您的操作,然后返回一个值。
例如 如果想动态的设置一个目标元素target,则需要返回一个节点,即 动态设置点击复制的目标元素

  1. new ClipboardJS('.btn', {
  2. target: function(trigger) {
  3. return trigger.nextElementSibling || document.getElementById('name');
  4. }
  5. });

如果想动态设置内容文本text,则返回一个字符串String

  1. new ClipboardJS('.btn', {
  2. text: function(trigger) {
  3. return trigger.getAttribute('aria-label') || 'default text ';
  4. }
  5. });

Bootstrap Modals 中或与任何其他更改焦点的库一起使用时,将希望将焦点元素设置为 container 值。

  1. new ClipboardJS('.btn', {
  2. container: document.getElementById('modal')
  3. });

并且,如果在单页应用中使用时,要更精确地管理DOM的生命周期,可以使用以下方法清除创建的事件对象

  1. var clipboard = new ClipboardJS('.btn');
  2. clipboard.destroy();

浏览器支持

这个库同时依赖于SelectionexecCommand api。所有浏览器都支持第一个,而以下浏览器支持第二个。

  • Chrome 42 +
  • Edge12 +
  • Firefox 41 +
  • IE 9 +
  • Opera 29 +
  • Safari 10 +

好消息是,如果需要支持旧的浏览器,clipboard.js可以优雅地降级。你所要做的就是显示一个工具提示“复制!”在调用成功事件时,因为文本已经被选中,所以在调用错误事件时,请按Ctrl+C进行复制。
你也可以通过运行ClipboardJS.isSupported()来检查是否支持clipboard.js,这样你就可以从UI中隐藏复制/剪切按钮