ZeroClipboard.js复制内容到剪贴板(跨浏览器)
2016-04-26 10:51
656 查看
此文章摘抄与百度文库
背景:
在开发中经常会用到复制的功能,在IE下通过JavaScript内置的window.clipboardData.setData
可以简单实现复制到剪贴板功能,但是无法兼容其他浏览器,所以今天介绍一种终极解决方法:使用jhuckaby写的ZeroClipboard的js类库。此方法利用Flash完成进行复制内容到剪贴板,所以只要浏览器装有Flash就可以复制内容。
ZeroClipboard的实现原理
ZeroClipboard利用透明的Flash让其漂浮在复制按钮之上,这样其实点击的不是按钮而是Flash,这样将需要的内容传入Flash,再通过Flash的复制功能把传入的内容复制到剪贴板。
ZeroClipboard的安装方法
其实也不算安装啦,就是使用前的准备工作。
首先需要下载ZeroClipboard的压缩包,解压后把文件夹中两个文件:ZeroClipboard.js和ZeroClipboard.swf放入到你的项目中。
ZeroClipboard:[项目主页][zip下载][在线演示]
然后把在你要使用复制功能的页面中引入ZeroClipboard的js文件:ZeroClipboard.js
如下代码:
<scripttype="text/javascript"src="ZeroClipboard.js"></script>
注意:以上ZeroClipboard.js,ZeroClipboard.swf需要放在同一路径下。如果不在同一路径,可使用ZeroClipboard.setMoviePath(“Flash路径”);来设置ZeroClipboard.swf地址
ZeroClipboard实现简单跨浏览器复制
varclip
=newZeroClipboard.Client();
//新建一个对象
clip.setHandCursor(true
);//
设置鼠标为手型
clip.setText("哈哈");
//设置要复制的文本。
//注册一个button,参数为id。点击这个
button就会复制。
//这个button
不一定要求是一个input
按钮,也可以是其他DOM
元素。
clip.glue("copy-botton");
//和上一句位置不可调换
这样,这样基本功能实现了,点击按钮就可以复制设置好的文本了。你可能注意到了,待复制的文本是固定的,如果想要动态改变的怎么办,比如复制一个输入框中的内容。不用担心,下面会讲到的。
ZeroClipboard的高级功能
1、reposition()方法
因为按钮上漂浮有一个Flash按钮,所以当页面大小发生变化时,Flash按钮可能会错位,这样就点不着了。不要紧,ZeroClipboard提供了一个reposition()方法,可以重新计算Flash按钮的位置。我们可以将它绑定到resize事件上。如下面代码是在jQuery下实现的resize事件重新设置按钮位置:
$(window).resize(function(){
clip.reposition();
});
2、hide()和show()方法
这两个方法可以隐藏和显示Flash按钮。其中show()方法会调用reposition()方法。
3、setCSSEffects()方法
当鼠标移到按钮上或点击时,由于有Flash按钮的遮挡,所以像css“:hover”,“:active”等伪类可能会失效。setCSSEffects()方法就是解决这个问题。首先我们需要将伪类改成类,比如:
#copy-botton:hover{
border-color:#FF6633;
}
//可以改成下面的":hover"改成".hover"
#copy-botton.hover{
border-color:#FF6633;
}
我们可以调用clip.setCSSEffects(true);这样ZeroClipboard会自动为我们处理:将类.hover当成伪类:hover。
4、getHTML()方法
如果你想自己实例一个Flash,不用ZeroClipboard的附着方法,那么这个方法就可以帮上忙了。它接受两个参数,分别为Flash的宽度和高度。返回的是Flash对应的HTML代码。例如:
varhtml
=clip.getHTML(
150,
20);
你可以用innerHTML或直接document.write();进行输出。
以下是测试输出的组装完毕的HTML代码:
<embedid="ZeroClipboardMovie_1"src="zeroclipboard/ZeroClipboard.swf"loop="false"menu="false"quality="best"bgcolor="#ffffff"width="150"height="20"name="ZeroClipboardMovie_1"align="middle"allowScriptAccess="always"allowFullScreen="false"type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer"flashvars="id=1&width=150&height=20"wmode="transparent"/>
IE的Flash
JavaScript通信接口上有一个bug。你必须插入一个object标签到一个已存在的DOM元素中。并且在写入innerHTML之前请确保该元素已经appendChild方法插入到DOM中。
ZeroClipboard事件处理
ZeroClipboard提供了一些事件,你可以自定义函数处理这些事件。ZeroClipboard事件处理函数为addEventListener();例如当Flash完全载入后会触发一个事件“load”。
clip.addEventListener(
"load",
function(client)
{
alert("Flash
加载完毕!");
});
ZeroClipboard会将clip对象作为参数传入。即上例中的“client”。
还有“load”也可以写成“onLoad”,其他的事件也可以这样。
其他事件还包括:
mouseOver鼠标移上事件
mouseOut鼠标移出事件
mouseDown鼠标按下事件
mouseUp鼠标松开事件
complete复制成功事件
其中mouseOver事件和complete事件比较常用。
前面说过,如果需要动态改变待复制的内容,那mouseOver事件就可以派上用场了。例如需要动态复制一个id为test的输入框中的值,我们可以在鼠标over的时候重新设置值。
clip.addEventListener(
"mouseOver",
function(client)
{
vartest
=document.getElementById("test");
client.setText(test.value
);//
重新设置要复制的值
});
//复制成功:
clip.addEventListener(
"complete",
function(){
alert("复制成功!");
});
在说到ZeroClipboard之前,先说说为何会用到ZeroClipboard。有时候需要在触发某JavaScript事件的同时,将某段文本复制到剪贴板。比如直接通过点击某复制按钮,将textarea中的内容复制到剪贴板,就不用先全选内容,再Ctrl+C了。另外如果在复制的同时,要记录这段文本被复制使用的次数,一般的方法是可以使用js脚本代码,在执行复制之后,执行form
submit,提交一次则该文本被使用的次数计数器加1。
若不考虑浏览器的兼容性,只要支持IE浏览器,则可以使用IE浏览器支持的window.clipboardData对象(jsdom对象)的setData方法,如window.clipboardData.setData(“Text”,txt);不过该window对象实现复制到剪贴板并不支持Firefox浏览器,当然更不支持GoogleChrome浏览器。针对兼容火狐Firefox浏览器的js代码,可以用类似下面的这段JavaScript脚本实现复制。
上面的JavaScript针对使用最多的两大主流浏览器:IE(IE6,IE7,IE8)和Firefox都可以实现复制到剪贴板功能。但是这段js脚本代码对使用用户群体越来越高的GoogleChrome浏览器仍无法兼容。
这时候ZeroClipboard就派上用场了。ZeroClipboard使用一段隐藏的AdobeFlash视频和JavaScript接口,简单实现复制文本到剪贴板的功能。只要用户的浏览器安装了adobeflash,就可以使用,adobeflash的安装率很高,同时兼容最新的adobeflashplayer10。剪贴板复制操作由falsh里的一个用户点击事件触发。最新发布的版本是Zero
Clipboard1.0.7,下载ZeroClipboard。
ZeroClipboard下载完毕之后,在解压的文件夹中复制ZeroClipboard.js和ZeroClipboard.swf到网站目录中,若要启用支持adobeflash10的RichHtml属性,则还要将ZeroClipboard10.swf也复制过来。最好将它们放在和使用该js的html代码同一级的目录中,否则需要设置指明ZeroClipboard.swf所在的目录路径。ZeroClipboard使用如下实例:
ZeroClipboard使用实例的说明在上面已经注明,ZeroClipboard使用起来还是比较简单的,使用过程中注意次序,ZeroClipboard.js->HTML代码–>创建ZeroClipboard对象的JavaScript代码–>…–>clip.glue(),尤其是一个页面上需要创建多个ZeroClipboard复制到剪贴板对象时。
在IE7.0中,最后的这段JavaScript代码不宜放在表格table,td等标签中。在Firefox浏览器中,拉动滚动条至隐藏ZeroClipboard的复制框后,需双击才能复制成功。在GoogleChrome浏览器中,当前的测试完全兼容。为了有利于保护安全性,Internetexplorer会限制网页运行可以访问计算机的脚本和ActiveX控件,因此ZeroClipboard在本地磁盘上测试无法使用,必须在网络上测试,如http://localhost…
functioncopyToClipboard(txt){
if(window.clipboardData){
window.clipboardData.clearData();
window.clipboardData.setData("Text",txt);
}else
if(navigator.userAgent.indexOf("Opera")!=-1){
window.location=txt;
}else
if(window.netscape){
try{
netscape.security.PrivilegeManager
.enablePrivilege("UniversalXPConnect");
}catch(e){
alert("被浏览器拒绝!\n请在浏览器地址栏输入'about:config'并回车\n然后将'signed.applets.codebase_principal_support'设置为'true'");
}
varclip=Components.classes['@mozilla.org/widget/clipboard;1']
.createInstance(Components.interfaces.nsIClipboard);
if(!clip)
return;
vartrans=Components.classes['@mozilla.org/widget/transferable;1']
.createInstance(Components.interfaces.nsITransferable);
if(!trans)
return;
trans.addDataFlavor('text/unicode');
varstr=
newObject();
varlen=
newObject();
varstr=Components.classes["@mozilla.org/supports-string;1"]
.createInstance(Components.interfaces.nsISupportsString);
varcopytext=txt;
str.data=copytext;
trans.setTransferData("text/unicode",str,copytext.length*2);
varclipid=Components.interfaces.nsIClipboard;
if(!clip)
return
false;
clip.setData(trans,null,clipid.kGlobalClipboard);
}
alert("复制成功!");
}
背景:
在开发中经常会用到复制的功能,在IE下通过
可以简单实现复制到剪贴板功能,但是无法兼容其他浏览器,所以今天介绍一种终极解决方法:使用jhuckaby写的ZeroClipboard的js类库。此方法利用Flash完成进行复制内容到剪贴板,所以只要浏览器装有Flash就可以复制内容。
ZeroClipboard的实现原理
ZeroClipboard利用透明的Flash让其漂浮在复制按钮之上,这样其实点击的不是按钮而是Flash,这样将需要的内容传入Flash,再通过Flash的复制功能把传入的内容复制到剪贴板。
ZeroClipboard的安装方法
其实也不算安装啦,就是使用前的准备工作。
首先需要下载ZeroClipboard的压缩包,解压后把文件夹中两个文件:
ZeroClipboard:[项目主页][zip下载][
然后把在你要使用复制功能的页面中引入ZeroClipboard的js文件:ZeroClipboard.js
如下代码:
<scripttype="text/javascript"src="ZeroClipboard.js"></script>
注意:以上ZeroClipboard.js,ZeroClipboard.swf需要放在同一路径下。如果不在同一路径,可使用ZeroClipboard.setMoviePath(“Flash路径”);来设置ZeroClipboard.swf地址
ZeroClipboard实现简单跨浏览器复制
varclip
=newZeroClipboard.Client();
//新建一个对象
clip.setHandCursor(true
);//
设置鼠标为手型
clip.setText("哈哈");
//设置要复制的文本。
//注册一个button,参数为id。点击这个
button就会复制。
//这个button
不一定要求是一个input
按钮,也可以是其他DOM
元素。
clip.glue("copy-botton");
//和上一句位置不可调换
这样,这样基本功能实现了,点击按钮就可以复制设置好的文本了。你可能注意到了,待复制的文本是固定的,如果想要动态改变的怎么办,比如复制一个输入框中的内容。不用担心,下面会讲到的。
ZeroClipboard的高级功能
1、reposition()方法
因为按钮上漂浮有一个Flash按钮,所以当页面大小发生变化时,Flash按钮可能会错位,这样就点不着了。不要紧,ZeroClipboard提供了一个reposition()方法,可以重新计算Flash按钮的位置。我们可以将它绑定到resize事件上。如下面代码是在jQuery下实现的resize事件重新设置按钮位置:
$(window).resize(function(){
clip.reposition();
});
2、hide()和show()方法
这两个方法可以隐藏和显示Flash按钮。其中show()方法会调用reposition()方法。
3、setCSSEffects()方法
当鼠标移到按钮上或点击时,由于有Flash按钮的遮挡,所以像css“:hover”,“:active”等伪类可能会失效。setCSSEffects()方法就是解决这个问题。首先我们需要将伪类改成类,比如:
#copy-botton:hover{
border-color:#FF6633;
}
//可以改成下面的":hover"改成".hover"
#copy-botton.hover{
border-color:#FF6633;
}
我们可以调用clip.setCSSEffects(true);这样ZeroClipboard会自动为我们处理:将类.hover当成伪类:hover。
4、getHTML()方法
如果你想自己实例一个Flash,不用ZeroClipboard的附着方法,那么这个方法就可以帮上忙了。它接受两个参数,分别为Flash的宽度和高度。返回的是Flash对应的HTML代码。例如:
varhtml
=clip.getHTML(
150,
20);
你可以用innerHTML或直接document.write();进行输出。
以下是测试输出的组装完毕的HTML代码:
<embedid="ZeroClipboardMovie_1"src="zeroclipboard/ZeroClipboard.swf"loop="false"menu="false"quality="best"bgcolor="#ffffff"width="150"height="20"name="ZeroClipboardMovie_1"align="middle"allowScriptAccess="always"allowFullScreen="false"type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer"flashvars="id=1&width=150&height=20"wmode="transparent"/>
IE的Flash
JavaScript通信接口上有一个bug。你必须插入一个object标签到一个已存在的DOM元素中。并且在写入innerHTML之前请确保该元素已经appendChild方法插入到DOM中。
ZeroClipboard事件处理
ZeroClipboard提供了一些事件,你可以自定义函数处理这些事件。ZeroClipboard事件处理函数为addEventListener();例如当Flash完全载入后会触发一个事件“load”。
clip.addEventListener(
"load",
function(client)
{
alert("Flash
加载完毕!");
});
ZeroClipboard会将clip对象作为参数传入。即上例中的“client”。
还有“load”也可以写成“onLoad”,其他的事件也可以这样。
其他事件还包括:
mouseOver鼠标移上事件
mouseOut鼠标移出事件
mouseDown鼠标按下事件
mouseUp鼠标松开事件
complete复制成功事件
其中mouseOver事件和complete事件比较常用。
前面说过,如果需要动态改变待复制的内容,那mouseOver事件就可以派上用场了。例如需要动态复制一个id为test的输入框中的值,我们可以在鼠标over的时候重新设置值。
clip.addEventListener(
"mouseOver",
function(client)
{
vartest
=document.getElementById("test");
client.setText(test.value
);//
重新设置要复制的值
});
//复制成功:
clip.addEventListener(
"complete",
function(){
alert("复制成功!");
});
在说到ZeroClipboard之前,先说说为何会用到ZeroClipboard。有时候需要在触发某
submit,提交一次则该文本被使用的次数计数器加1。
若不考虑浏览器的兼容性,只要支持
<scripttype="text/javascript">
functioncopyCode(id){
vartestCode=document.getElementById(id).value;
if(copy2Clipboard(testCode)!=false){
document.form1.submit();//复制成功后提交表单,记录复制到剪贴板的使用次数
}
}
copy2Clipboard=function(txt){
if(window.clipboardData){//判断是否是IE浏览器
window.clipboardData.clearData();
window.clipboardData.setData("Text",txt);
}
//elseif(navigator.userAgent.indexOf("Opera")!=-1){
//window.location=txt;
//}
elseif(window.netscape){//Firefox浏览器
try{
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
}
catch(e){
alert("您的firefox安全限制限制您进行剪贴板操作,请打开’about:config’将signed.applets.codebase_principal_support’设置为true’之后重试,相对路径为firefox根目录/greprefs/all.js");
returnfalse;
}
varclip=Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
if(!clip)return;
vartrans=Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
if(!trans)return;
trans.addDataFlavor('text/unicode');
varstr=newObject();
varlen=newObject();
varstr=Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
varcopytext=txt;str.data=copytext;
trans.setTransferData("text/unicode",str,copytext.length*2);
varclipid=Components.interfaces.nsIClipboard;
if(!clip)returnfalse;
clip.setData(trans,null,clipid.kGlobalClipboard);
}
}
</script>
HTML代码:
<formaction="copy.php"method="post"id="form1"name="form1"target="updateself">
<inputtype="button"name="title"onclick="copyCode('copyid');"value="【点击复制】"width="100px"height="23">
<textareaid="copyid"><?phpecho$content;?></textarea>
上面的JavaScript针对使用最多的两大主流浏览器:IE(IE6,IE7,IE8)和Firefox都可以实现复制到剪贴板功能。但是这段js脚本代码对使用用户群体越来越高的
这时候ZeroClipboard就派上用场了。ZeroClipboard使用一段隐藏的AdobeFlash视频和JavaScript接口,简单实现复制文本到剪贴板的功能。只要用户的浏览器安装了
Clipboard1.0.7,
ZeroClipboard下载完毕之后,在解压的文件夹中复制ZeroClipboard.js和ZeroClipboard.swf到网站目录中,若要启用支持adobeflash10的RichHtml属性,则还要将ZeroClipboard10.swf也复制过来。最好将它们放在和使用该js的html代码同一级的目录中,否则需要设置指明ZeroClipboard.swf所在的目录路径。ZeroClipboard使用如下实例:
CSS:
<styletype="text/css">
#d_clip_button{
width:150px;
text-align:center;
border:1pxsolidblack;
background-color:#ccc;
margin:10px;padding:10px;
}
#d_clip_button.hover{background-color:#eee;}
#d_clip_button.active{background-color:#aaa;}
</style>
copy.php:
<scripttype="text/javascript"src="/js/zero/ZeroClipboard.js"></script>
<divid="d_clip_button">【点击复制】</div>
<textarearows=2id="copyid"><?phpecho$content;?></textarea>
<scriptlanguage="JavaScript">
ZeroClipboard.setMoviePath('/js/zero/ZeroClipboard.swf');//和copy.php不在同一目录需设置setMoviePath
ZeroClipboard.setMoviePath('/js/zero/ZeroClipboard10.swf');
varclip=newZeroClipboard.Client();//创建新的ZeroClipboard对象
clip.setText('');//willbesetlateronmouseDown//清空剪贴板
clip.setHandCursor(true);//设置鼠标移到复制框时的形状
clip.setCSSEffects(true);//启用css
clip.addEventListener('load',function(client){
//alert("movieisloaded");
});
clip.addEventListener('complete',function(client,text){//复制完成后的监听事件
//alert("Copiedtexttoclipboard:"+text);
document.form1.submit();//复制到剪贴板成功后提交表单
clip.hide();//复制一次后,hide()使复制按钮失效,防止重复计算使用次数
});
clip.addEventListener('mouseOver',function(client){
//alert("mouseover");
});
clip.addEventListener('mouseOut',function(client){
//alert("mouseout");
});
clip.addEventListener('mouseDown',function(client){
//settexttocopyhere
clip.setText(document.getElementById('copyid').value);
//alert("mousedown");
});
clip.addEventListener('mouseUp',function(client){
//alert("mouseup");
});
clip.glue('d_clip_button');
</script>
ZeroClipboard使用实例的说明在上面已经注明,ZeroClipboard使用起来还是比较简单的,使用过程中注意次序,ZeroClipboard.js->HTML代码–>创建ZeroClipboard对象的JavaScript代码–>…–>clip.glue(),尤其是一个页面上需要创建多个ZeroClipboard复制到剪贴板对象时。
在IE7.0中,最后的这段JavaScript代码不宜放在表格table,td等标签中。在Firefox浏览器中,拉动滚动条至隐藏ZeroClipboard的复制框后,需双击才能复制成功。在GoogleChrome浏览器中,当前的测试完全兼容。为了有利于保护安全性,Internetexplorer会限制网页运行可以访问计算机的脚本和ActiveX控件,因此ZeroClipboard在本地磁盘上测试无法使用,必须在网络上测试,如http://localhost…
functioncopyToClipboard(txt){
if(window.clipboardData){
window.clipboardData.clearData();
window.clipboardData.setData("Text",txt);
}else
if(navigator.userAgent.indexOf("Opera")!=-1){
window.location=txt;
}else
if(window.netscape){
try{
netscape.security.PrivilegeManager
.enablePrivilege("UniversalXPConnect");
}catch(e){
alert("被浏览器拒绝!\n请在浏览器地址栏输入'about:config'并回车\n然后将'signed.applets.codebase_principal_support'设置为'true'");
}
varclip=Components.classes['@mozilla.org/widget/clipboard;1']
.createInstance(Components.interfaces.nsIClipboard);
if(!clip)
return;
vartrans=Components.classes['@mozilla.org/widget/transferable;1']
.createInstance(Components.interfaces.nsITransferable);
if(!trans)
return;
trans.addDataFlavor('text/unicode');
varstr=
newObject();
varlen=
newObject();
varstr=Components.classes["@mozilla.org/supports-string;1"]
.createInstance(Components.interfaces.nsISupportsString);
varcopytext=txt;
str.data=copytext;
trans.setTransferData("text/unicode",str,copytext.length*2);
varclipid=Components.interfaces.nsIClipboard;
if(!clip)
return
false;
clip.setData(trans,null,clipid.kGlobalClipboard);
}
alert("复制成功!");
}
相关文章推荐
- js常用正则表达式
- arcgis api for js3.16做的一些简单功能
- JavaScript权威指南
- JavaScript 装逼指南
- 通过访问第三方URL返回json数据
- GSON之JSON解析步骤
- d3.js——绘制力学图
- Javascript 获取url参数,hash值 ,cookie
- 环状图chart.js
- 未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
- Eclipse中jsp,html代码自动排版太丑怎么办?!改改就好了!
- JS闭包?
- js window.open打开新窗口 参数
- 用js下载文件
- 钉钉客户端JS-API权限签名算法.NET版
- JS调用Activity方法时,方法里的overridePendingTransition 不起作用
- JS如何获取页面可见区域高度
- JSON学习笔记
- jstat:虚拟机统计信息监视工具
- 初探 js对象与数组