JavaScript flash复制库类 Zero Clipboard


Posted in Javascript onJanuary 17, 2011

本文将介绍一个跨浏览器的库类 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 : [主页] [下载] [演示]
核心功能
第一步,导入 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 是一个跨浏览器的事件绑定函数。详情请见4个跨浏览器必备的函数 。
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 相关文章推荐
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
Jan 01 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
Aug 09 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
Jan 22 Javascript
浅谈JavaScript中Date(日期对象),Math对象
Feb 05 Javascript
基于jquery实现ajax无刷新评论
Aug 19 Javascript
Bootstrap table分页问题汇总
May 30 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
Nov 20 Javascript
JavaScript &amp; jQuery完美判断图片是否加载完毕
Jan 08 Javascript
javascript 使用正则test( )第一次是 true,第二次是false
Feb 22 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
Apr 21 Javascript
Vue.js 事件修饰符的使用教程
Nov 01 Javascript
详解在Node.js中发起HTTP请求的5种方法
Jan 10 Javascript
C#中TrimStart,TrimEnd,Trim在javascript上的实现
Jan 17 #Javascript
js 数据类型转换总结笔记
Jan 17 #Javascript
简短几句 通俗解释javascript的闭包
Jan 17 #Javascript
javascript 内存回收机制理解
Jan 17 #Javascript
javascript 延迟加载技术(lazyload)简单实现
Jan 17 #Javascript
关于COOKIE个数与大小的问题
Jan 17 #Javascript
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
Jan 17 #Javascript
You might like
计数器详细设计
2006/10/09 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
2016/03/18 PHP
php微信公众平台开发(四)回复功能开发
2016/12/06 PHP
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
jQuery事件绑定用法详解
2016/09/08 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
Angular PWA使用的Demo示例
2019/01/31 Javascript
JavaScript eval()函数定义及使用方法详解
2020/07/07 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
学习python处理python编码问题
2011/03/13 Python
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
python非递归全排列实现方法
2017/04/10 Python
Python数据持久化shelve模块用法分析
2018/06/29 Python
Python中的Django基本命令实例详解
2018/07/15 Python
python中将正则过滤的内容输出写入到文件中的实例
2018/10/21 Python
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
python爬虫-模拟微博登录功能
2019/09/12 Python
python如何实现复制目录到指定目录
2020/02/13 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
Python urlopen()参数代码示例解析
2020/12/10 Python
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
bonprix匈牙利:女士、男士和儿童服装
2019/07/19 全球购物
Araks官网:纽约内衣品牌
2020/10/15 全球购物
母亲节感恩活动记录
2014/03/16 职场文书
房地产开发项目建议书
2014/05/16 职场文书
2016年公司“3.12”植树节活动总结
2016/03/16 职场文书
三年级作文之趣事作文
2019/11/04 职场文书
Python基础之元编程知识总结
2021/05/23 Python
Python基础 括号()[]{}的详解
2021/11/07 Python
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript