Zero Clipboard js+swf实现的复制功能使用方法


Posted in Javascript onMarch 07, 2010

开发中经常会用到复制的功能,在 IE 下实现比较简单。但要想做到跨浏览器比较困难了。本文将介绍一个跨浏览器的库类 Zero Clipboard 。它利用 Flash 进行复制,所以只要浏览器装有 Flash 就可以运行,而且比 IE 的 document.execCommand("Copy") 更加灵活。

Zero Clipboard 的实现原理
Zero Clipboard 利用 Flash 进行复制,之前有 Clipboard Copy 解决方案,其利用的是一个隐藏的 Flash。但最新的 Flash Player 10 只允许在 Flash 上进行操作才能启动剪贴板。所以 Zero Clipboard 对此进行了改进,用了一个透明的 Flash ,让其漂浮在按钮之上,这样其实点击的不是按钮而是 Flash ,也就可以使用 Flash 的复制功能了。

如何使用 Zero Clipboard
首先下载 Zero Clipboard ,并解压缩。其中需要两个文件:ZeroClipboard.js 和 ZeroClipboard.swf ,将这两个文件放入到你的项目中。

下载地址
Zero Clipboard 开源的 JavaScript+flash 复制库类

演示地址:
http://demo.3water.com/js/ZeroClipboard/index.html

核心功能
第一步,导入 ZeroClipboard.js 文件:

<script type="text/javascript" src="ZeroClipboard.js"></script>
再设置 ZeroClipboard.swf 文件的路径:

ZeroClipboard.setMoviePath( "ZeroClipboard.swf" );
注意:以上 ZeroClipboard.js, ZeroClipboard.swf 两个文件的路径都需要替换为你项目中对应文件的路径。或者也可以是一个绝对路径。

然后就使用了:

var clip = new ZeroClipboard.Client(); // 新建一个对象 
clip.setHandCursor( true ); // 设置鼠标为手型 
clip.setText("哈哈"); // 设置要复制的文本。 
// 注册一个 button,参数为 id。点击这个 button 就会复制。 
//这个 button 不一定要求是一个 input 按钮,也可以是其他 DOM 元素。 
clip.glue("copy-botton"); // 和上一句位置不可调换

这样,这样基本功能实现了,点击按钮就可以复制设置好的文本了。你可能注意到了,待复制的文本是固定的,如果想要动态改变的怎么办,比如复制一个输入框中的内容。不用担心,下面会讲到的。

其他函数
Zero Clipboard 还提供了一些其他的函数,其中有一些非常有用。

reposition() 方法
因为按钮上漂浮有一个 Flash 按钮,所以当页面大小发生变化时,Flash 按钮可能会错位,这样就点不着了。 不要紧,Zero Clipboard 提供了一个 reposition() 方法,可以重新计算 Flash 按钮的位置。我们可以将它绑定到 resize 事件上。

bind(window, "resize", function(){ 
clip.reposition(); 
});

bind 是一个跨浏览器的事件绑定函数。
=========================================================
这个想必大家都已知道。IE 的事件绑定函数是 attachEvent;而 Firefox, Safari 是 addEventListener;Opera 则两种都支持。下面进行封装。
/************************************ 
* 添加事件绑定 
* @param obj : 要绑定事件的元素 
* @param type : 事件名称。不加 "on". 如 : "click" 而不是 "onclick". 
* @param fn : 事件处理函数 
************************************/ 
function bind( obj, type, fn ) { 
if ( obj.attachEvent ) { 
obj['e'+type+fn] = fn; 
obj[type+fn] = function(){obj['e'+type+fn]( window.event );} 
obj.attachEvent( 'on'+type, obj[type+fn] ); 
} else 
obj.addEventListener( type, fn, false ); 
}

例如添加一个页面点击事件:
bind(document, "click", function() { 
alert("Hello, World!!"); 
});

=========================================================
hide() 和 show() 方法
这两个方法可以隐藏和显示 Flash 按钮 。其中 show() 方法会调用 reposition() 方法。

setCSSEffects() 方法
当鼠标移到按钮上或点击时,由于有 Flash 按钮的遮挡,所以像 css ":hover", ":active" 等伪类可能会失效。setCSSEffects() 方法就是解决这个问题。首先我们需要将伪类改成类,比如:

#copy-botton:hover{ 
border-color:#FF6633; 
} 
// 可以改成下面的 ":hover" 改成 ".hover" 
#copy-botton.hover{ 
border-color:#FF6633; 
}

