Javascript原生有一些事件:copy、paste、cut,
这些事件可以作用的目标元素:
能获得焦点的元素 (如contentEditable
内容能编辑或者可以选中的元素),或者是<body>
<div id="cardList"> <div class="btn">点击我,复制我</div> </div> <script type="text/javascript"> functioncopy(str){ varsave = function(e){ e.clipboardData.setData('text/plain',str);//下面会说到clipboardData对象 e.preventDefault();//阻止默认行为 } document.addEventListener('copy',save); document.execCommand("copy");//使文档处于可编辑状态,否则无效 } document.getElementById('cardList').addEventListener('click',function(ev){ copy(ev.target.innerText) }) </script>
使用jQuery中的方法监听用户的剪切、复制、粘贴的行为:
$("#cut").on("cut",function(){ alert("剪切"); }); $("#copy").on("copy",function(){ alert("复制"); }); $("#paste").on("paste",function(){ alert("粘贴"); });
这些行为包括使用键盘的ctrl + c操作,或者右击鼠标—>复制等操作。
Evevt.clipboardData 对象
clipboardData是JavaScript剪切板对象,该对象提供了3个常用方法:
clearData(): clipboardData对象从剪切板删除一种或多种数据格式(一个参数:数据类型)
getData(): clipboardData对象从剪切板获取指定格式的数据(一个参数:数据类型)
setData(): clipboardData对象赋予指定格式的数据(两个参数:数据类型,要赋予的值)
*数据类型一般为“"text/plain
"”
Evevt.clipboardData 对象兼容性问题
经过尝试,clipboardData对象内兼容大部分px浏览器,像chrome,firefox、ie等,但是在手机端兼容性不是很好,
目前clipboardData在ios上的safari浏览器无效,为解决移动端这个问题,我们引用一个js插件——clipboard.js
clipboard.js依赖于HTML5推出的Selection API和execCommand API
使用方法:
首先在页面中引入
<script src="http://t.zoukankan.com/clipboard.min.js"></script>
使用clipboard.js的自定义属性
<!--使用data-clipboard-target属性指定被复制的标签--> <!--使用data-clipboard-action属性指定一些操作,copy(复制),cut(剪切)--> <!--注意:cut 操作仅适用于<textarea>和<input>--> <div style="margin:2em"> <textarea id="id_text"></textarea> <button type="button"id="id_copy" data-clipboard-target="#id_text" data-clipboard-action="copy">点击复制 </button> </div> <script type="text/javascript"> varclipboard = newClipboard("#id_copy"); clipboard.on("success",function(element) {//复制成功的回调 console.info("复制成功,复制内容: " +element.text); }); clipboard.on("error",function(element) {//复制失败的回调 console.info(element); }); </script>
高级用法:
//清理Clipboard对象 var clipboard = new Clipboard('.btn'); clipboard.destroy();
JS实现各种复制到剪贴板:
1、实现点击按钮,复制文本框中的的内容
<script type="text/javascript"> functioncopyyel2() { varyel2=document.getElementById("biao1"); yel2.select(); //选择对象 document.execCommand("Copy"); //执行浏览器复制命令 alert("已复制好,可贴粘。"); } </script> <textarea cols="20"rows="10"id="biao1">用户定义的代码区域</textarea> <input type="button"onClick="copyyel2()"value="点击复制代码" />
2、复制专题地址和 url 地址,传给 QQ/MSN 上的好友
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type"content="text/html; charset=gb2312" /> <title>Js复制代码</title> </head> <body> <p> <input type="button"name="anniu1"onClick='copyToClipBoard()' value="复制专题地址和url地址,传给QQ/MSN上的好友"> <script language="javascript"> functioncopyToClipBoard(){ varclipBoardContent=""; clipBoardContent+=document.title; clipBoardContent+=""; clipBoardContent+=this.location.href; window.clipboardData.setData("Text",clipBoardContent); alert("复制成功,请粘贴到你的QQ/MSN上推荐给你的好友"); } </script>
3、直接复制 url
<input type="button"name="anniu2"onClick='copyUrl()' value="复制URL地址"> <script language="javascript"> functioncopyUrl() { varclipBoardContent=this.location.href; window.clipboardData.setData("Text",clipBoardContent); alert("复制成功!"); } </script>
4、点击文本框时,复制文本框里面的内容
<input onclick="oCopy(this)"value="你好.要copy的内容!"> <script language="javascript"> functionoCopy(obj){ obj.select(); js=obj.createTextRange(); js.execCommand("Copy") alert("复制成功!"); } </script>
5、复制文本框或者隐藏域中的内容
<script language="javascript"> functionCopyUrl(target){ target.value=myimg.value; target.select(); js=myimg.createTextRange(); js.execCommand("Copy"); alert("复制成功!"); } functionAddImg(target){ target.value="[IMG]"+myimg.value+"[/ img]"; target.select(); js=target.createTextRange(); js.execCommand("Copy"); alert("复制成功!"); } </script>
6.复制 span 标记中的内容
<script type="text/javascript"> </script> <br /> <br /> <script type="text/javascript">functioncopyText(obj) { varrng =document.body.createTextRange(); rng.moveToElementText(obj); rng.scrollIntoView(); rng.select(); rng.execCommand("Copy"); rng.collapse(false); alert("复制成功!"); } </script>
7.浏览器兼容 copyToClipboard("拷贝内容")
functioncopyToClipboard(txt) { if(window.clipboardData) { window.clipboardData.clearData(); clipboardData.setData("Text", txt); alert("复制成功!"); } else if (navigator.userAgent.indexOf("Opera") != -1) { window.location =txt; } else if(window.netscape) { try{ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); } catch(e) { alert("被浏览器拒绝! 请在浏览器地址栏输入'about:config'并回车 然后将 'signed.applets.codebase_principal_support'设置为'true'"); } var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard); if (!clip) return; var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable); if (!trans) return; trans.addDataFlavor("text/unicode"); var str = newObject(); var len = newObject(); var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString); var copytext =txt; str.data =copytext; trans.setTransferData("text/unicode", str, copytext.length * 2); var clipid =Components.interfaces.nsIClipboard; if (!clip) return false; clip.setData(trans, null, clipid.kGlobalClipboard); alert("复制成功!"); } }
8.兼容各大浏览器的复制代码(结合ZeroClipboard.js)
<html> <head> <title>Zero Clipboard Test</title> <script type="text/javascript"src="ZeroClipboard.js"></script> <script language="JavaScript"> varclip = null; function$(id) { returndocument.getElementById(id); } functioninit() { clip = newZeroClipboard.Client(); clip.setHandCursor(true); clip.addEventListener('mouseOver', function(client) { //update the text on mouse over clip.setText( $('fe_text').value ); }); clip.addEventListener('complete', function(client, text) { //debugstr("Copied text to clipboard: " + text ); alert("该地址已经复制,你可以使用Ctrl+V 粘贴。"); }); clip.glue('clip_button', 'clip_container'); } </script> </head> <body onLoad="init()"> <input id="fe_text"cols=50 rows=5 value=复制内容文本1 > <span id="clip_container"><span id="clip_button"><b>复制</b></span></span> </body> </html>
jQuery ZeroClipboard实现复制到剪贴板功能
jQuery ZeroClipboard是在ZeroClipboard的基础上进行的改良,简称zClip,作为jQuery的API,jQuery ZeroClipboard也表现的非常简易操作,官方地址:http://www.steamdev.com/zclip/
使用前需引用2个js文件:jquery.js和jquery.zclip.js
<script type="text/javascript"src="js/jquery.js"></script> <script type="text/javascript"src="js/jquery.zclip.js"></script>
现在我们使用jquery.zclip.js简单实现复制到剪贴板功能demo如下:
<!DOCTYPE html> <html> <head> <title>ZeroClipboard Test</title> <meta charset="utf-8"> <style type="text/css"> .line{margin-bottom:20px;} /*复制提示 */ .copy-tips{position:fixed;z-index:999;bottom:50%;left:50%;margin:0 0 -20px -80px;background-color:rgba(0, 0, 0, 0.2);filter:progid:DXImageTransform.Microsoft.Gradient(startColorstr=#30000000, endColorstr=#30000000);padding:6px;} .copy-tips-wrap{padding:10px 20px;text-align:center;border:1px solid #F4D9A6;background-color:#FFFDEE;font-size:14px;} </style> <script type="text/javascript"src="jquery.js"></script> <script type="text/javascript"src="jquery.zclip.js"></script> </head> <body> <div class="line"> <h2>demo1 点击复制当前文本</h2> <a href="#none"class="copy">点击复制我</a> </div> <div class="line"> <h2>demo2 点击复制表单中的文本</h2> <a href="#none"class="copy-input">点击复制单中的文本</a> <input type="text"class="input"value="输入要复制的内容" /> </div> </body> </html> <script type="text/javascript"> $(document).ready(function(){ /*定义所有class为copy标签,点击后可复制被点击对象的文本 */ $(".copy").zclip({ path: "ZeroClipboard.swf", copy: function(){ return$(this).text(); }, beforeCopy:function(){/*按住鼠标时的操作 */ $(this).css("color","orange"); }, afterCopy:function(){/*复制成功后的操作 */ var$copysuc =$("<div class='copy-tips'><div class='copy-tips-wrap'>☺ 复制成功</div></div>"); $("body").find(".copy-tips").remove().end().append($copysuc); $(".copy-tips").fadeOut(3000); } }); /*定义所有class为copy-input标签,点击后可复制class为input的文本 */ $(".copy-input").zclip({ path: "ZeroClipboard.swf", copy: function(){ return$(this).parent().find(".input").val(); }, afterCopy:function(){/*复制成功后的操作 */ var$copysuc =$("<div class='copy-tips'><div class='copy-tips-wrap'>☺ 复制成功</div></div>"); $("body").find(".copy-tips").remove().end().append($copysuc); $(".copy-tips").fadeOut(3000); } }); }); </script>
上面代码中结合jQuery的操作节点的功能,出色的发挥jquery.zclip.js的作用,如复制前后的操作,动态插入节点,也可见jquery.zclip.js的强大之处,使用起来是非常简单。
从上面独立的js库ZeroClipboard.js和jquery.zclip.js都是采用flash实现实现复制到剪贴板的功能,可以看出,使用ZeroClipboard.js带来功能相对比较少,不过它是独立的库,文件比较小,而使用jquery.zclip.js后的功能是比较丰富,不过对于不使用jQuery框架的站点来说,采用jquery.zclip.js是比较浪费宽带。使用哪种复制方式还是得看产品的具体定位情况~