web项目中有对渲染后的列表进行复制文字的操作,采用了clipboard.js的方案,免去了解决兼容性的烦恼,但是实际效果不符合预期,第一次点击复制无效,从第二次之后才可以复制成功
项目使用的Vue技术栈,复制操作使用了动态复制的api
1 2 3 4 5
| new ClipboardJS('.btn', { text: function(trigger) { return trigger.getAttribute('aria-label'); } });
|
经过试验,是因为API调用放在了ajax的回调函数中,这样第一次创建ClipboardJS构造函数成功时,复制操作已经结束,没有复制到任何文本,由于要复制的目标文本必须要通过网络请求动态获取,可以采取hack方案,借助mouseenter
实现,当鼠标移入的时候执行一次,在接下来的点击事件中就可以正常复制。
额外的处理就是区分事件调用者为鼠标移入事件还是点击事件,鼠标移入事件只简单的创建构造函数,屏蔽额外的业务逻辑,真正的逻辑放在点击事件中处理,保证mouseenter
只执行一次即可
附基础代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <button class="btn" @mouseenter="copy" @click="copy"></button>
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 () {} ); }
|