兼容主流浏览器的JS复制内容到剪贴板
本文介绍在Flash时代实现JS复制内容到剪贴板的两种主流方案。首先解析利用clipboard.swf的Flash 9通用方法,随后针对Flash 10的安全限制,详解Zero Clipboard库如何通过透明Flash覆盖DOM元素解决真实操作问题,并提供完整代码示例与兼容性说明。
Flash 9时代的通用解决方案
随着浏览器种类的日益增多,包括IE、Firefox、Chrome和Safari等,实现一个能够兼容所有浏览器的JavaScript复制内容到剪贴板的功能变得颇具挑战性。
在Flash 9时期,存在一种能够通杀所有浏览器的JavaScript复制内容到剪贴板的解决方案。
该方案采用了一种广受欢迎的方法,即著名的Clipboard Copy解决方案。它通过一个名为clipboard.swf的Flash文件作为中介,将内容复制到剪贴板。
其工作原理是创建一个隐藏的Flash文件,并通过给FlashVars变量赋值“clipboard=..”来传递内容。Flash接收到赋值后,会将内容放入剪贴板。此方法兼容IE、Firefox、Opera、Chrome和Safari,堪称“万能”解决方案。鉴于浏览器中Flash的安装率极高,这几乎是一个完美的方案。
具体实现代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Web开发者 - www.Admin10000.com </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
var clipboardswfdata;
var setcopy_gettext = function(){
clipboardswfdata = document.getElementById('test_text').value;
//alert(clipboardswfdata);
window.document.clipboardswf.SetVariable('str', clipboardswfdata);
}
var floatwin = function(){
alert('复制成功!');
//document.getElementById('clipinner').style.display = 'none';
}
</script>
</head>
<body>
<textarea id="test_text" rows="15" cols="100">文本內容.......</textarea>
<div id="clipboard_content">
<div class="my_clip_button"><span class="clipinner" id="clipinner">复制代码到剪切板
<embed name="clipboardswf" class="clipboardswf" id="clipboardswf" onmouseover="setcopy_gettext()" devicefont="false" src="./_clipboard.swf" menu="false" allowscriptaccess="sameDomain" swliveconnect="true" wmode="transparent" type="application/x-shockwave-flash" height="20" width="100">
</span>
</div>
</div>
</body>
</html>
clipboard.swf 的下载地址:http://www.jeffothy.com/weblog/uploads/clipboard.php
Flash 10的限制与Zero Clipboard方案
然而,进入Flash 10时代后,上述方法不再适用。
这是因为Flash 10规定,只有在swf文件上进行了真实操作(如鼠标点击)才能访问剪贴板。而前述方法仅使用了一个隐藏的swf文件,通过JavaScript操作Flash的剪贴板,用户并未对swf文件进行真实操作,因此该方法失效。
为解决这一“真实操作”问题,可以使用一个JavaScript库:Zero Clipboard。利用该库,可以在Flash 10环境下实现复制功能。其原理是在一个透明的Flash(对用户不可见)上覆盖一个DOM元素(如button或div)。当用户点击该DOM时,实际点击的是Flash,从而访问Flash的剪贴板。
以下是经过调试的例子:
具体代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Zero Clipboard Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="ZeroClipboard.js"></script>
<script type="javaScript">
var clip = null;
function $(id) { return document.getElementById(id); }
function init() {
clip = new ZeroClipboard.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="复制内容文本">
<span id="clip_container"><span id="clip_button"><strong>复制</strong></span></span>
</body>
</html>
点击下载该类库: https://www.jb51.net/jiaoben/24961.html
调试时请上传到网站,本地直接打开flash会出错的,没权限。zeroClipboard.js文件里moviePath属性是falsh的地址,就是目录下的那个ZeroClipboard.swf存放的地址位置。
这种js复制内容到剪贴板的方案可支持浏览器:Firefox / IE / opera / chorme / safari 所有浏览器!
js-cookie 安装与基础用法:set、get、remove 详解
2026-11-05 16:35:06
适合JavaScript初学者的实战项目:制作简易待办事项列表
2026-11-05 16:17:07
JS打开新标签页时怎么通过URL传递参数
2026-11-05 12:21:08
sigma.js 自定义节点样式:设置颜色、大小及标签显示的技巧
2026-11-05 09:55:00
JS 生成的统计图怎么导出为 PNG 图片或 PDF 文件?
2026-11-05 09:37:58