我们可以调用 clip.setCSSEffects( true ); 这样 Zero Clipboard 会自动为我们处理:将类 .hover 当成伪类 :hover 。

getHTML() 方法
如果你想自己实例一个 Flash ,不用 Zero Clipboard 的附着方法,那么这个方法就可以帮上忙了。它接受两个参数,分别为 Flash 的宽度和高度。返回的是 Flash 对应的 HTML 代码。例如:

var html = clip.getHTML( 150, 20 );
你可以用 innerHTML 或直接 document.write(); 进行输出。
以下是我测试下输出的 HTML 代码:

<embed id="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 中。

Zero Clipboard 事件处理
Zero Clipboard 提供了一些事件,你可以自定义函数处理这些事件。Zero Clipboard 事件处理函数为 addEventListener(); 例如当 Flash 完全载入后会触发一个事件 "load" 。

clip.addEventListener( "load", function(client) {
alert("Flash 加载完毕!");
});
Zero Clipboard 会将 clip 对象作为参数传入。即上例中的 "client" 。
还有 "load" 也可以写成 "onLoad",其他的事件也可以这样。

其他事件还包括:

mouseOver 鼠标移上事件
mouseOut 鼠标移出事件
mouseDown 鼠标按下事件
mouseUp 鼠标松开事件
complete 复制成功事件
其中 mouseOver 事件和 complete 事件比较常用。
前面说过,如果需要动态改变待复制的内容,那 mouseOver 事件就可以派上用场了。例如需要动态复制一个 id 为 test 的输入框中的值,我们可以在鼠标 over 的时候重新设置值。

clip.addEventListener( "mouseOver", function(client) {
var test = document.getElementById("test");
client.setText( test.value ); // 重新设置要复制的值
});
复制成功:

clip.addEventListener( "complete", function(){
alert("复制成功!");
});
好了,就介绍到这里吧。赶快自己试验下吧。

Javascript 相关文章推荐
JavaScript中读取和保存文件实例
May 08 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
Jan 09 Javascript
iScroll中事件点击触发两次解决方案
Mar 11 Javascript
jquery实现很酷的网页顶部图标下拉菜单效果
Aug 22 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
Sep 27 Javascript
微信小程序  wx.request合法域名配置详解
Nov 23 Javascript
BootStrap整体框架之基础布局组件
Dec 15 Javascript
微信小程序实战之自定义模态弹窗(8)
Apr 18 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
Sep 19 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
May 04 Javascript
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
Aug 03 Javascript
浅谈react路由传参的几种方式
Mar 23 Javascript
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
Mar 07 #Javascript
javascript实现面向对象类的功能书写技巧
Mar 07 #Javascript
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
Mar 07 #Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
Mar 05 #Javascript
Jquery Validation插件防止重复提交表单的解决方法
Mar 05 #Javascript
javascript下判断一个元素是否存在的代码
Mar 05 #Javascript
ExtJs扩展之GroupPropertyGrid代码
Mar 05 #Javascript
You might like
phpmyadmin的#1251问题
2006/11/25 PHP
PHP使用CURL模拟登录的方法
2015/07/08 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
2016/10/10 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
js 判断计算字符串长度/判断空的简单方法
2013/08/05 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
2014/05/11 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
Angular发布1.5正式版,专注于向Angular 2的过渡
2016/02/18 Javascript
JavaScript实现显示函数调用堆栈的方法
2016/04/21 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
2016/08/02 Javascript
JSON字符串和JSON对象相互转化实例详解
2017/01/05 Javascript
vue.js中指令Directives详解
2017/03/20 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
基于Angular 8和Bootstrap 4实现动态主题切换的示例代码
2020/02/11 Javascript
Vue proxyTable配置多个接口地址,解决跨域的问题
2020/09/11 Javascript
django使用xlwt导出excel文件实例代码
2018/02/06 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
浅谈Python的方法解析顺序(MRO)
2020/03/05 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
2020/11/22 Python
html5各种页面切换效果和模态对话框用法总结
2014/12/15 HTML / CSS
美国购买当代和现代家具网站:MODTEMPO
2018/07/20 全球购物
Linux面试题LINUX系统类
2015/11/25 面试题
房务中心文员岗位职责
2014/04/16 职场文书
春季防火方案
2014/05/10 职场文书
学校捐书活动总结
2015/05/08 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL