clipboard.js 首次复制需要点击两次问题的解决方案

web项目中有对渲染后的列表进行复制文字的操作,采用了clipboard.js的方案,免去了解决兼容性的烦恼,但是实际效果不符合预期,第一次点击复制无效,从第二次之后才可以复制成功

项目使用的Vue技术栈,复制操作使用了动态复制的api

new ClipboardJS('.btn', {
    text: function(trigger) {
        return trigger.getAttribute('aria-label');
    }
});

经过试验,是因为API调用放在了ajax的回调函数中,这样第一次创建ClipboardJS构造函数成功时,复制操作已经结束,没有复制到任何文本,由于要复制的目标文本必须要通过网络请求动态获取,可以采取hack方案,借助mouseenter实现,当鼠标移入的时候执行一次,在接下来的点击事件中就可以正常复制。

额外的处理就是区分事件调用者为鼠标移入事件还是点击事件,鼠标移入事件只简单的创建构造函数,屏蔽额外的业务逻辑,真正的逻辑放在点击事件中处理,保证mouseenter只执行一次即可

附基础代码:

// html
<button class="btn" @mouseenter="copy" @click="copy"></button>

// script
function copy() {
    $.get(url, data).then(
        function (response) {
            if (response.code === 0) {
                var clipboard = new ClipboardJS(".btn", {
                    text: function () {
                        return response.text;
                    }
                });
                clipboard.on("success", e => {
                    clipboard.destroy();
                });
                clipboard.on("error", e => {
                    e.clearSelection();
                    clipboard.destroy();
                });
            }
        },
        function () {}
    );
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,281评论 0 21
  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,581评论 1 11
  • 本节介绍各种常见的浏览器事件。 鼠标事件 鼠标事件指与鼠标相关的事件,主要有以下一些。 click 事件,dblc...
    许先生__阅读 2,541评论 0 4
  • (续jQuery基础(1)) 第5章 DOM节点的复制与替换 (1)DOM拷贝clone() 克隆节点是DOM的常...
    凛0_0阅读 1,408评论 0 8
  • 个人博客:https://yeaseonzhang.github.io 花了半个多月的时间,终于又把“JS红宝书”...
    Yeaseon阅读 1,804评论 2 23