https://github.com/zenorocha/clipboard.js

库,真的是个好库,而且不依赖flash,几乎完美支持移动端。但是,移动端应用有些不趟不知的小tip,这里归档下。

原理

没啥复杂的,基本就是创建一个input,文本塞进去,全部选中,然后document.execCommand("Copy"),Duang,就复制到剪贴板了。

最开始不想用库,这么简单的原理,自己写个嘛,如下:

  /**
* 一键复制到剪切板
* @return {[bl]} [不支持的浏览器或者异常都报false]
*/
copy2clipboard(s) {
try {
let ipt = document.createElement("input");
ipt.style.cssText = 'opacity:0;position:fixed;top:0;';
ipt.value = s;
document.body.appendChild(ipt);
ipt.select();
setTimeout(function() {
ipt.remove();
});
return document.execCommand("Copy");
} catch (err) {
return false;
}
}

然而,键盘嗖嗖的弹,即使我加了input.remove(),也依然阻止不了键盘的一闪而过。

好吧,用你的库好了。

没仔细研究,大概用了些readonly、attribute之类的奇技淫巧,反正核心都是一样的,搞个可以不让键盘弹出来的文字,select()然后execCommand("Copy")。

clipboard.js经验技巧

他支持了好几种调用方式,但是,只有一种是Android/iOS都能支持,且不会弹出键盘的。(有时候有的设备上,你还是能看到一闪而过的选区,不过这个不重要...)

即官方文档中的“Copy text from attribute”。如下:

<button class="btn" data-clipboard-text="text to clipboard"></button>
<script>
var clipboard = new ClipboardJS('.btn');
</script>

注:我没记错的话,需要在DOM Ready的时候,调用new ClipboardJS(),他貌似没走什么代理模式。

一些兼容问题

目前,只遇到过一个问题,就是小米系统浏览器写入剪贴板失败。其他手机其他浏览器都没毛病。

吊诡的是,clipboard的on success事件都触发了,事件里的e.action/e.text也都能拿到,但是就是剪贴板里就是找不到。

排查了3个小时,最原始的排除大法,总算de到了bug。

*{
margin:;
padding:;
- user-select: none;
+ // user-select: none;
box-sizing: border-box;
}

以上,就是这句 “ user-select: none; ”,reset.css里写了一句对所有元素,禁止用户选中的样式。

duang,小米浏览器认真的执行了这条指令,于是,clipboard.js通过选中+复制做剪切板写入时,就遭到了拒绝。(确切说是遭到了欺骗)

over。

注:user-select: none; 这句是显然不适合加到全局样式里的,按需引入就好。

后续,终极大招

2018.11.20

测试同学发现了新问题,ios 微信中,上述推荐方案失效了,剪切板写入失败。

不知道微信升级改了什么鬼东西,继续尝试官方文档提供的其他方案。最佳实现如下:

官方文档 - Advanced Options - "If you want to dynamically set a text, you'll return a String."

new ClipboardJS('.btn', {
text: function(trigger) {
return 'some text';
}
});

over.

clipboard.js操作剪贴版——一些移动端交互和兼容经验的更多相关文章

  1. python 中调用windows系统api操作剪贴版

    # -*- coding: utf-8 -*- ''' Created on 2013-11-26 @author: Chengshaoling ''' import win32clipboard a ...

  2. js操作cookie的一些注意项

     这两天做购物车逻辑.依照通常的做法,把预购信息存放在cookie里,结果发生了非常多不可理喻的事情,完整的证明了我对cookie的无知. . . 这么多年.非常少用cookie,由于认为它不安全 ...

  3. clipboard.js一个可以在移动端一键复制的插件

    网址:https://clipboardjs.com/ 使用方法: 1.引入js <script src="dist/clipboard.min.js"></sc ...

  4. vue在移动端实现复制数值到剪贴版

    实现按键就指定内容复制到设备的剪贴版,这里是复制快递单号 html <div slot="footer" v-if="express.number" st ...

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

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

  6. Clipboard.js : 移动端浏览器实现网页内容复制

    .bl { padding: 5px 10px; border-left: 3px solid #009a61; background: #f6f6f6; color: #555; font-size ...

  7. 移动端无法复制:使用clipboard.js碰到的一个小问题

    移动端无法复制:使用clipboard.js碰到的一个小问题   直接看下面的代码:在移动端访问,点击,能正常复制. <html> <head> <meta http-e ...

  8. js操作文件 HTML5版

    js操作文件 HTML5版,有需要的朋友可以参考下. <!DOCTYPE html> <html> <head> <title>JSFileReader ...

  9. 前端技术之:如何在Vue中使用clipboard.js复制服务端数据

    第一步 创建点击对象页面元素,并绑定业务数据. <el-button type="text" size="mini" class="copy-b ...

随机推荐

  1. 物理像素,逻辑像素,解决1px的问题

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  2. C中为什么不能用==比较字符串?

    通常的回答是,==比较的不是字符串的内容,它是在比较指针.或者说,==(或者!=)仅比较两个字符串的首地址,而不会比较字符串每个字符. 那其实接下来应该问的问题是,为什么会只比较首地址呢? 因为早期的 ...

  3. 【JZOJ6409】困难的图论

    description 给定由 n 个点 m 条边组成的无向连通图,保证没有重边和自环. 你需要找出所有边,满足这些边恰好存在于一个简单环中.一个环被称为简单环,当且仅当它包含的所有点都只在这个环中被 ...

  4. Ruby 类和对象

    Ruby 类和对象 Ruby 是一种完美的面向对象编程语言.面向对象编程语言的特性包括: 数据封装 数据抽象 多态性 继承 这些特性将在 面向对象的 Ruby 中进行讨论. 一个面向对象的程序,涉及到 ...

  5. Vue的data选项使用注意

    使用组件时,大多数可以传入到Vue构造器中的选项可以在Vue extend()或 Vue.component() 中注册组件时使用,但是有一个重要的前提:data必须是函数 .在 var vm = n ...

  6. python解决迅雷下载限制的方法

    一.转换迅雷下载链接 import base64 url='thunder://QUFodHRwOi8veHVubGVpLnhpYXphaS16dWlkYS5jb20vMTkwOC/JqLa+Mi5I ...

  7. NX二次开发-创建一个3 x 3矩阵UF_CSYS_create_matrix

    1 NX9+VS2012 #include <uf.h> #include <uf_csys.h> #include <uf_mtx.h> UF_initializ ...

  8. Api:temple

    ylbtech-Api: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbtech.cnb ...

  9. (转)Python之路,Day6 - 面向对象学习

    本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.     引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战> ...

  10. 54Mbps、150Mbps、433Mbps 你知道这三个Wi-Fi速率怎么算的吗?

           802.11g能够提供54Mbps的最大速率, 802.11n和802.11ac单流分别能够提供150Mbps和433Mbps的最大速率,这些数字是怎么算的呢?(看红字,更容易理解哟) ...