clipboard.js操作剪贴版——一些移动端交互和兼容经验
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操作剪贴版——一些移动端交互和兼容经验的更多相关文章
- python 中调用windows系统api操作剪贴版
# -*- coding: utf-8 -*- ''' Created on 2013-11-26 @author: Chengshaoling ''' import win32clipboard a ...
- js操作cookie的一些注意项
这两天做购物车逻辑.依照通常的做法,把预购信息存放在cookie里,结果发生了非常多不可理喻的事情,完整的证明了我对cookie的无知. . . 这么多年.非常少用cookie,由于认为它不安全 ...
- clipboard.js一个可以在移动端一键复制的插件
网址:https://clipboardjs.com/ 使用方法: 1.引入js <script src="dist/clipboard.min.js"></sc ...
- vue在移动端实现复制数值到剪贴版
实现按键就指定内容复制到设备的剪贴版,这里是复制快递单号 html <div slot="footer" v-if="express.number" st ...
- 解决clipboard.js在移动端复制失败的问题
1.前沿 在项目中使用clipboard.js插件去实现点击按钮,复制一段网址到剪切板的功能.功能做好后,一开始无论这pc端还是移动端都能正常使用.突然某一天测出了一个bug:移动端复制失败,pc端是 ...
- Clipboard.js : 移动端浏览器实现网页内容复制
.bl { padding: 5px 10px; border-left: 3px solid #009a61; background: #f6f6f6; color: #555; font-size ...
- 移动端无法复制:使用clipboard.js碰到的一个小问题
移动端无法复制:使用clipboard.js碰到的一个小问题 直接看下面的代码:在移动端访问,点击,能正常复制. <html> <head> <meta http-e ...
- js操作文件 HTML5版
js操作文件 HTML5版,有需要的朋友可以参考下. <!DOCTYPE html> <html> <head> <title>JSFileReader ...
- 前端技术之:如何在Vue中使用clipboard.js复制服务端数据
第一步 创建点击对象页面元素,并绑定业务数据. <el-button type="text" size="mini" class="copy-b ...
随机推荐
- react 路由使用react-router-dom
react 和vue一样都是使用封装history 来进行页面跳转,下面就来说一下react常用的路由插件react-router-dom这个东西在GitHub上 目前是最受欢迎的 首相还是先下载 n ...
- ES6 简化对象写法
简化的对象写法 * 省略同名的属性值 * 省略方法的function <!DOCTYPE html> <html lang="en"> <head&g ...
- HttpUrlConnection类基本使用
这个类用来模拟浏览器向服务器发送请求和接收响应 注意: HttpUrlConnection对象简称huc对象 1)获取huc对象向url构造中传递url字符串,并调用openconnection方法即 ...
- 【SPOJ DQUERY】区间数字统计
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 因为区间的端点移动一个单位的话,只会涉及到一个元素的增多或减少. 因此可以用莫队算法来解决. 只需要开一个数组(大小1百万),用下标来快速检索 ...
- Matlab中的lambda表达式 f=@(x) x^2-2*x+1;
Matlab中的lambda表达式 f=@(x) x^-*x+;
- IK的整个分词处理过程
首先,介绍一下IK的整个分词处理过程: 1. Lucene的分词基类是Analyzer,所以IK提供了Analyzer的一个实现类IKAnalyzer.首先,我们要实例化一个IKAnalyzer,它有 ...
- 在MRC模式下使用SDWebImage
在MRC模式下使用SDWebImage (1)在Target->Build Phases->Compile Sources中,给所有的SDWebImage添加-fobjc-arc (2)添 ...
- 2019-8-16-调试时限制程序使用-CPU-核心数模拟低端设备
title author date CreateTime categories 调试时限制程序使用 CPU 核心数模拟低端设备 lindexi 2019-08-16 16:11:32 +0800 20 ...
- List<> ,string[]和string的相互转换
1.string转换成string[]数组 string str = "aaa,bbb,ccc,dddd"; string[] strs = str.Split(','); 2.s ...
- C++ 系列:随机数
C++中没有自带的random函数,要实现随机数的生成就需要使用rand()和srand().不过,由于rand()的内部实现是用线性同余法做的,所以生成的并不是真正的随机数,而是在一定范围内可看为随 ...