解决clipboad.js在移动端复制失败的问题

1.前沿

  在项目中使用clipboad.js去实现点击按钮,自动复制一段网址到剪切板。一开始使用正常,pc端移动端都正常。突然有一个测试提了个bug,复制失败。简直一脸懵逼。。。

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

2、透过表象思考

  1、遇到这个bug,我第一个思考到的是,这是个流行的主流插件,网上应该有现成解决方法。然后搜了网上的方法,把绑定data-clipboard-target属性的按钮标签从div换成button,还是没用。网上的解决方案失败。

  2、思考:为什么随着项目的进行,复制功能会失效。是不是全局禁用了一些默认事件,导致了clipboad.js内部实现复制功能与禁用的默认事件冲突,所以才复制失败。按这个思路去排查的两个方法:1、去看clipboard的源码了,找到复制功能的具体实现,与哪些事件和默认事件有关联,再去寻找冲突点。2、业务代码中去排查,哪里做了全局事件的配置,这些配置一个个排查哪个影响了clipboad复制功能的实现。第一种相对牛皮,学习了原理也是极好的成长。第二种,是比较蠢的方法,有时候是比较有效的,可能在少量的试验中就找到了bug点,有时候是找不出来的。只可花少量的时间去试验第二种方法。其实,这里还有另一种方法,就是换一种方式去实现复制功能。轮子已经造好了,根据文档有两种方式去实现复制功能。

  我一开始所使用的是方法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>

  然后试验改成了文档说明的另外种实现方法2: js绑定复制内容。如下:

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

  第二种方法成功解决了移动端复制失败的问题。

3、寻找原因

  可以说,“投机取巧”,花最小的代价,解决了问题。问题虽然解决了,有时间总得找找bug的原因吧。回头认真看了下文档,在对方法1(移动端复制失败的那个方法)的描述中,看到这么一段话:

  大意就是:复制或者剪切操作之后会选中对象,这个对象会通过触发一些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;
}

  找到疑点,经试验,确实是这个原因引起的,导致方法1复制功能失败。

  再回头思考,方法1方法2的区别。推测:方法1,受css:user-select的影响,应该跟内部实现原理有关。方法2,在new实例中,传入text参数,通过js获取复制内容,所以不受css:user-select的影响。一切推测和表象,达成高度切合。这只是一个强有力的推测,最后最有效的论证,还得研究clipboad源码的实现。

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

4、总结:

  1、解决问题的思路有很多。有时候根据问题的表象去分析问题,能有几种思路去排查。有时候不必纠结于问题的表象和原因,条条大路通罗马,换一种方式去实现功能,也不错。不管哪种方式去解决,都有不一样的付出和收获。

原文地址:https://www.cnblogs.com/damonFeng/p/9174492.html

时间: 2024-08-30 10:16:51

解决clipboad.js在移动端复制失败的问题的相关文章

移动端复制到粘贴板

老大是写后台的,让我解决手机端复制到粘贴板的问题,我搞了半天说有兼容问题,不好解决,然后过了一会老大说我找到了一个解决办法,把链接发给我了,让我看一下,哎,搜索关键字很重要啊.下面附上代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="widt

解决ios、微信移动端的position: fixed; 支持性不好的问题 &amp;&amp; 禁用下拉暴露黑底的功能

解决ios.微信移动端的position: fixed; 支持性不好的问题 在chrome中的多个部分使用了position: fixed之后,都可以正常的布局,但是放在微信上却出现了不能正常显示的问题(第一个问题). 并且使用了postion: fixed; 的一个种类名称栏在微信下下滑不了,而body是可以的,确实让人很郁闷(第二个问题). 对于第二个问题,我们可以采取的方式是使得微信不能下滑暴露出 powered by ... 的字样. 但是对于第一个问题,确实没有很好的解决方法. 所以就

Phonegap 之 iOS银联在线支付(js调用ios端银联支付控件)

Phonegap项目,做支付的时候,当把网站打包到ios或android端成app后,在app上通过wap调用银联在线存在一个问题: 就是当从银联支付成功后,再从服务器返回到app客户端就很难实现. wap银联支付流程是这样:客户端---> 服务器(构建支付请求)--> 银联支付 ---> 返回到服务端(处理支付结果).所以对于手机网站银联支付没有问题,但是对于ios端app和android端app, 再通过wap支付,发现支付成功后,很难在回到app客户端了. 所以这里就必须借助Pho

JS检测移动端横竖屏的代码

这篇文章主要介绍了JS检测移动端横竖屏的代码,需要的朋友可以参考一下 使用media来判断屏幕宽度遇到的问题: ios上当我旋转屏幕的时候可行,但是安卓机上没反应,横屏显示的还是我竖屏的样式. 查了一下资料,css3的media如果要在移动端有较好的显示效果,需要在页头加上这段代码 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-s

记录使用clipboard.js实现点击复制链接到剪切板的历程

记录使用clipboard.js实现点击复制链接到剪切板的历程 前几天接到一个任务,让实现当用户在首页点击按钮(说是按钮,只是外观是按钮,其实是一个a标签)时弹出弹窗告诉用户已经复制了活动链接,同时将链接复制到用户的剪切板中. 听起来贼简单的功能,分任务的时候甚至有人说就1,2行代码就搞定了.于是这简单的任务就给了我(菜鸟实习生  =-=),我真是信了你的邪~~!. 在我做的时候,才发现,听起来挺简单的任务,但是如果要实现对不同浏览器兼容,其实并不简单. 列举一下我找到的各种实现方法吧: 1.d

js点击后将文字复制到剪贴板,将图片复制到剪贴板

复制文字: [html] view plaincopy <table width="99%" border="0" cellpadding="0" cellspacing="0" class="firtable"> <tr> <th width="100%" style="color: white;"><s:text name

站点间复制失败提示:dsreplicasync()失败,状态:8452(0x2104)

错误:某些 <站点间> 复制出现错误-->站点复制失败提示:dsreplicasync()失败,状态:8452(0x2104),命名上下文要被删除或没有从制定的服务器上复制. 解决办法: 重启  重启目标服务器和源服务器 在  ACTIVE DIRECTORY 站点和服务   中的目标服务器  手动建立新的连接   然后重启目标服务器和源服务器. 原文地址:http://blog.51cto.com/seawind/2119404

从Hybrid到React-Native: JS在移动端的南征北战史

注:因为不了解Dart,所以本文不对flutter相关内容进行阐述, 实在抱歉 其实写这篇文章的时候,我就知道,肯定有人问我:为什么不写flutter?抱歉了,flutter的大名我当然知道,可我只是一个写JS的,同时了解一些Java的知识,而flutter采用的编程语言,我暂时没有碰过,所以自然不敢妄加猜度,还请谅解 Hybrid Hybird是一种混合开发应用,可以实现JS和Java代码的互通,单纯使用ios/android原生实现,开发进度和成本受不了,而单纯使用h5/js开发,页面体验更

js插件zClip实现复制到剪贴板功能

之前在一个项目中用过插件,但是最近又要做,发现,出现问题了,根据以往记忆做好,检查了所有问题,还是不出现,元素是绑定了zclip_type这个事件,就是弹出不显示,想了下,查看html结构元素一看,问题发现,覆盖的层定位有问题.相对body定位了,没有相对td定位. 一,准备工作. 准备好jquery,然后去http://www.steamdev.com/zclip/这里下载jquery.zclip.js和ZeroClipboard.swf ,不过那里的ZeroClipboard.swf下载地址