clipboard.js在移动端复制失败的解决方法


Posted in Javascript onJune 13, 2018

1.前沿

一句话介绍下clipboard.js:实现了纯 JavaScript (无 Flash)的浏览器内容复制到系统剪贴板的功能。

在项目中使用clipboard.js插件去实现点击按钮,复制一段网址到剪切板的功能。功能做好后,一开始无论这pc端还是移动端都能正常使用。突然某一天测出了一个bug:移动端复制失败,pc端是ok的。简直一脸懵逼。。。

遇到这个bug,我第一个思考到的是,这是个常用的插件,网上应该有现成的解决方法。网友分享的方法是:把绑定data-clipboard-target属性的按钮标签从div换成button。亲测后,不起效果,可能不是一个原因导致的。通过摸索,找到了bug的原因和可解决方案。我相信,在移动端的项目中使用到clipboard插件,有很大的概率会踩到这个坑,

下面就讲讲解决这个bug的历程。

2、透过表象思考

思考:为什么随着项目的进行,复制功能会失效?我的猜想是:可能是全局禁用了一些默认事件,导致了clipboad.js内部实现复制功能与禁用的默认事件冲突,所以才复制失败。按这个猜想去排查的两个思路:

1、去看clipboard的源码了,找到复制功能的具体实现原理,与哪些事件和默认事件有关联,再去寻找冲突点。

2、业务代码中去排查,哪里做了全局事件的配置,这些配置一个个排查,找出影响了clipboad复制功能的配置。

第一种思路相对牛皮,学习了clipboard原理也是极好的。第二种,是比较笨拙的方法,但是有时候是比较有效的,有可能在少量的试验中就找到了bug点。但是经常是找不出来的,所以只可花少量的时间去试验第二种方法。其实,这里还有第三种思路,就是换一种方式去实现复制功能,可能新的实现方式不受影响,可兼容各平台。clipboard轮子已经造好了,就是为了解决复制功能兼容性为目标诞生的。毕竟还是要相信轮子的实力。通读文档,有两种方式去实现复制功能。

1、我使用的是方法1: html属性绑定。

如下:

<!-- Target -->
<textarea id="bar">Mussum ipsum cacilds...</textarea>

<!-- Trigger -->
<button class="btn" data-clipboard-action="cut" data-clipboard-target="#bar">
 Cut to clipboard
</button>

这个就是出现上述bug所使用的方法。

2、改成了文档说明的另外一种实现方法2: js配置参数。如下:

new ClipboardJS('.btn', {
 text: function(trigger) {
  return trigger.getAttribute('aria-label'); // 返回需要复制的内容
 }
});

改成方法2后,成功解决了移动端复制失败的问题。到此为止,若不深究,bug已经被解决,任务完成。

3、寻找原因

可以说,“投机取巧”,花最小的代价,解决了bug。问题虽然解决了,但心有不甘,想找出bug出现的原因。回头认真看了下官方文档,在对方法的描述中,看到这么一段话:

clipboard.js在移动端复制失败的解决方法

大意就是:复制或者剪切操作之后会选中对象,这个对象会通过触发一些cases(事件)去捕获和反馈信息。

重点就是:第一行中的“what has been selected after a copy/cut operation”这句话。根据描述,复制后的对象是被选中状态(selected)的。

然后我立马想到一个事情。在我的项目中,之前有一个同事为了实现长按不选中文本的功能,把长按选中文本的功能全局禁用了。。。。。用的方法是以下css

// 禁止选中html,body{
 user-select: none;
 -moz-user-select: none;
 -webkit-user-select: none;
 -webkit-touch-callout: none;
 -webkit-text-size-adjust: none;
 -webkit-tap-highlight-color: transparent;
 -webkit-user-select: none;
}

找到疑点,通过试验,确实是这个段css导致方法1在移动端复制功能失败。(为什么pc端不失效,移动端失效,这归属于兼容吧,具体原因还不懂。。。)

再回头思考,方法1方法2的区别。可大胆推测:方法1,受css:user-select的影响,应该跟内部实现原理有关。方法2,在new生成实例的时候传入text参数,通过js返回复制内容,所以不受css:user-select的影响。一切推测和表象,达成高度切合。到这里,我只能说,这只是一个强有力的推测。而这个推测是否完全成立,还得研究clipboard.js源码的实现原理,才能真正判断。

问题点找到,解决方案也有了。此bug暂告一个段落!!

舒服(放松脸)。。。。。

4、总结:

1、解决问题的思路有很多。按照逻辑思维,一般是根据问题的表象去分析问题,得出几种思路后,再去验证,最终解决问题。但有时候先不纠结于问题的表象和原因,条条大路通罗马,换一种方式去实现功能,也不错。不管哪种方式去解决,都有不一样的付出和收获。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jquery tab标签页的制作
May 10 Javascript
EASYUI TREEGRID异步加载数据实现方法
Aug 22 Javascript
『jQuery』名称冲突使用noConflict方法解决
Apr 22 Javascript
js校验表单后提交表单的三种方法总结
Feb 28 Javascript
JavaScript静态类型检查工具FLOW简介
Jan 06 Javascript
在Ubuntu系统上安装Node.JS的教程
Oct 15 Javascript
分享19个JavaScript 有用的简写写法
Jul 07 Javascript
JS 实现banner图片轮播效果(鼠标事件)
Aug 04 Javascript
JS设计模式之策略模式概念与用法分析
Feb 05 Javascript
记一次vue去除#问题处理经过小结
Jan 24 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
Jul 07 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
Sep 05 Javascript
ES6与CommonJS中的模块处理的区别
Jun 13 #Javascript
浅谈webpack 构建性能优化策略小结
Jun 13 #Javascript
详解webpack运行Babel教程
Jun 13 #Javascript
Babel 入门教程学习笔记
Jun 13 #Javascript
Vue中在新窗口打开页面及Vue-router的使用
Jun 13 #Javascript
微信小程序支付功能 php后台对接完整代码分享
Jun 12 #Javascript
js replace 全局替换的操作方法
Jun 12 #Javascript
You might like
PHP实现MVC开发得最简单的方法――模型
2007/04/10 PHP
浅谈php serialize()与unserialize()的用法
2013/06/05 PHP
详谈PHP编码转换问题
2015/07/28 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
2017/04/01 PHP
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
JavaScript 获取事件对象的注意点
2009/07/29 Javascript
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
Bootstrap布局之栅格系统详解
2016/06/13 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
backbone简介_动力节点Java学院整理
2017/07/14 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
express启用https使用小记
2019/05/21 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
javascript实现前端分页功能
2020/11/26 Javascript
[01:02:17]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG
2014/05/26 DOTA
[04:17]DOTA2完美盛典,rOtk、BurNIng携手巴图演唱《倔强》
2017/11/28 DOTA
前端制作动画的几种方式(css3,js)
2016/12/12 HTML / CSS
几个解决兼容IE6\7\8不支持html5标签的几个方法
2013/01/07 HTML / CSS
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
英国家用电器购物网站:Hughes
2018/02/23 全球购物
英国在线花园中心:You Garden
2018/06/03 全球购物
.net面试题
2016/09/17 面试题
实习生体会的自我评价范文
2013/11/28 职场文书
群众路线教育实践活动整改落实情况汇报
2014/10/28 职场文书
2019年“红色之旅”心得体会1000字(3篇)
2019/09/27 职场文书
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL
业余无线电通联Q语
2022/02/18 无线电
如何通过cmd 连接阿里云服务器
2022/04/18 Servers