js 复制文本的四种方式
js 复制文本的四种方式
一、总结
一句话总结:js文本复制主流方法:document的execCommand方法
二、js 复制文本的四种方式
纯 转载复制,非原创
原地址:http://www.cnblogs.com/xhyu/p/5370111.html
目前copy主流有四种方式:ZeroClipboard,Clipboard.js,execCommand,setData,再就是其他只支持IE的鸡肋法了不在此讨论。。
概况:
ZeroClipboard 就是常说的Flash法,通过加载一个Flash,让其访问系统剪贴板来绕过绝大多数系统的权限限制,然而体积稍微庞大些
Clipboard.js 近几年使用较多,体积相对小,兼容性可以接受,使用还比较方便。
execCommand 新兴势力,safari等主流正在努力兼容,是个好东西。
setData 太老。。一般不太用,基本只适合IE
兼容性:
ZeroClipboard 兼容性最好,能全面兼容chrome/ FireFox/ IE/ 甚至Safari 这种“友好”的浏览器
Clipboard.js和execCommand兼容性相似,兼容chrome/ FF/ IE>9/ Safari新版(不太懂Safari版本号如何算。。感觉15年以后的都可以)
setData 仅IE
体积:
ZeroClipboard 插件较大,230KB
Clipboard.js 较小,4KB
execCommand是document方法,不用插件直接搞
虽说体积有差,加载起来速度差不多的其实。。话说git好像就是用的ZeroClipboard
Clipboard.js 实验经过:
直接忽略胖胖的Flash法,,先盯上的Clipboard.js,用起来着实简单,先引用压缩版:
<script src="dist/clipboard.min.js"></script>
新建Clipboard对象(顺便:'.btn'给所有class="btn"的元素都加了监听,其他用法可查JS)

var clipboard = new Clipboard('.btn'); //可以自己加些处理
clipboard.on('success', function(e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger); e.clearSelection();
});
clipboard.on('error', function(e) {
console.error('Action:', e.action);
console.error('Trigger:', e.trigger);
});

HTML里这样就OK了
<button class="btn" data-clipboard-target="#foo">
使用清爽,测试通过,然而项目只有一个地方用到copy,为了他加个插件真是不优美。。于是终于找到了近期出现的execCommand()大法 (生在了好时代Orz)
execCommand()大法:
其实只需要选中要复制的内容,执行document.execCommand('copy', false, null)就好了。execCommand里可以跑很多例如paste等方法,第一个参数是方法名,第二个是是否展示默认ui,第三个是可选参数列表,对copy来说后两个都用不到。
根据兼容不同,执行后可能的情况(涉及返回值):
1.不支持execCommand:抛出异常 2.不支持copy方法:返回false 3.成功:true
因此框架可以这样写:

copy_target.focus();
copy_target.select();
try{
if(document.execCommand('copy', false, null)){
//success info
} else{
//fail info
}
} catch(err){
//fail info
}

给用户的反馈用的jquery的tooltip,然后写成一个function就是如下:

function copy(copytargetid,copybtnid){
var cpt = document.getElementById(copytargetid);
var cpb = document.getElementById(copybtnid);
$(cpt).focus();
$(cpt).select();
try{
if(document.execCommand('copy', false, null)){
$(cpb).tooltip({title:"copied!", placement: "bottom", trigger: "manual"});
$(cpb).tooltip('show');
cpb.onmouseout=function(){$(cpb).tooltip('destroy')};
} else{
$(cpb).tooltip({title:"failed!", placement: "bottom", trigger: "manual"});
$(cpb).tooltip('show');
cpb.onmouseout=function(){$(cpb).tooltip('destroy')};
}
} catch(err){
$(cpb).tooltip({title:"failed!", placement: "bottom", trigger: "manual"});
$(cpb).tooltip('show');
cpb.onmouseout=function(){$(cpb).tooltip('destroy')};
}
}

用的时候直接
<button id="cpbtn" onclick="copy('cptar', 'cpbtn')">copy</button>
即可
到此还没有结束。。。
项目用的vue,于是需要做成vue的method,又是用coffee写的,改了下语法,在初次渲染的html中测试通过了,然后。。。我的copy妞是个vex模态框。。button是写在vex.dialog.open的message里的,message是个字符串,弹窗时候强注一段html。而且vue函数是只在渲染阶段绑定,所以。。。初次vue渲染的时候不会识别到字符串中的v-on:click,无法绑定。。于是不能从button元素直接调。
决定搞一个隐藏input中继一下,最后终于用比较优美的姿势实现了。。。(上次是直接在message里强行注入script。。。涉及script嵌套还加了个转义<\/script>,结果丑的一bi。。)
button里 onclick="document.getElementById('copyrelay').select()",input里@select('copy(...)')(@是vue的v-on:的缩写)。
终于测试一切完好,天真的以为加个display: none就大功告成。。结果发现跪了
原来是display:none的元素并不能被select。。
同样的,也不能focus, change等等,于是顺着onerror等事件挨个试了一遍。。发现貌似只有onclick work。。。
另外还顺带试了一下,<input type="hidden"/>也是不能用那些事件;即使正常显示元素,value=""的话也不能触发select。
当然,至于是.select()没有成功,还是元素没有触发select事件,还是没有触发v-on:select,有待确定,有时间可以试一下。
Anyway,最终代码:
<input id="copyrelay" style="display: none;" @click=“copy('cptg','cpbt')”/> <!--vex.dialog.open的message中:-->
<input id="cpbt" type="button" onclick="document.getElementById('copyrelay').click()"/>
<input id="cptg" value="copy test" readonly/>
method中的copy函数如上所提,转为coffee。
我这个伪frontend太弱了。。还是希望给贵司多搞点贡献。。。
感谢lrx,lyy,P8,zzl,xxm犇们Orz。。。
就这样。
js 复制文本的四种方式的更多相关文章
- js 实现复制功能的四种方式的优劣对比
今日网上浏览别人项目,看到有人用了document.execCommand这个属性,于是想起之前我选用Clipboard.js 来实现.对于这种不常用的属性还是不太放心,于是随手查了下关于复制的资料, ...
- js动态引入的四种方式
index.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:// ...
- IO之复制文件的四种方式
1. 使用FileStreams复制 这是最经典的方式将一个文件的内容复制到另一个文件中. 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B. 这是 ...
- js数组去重的四种方式
// 删除重复的 function only(arr){ for(var i=0;i<arr.length;i++){ for(var j = i+1;j<arr.length;j++){ ...
- Java使用基本字节流OutputStream的四种方式对于数据复制(文本,音视频,图像等数据)
//package 字符缓冲流bufferreaderDemo; import java.io.BufferedOutputStream; import java.io.FileInputStream ...
- Java实现文件复制的四种方式
背景:有很多的Java初学者对于文件复制的操作总是搞不懂,下面我将用4中方式实现指定文件的复制. 实现方式一:使用FileInputStream/FileOutputStream字节流进行文件的复制操 ...
- java 20 -10 字节流四种方式复制mp3文件,测试效率
电脑太渣,好慢..反正速率是: 高效字节流一次读写一个字节数组 > 基本字节流一次读写一个字节数组 > 高效字节流一次读写一个字节 > 基本字节流一次读写一个字节 前两个远远快过后面 ...
- 【温故知新】——原生js中常用的四种循环方式
一.引言 本文主要是利用一个例子,讲一下原生js中常用的四种循环方式的使用与区别: 实现效果: 在网页中弹出框输入0 网页输出“欢迎下次光临” 在网页中弹出框输入1 网页输出“查询中……” 在 ...
- 【Java EE 学习 80 下】【调用WebService服务的四种方式】【WebService中的注解】
不考虑第三方框架,如果只使用JDK提供的API,那么可以使用三种方式调用WebService服务:另外还可以使用Ajax调用WebService服务. 预备工作:开启WebService服务,使用jd ...
随机推荐
- DBLINK做系统集
过度使用DBLINK做系统集成会带来的问题 过度使用DBLINK做系统集成会带来很多问题,问题主要由以下几点: 1. 大量消耗数据库资源: 本地系统每通过DBLINK链接远端系统一次,都会生成一个本地 ...
- python序列中是否包含某个元素
http://outofmemory.cn/code-snippet/9098/python-list-contains-with-in-not-in theList = ['a','b','c'] ...
- 【河南省多校脸萌第六场 A】分班级
[链接]点击打开链接 [题意] 在这里写题意 [题解] 最大的给了最小的,实际上就对应了,最大值减1,最小值加1. 那么二分最后班级人数最小的最大可能是几->temp1; 二分最后班级人数最大的 ...
- 双向链表(自己写的c++类)
UVA还是上不去T T哭瞎了. 只好老老实实的研究上回买的书了. 写得有点长.好吧,我只是来复习C++类的. 特意用class 而不用struct写链表. 数据结构还没学...双向链表就当先预习了. ...
- P2P借款的几种情况
借款,至少出现2种人,借款人和出借人.根据人的性质,企业和个人,分成4种情况. 企业-个人,企业-企业,个人-企业,个人-个人. P2P平台可能出现几种情况: 个人-个人 2种情况: a. 借款人 ...
- SPRINGAOP实现基于注解的数据源动态切换(转)
需求 代码实现读写数据库分离 武器 spring3.0以上版本 实现思路 1.继承org.springframework.jdbc.datasource.lookup.AbstractRoutingD ...
- TCP快速重传与快速恢复原理分析(四种不同的算法)
在TCP/IP中,快速重传和恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包.没有FRR,如果数据包丢失了,TCP将会使用定时器来要 ...
- swift Reflection(字典转模型)变量继承本类类名解决办法
class IWStatus: Reflect { var source: NSString! var created_at: NSString! var idstr: NSString! var u ...
- POJ 1270 Following Orders 拓扑排序
http://poj.org/problem?id=1270 题目大意: 给你一串序列,然后再给你他们部分的大小,要求你输出他们从小到大的所有排列. 如a b f g 然后 a<b ,b< ...
- 【Codeforces Round #437 (Div. 2) B】Save the problem!
[链接]h在这里写链接 [题意] 给你一个金额N,和硬币的类型总数M; (完全背包),然后问你组成N的方案数. 使得,用这些硬币组成价值为N的金额的方案数为A; 现在A ...