飘易博客(作者:Flymorn)
订阅《飘易博客》RSS,第一时间查看最新文章!
飘易首页 | 留言本 | 关于我 | 订阅Feed

JS复制内容到剪贴板: 兼容IE、Firefox、Chrome、Safari所有浏览器

Author:飘易 Source:飘易
Categories:网站设计 PostTime:2011-9-14 10:19:09
正 文:
    现在浏览器种类也越来越多,诸如 IE、Firefox、Chrome、Safari等等,因此现在要实现一个js复制内容到剪贴板的小功能就不是一件那么容易的事了。

    在FLASH 9 时代,有一个通杀所有浏览器的js复制内容到剪贴板的方案

    这个方案是一个最流行的方法: 著名的Clipboard Copy解决方案 利用一个clipboard.swf作为桥梁,复制内容到剪贴板。
    原理是:创建一个隐藏的flash文件,同时给给flash的变量FlashVars 赋值“clipboard=..”,通过这个赋值flash就会把复制的内容放到剪贴板。这个方法兼容IE、Firefox、Opera、chrome、 Safari,真可谓“万能”的解决方案。浏览器Flash的安装率非常高,这几乎是一个完美的解决方案。

JS部分:
<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>

HTML部分:
<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>

    clipboard.swf 的下载地址:_clipboard.rar.rar

    但是 Flash 10 时代,上面的方法已经不行了。
    因为flash10中规定了只有在swf上进行了真实的操作(比如鼠标点击)才能访问剪切板,而上述方法只是使用了一个隐藏的swf文件,通过javascript操作flash的剪贴板,用户并没有对swf文件进行真实的操作,因此这个方法也就失效了。

    那么如何解决这个“真实操作”的问题呢?可以使用一个JavaScript库:Zero Clipboard,利用这个js库可以支持利用flash 10 实现复制到剪贴板。这个方法原理是在一个透明的flash(对用户来说是不可见的)上覆盖一个dom元素比如button或div,当点击这个dom时,实际点击的是flash,从而访问flash的剪贴板。

    飘易拿来我调试好的小例子:
<html>
<head>
<title>Zero Clipboard Test</title>
<script type="text/javascript" src="ZeroClipboard.js"></script>
<script language="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=复制内容文本1 >
<span id="clip_container"><span id="clip_button"><b>复制</b></span></span>
</body>
</html>

    飘易提供的例子下载:zeroclipboard.rar

    调试时请上传到网站,本地直接打开flash会出错的,没权限。zeroClipboard.js文件里moviePath属性是falsh的地址,就是目录下的那个ZeroClipboard.swf存放的地址位置。

    这种js复制内容到剪贴板的方案可支持浏览器:Firefox / IE / opera / chorme / safari 所有浏览器!

参考:
http://it.nekounya.com/javascript-ie-firefox-compatible-copy-to-clipboard.html
http://www.watch-life.net/javascript/copy-to-clipboard-solution.html
http://www.cnwebskill.com/Web_230.aspx
作者:飘易
来源:飘易
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
上一篇:C#使用Dotfuscator混淆代码的加密方法
下一篇:TweetRobots:Twitter批量注册工具!
6条评论 “JS复制内容到剪贴板: 兼容IE、Firefox、Chrome、Safari所有浏览器”
2011-9-15 14:33:35
学过一段时间的js,没学会的
2 小熊
2012-3-25 12:53:10
飘易大哥,你就是我心目中的神,无论什么解决不了的难题,看了你的博客都解决了,膜拜
2013-7-29 9:27:20
flash 不是一个完美的方案
2013-8-22 14:58:17
zeroClipboard,可不可以初始给剪切板赋值? 不点击控件
5 felix
2014-7-4 11:40:39
flash 方案其实是个不错的方法,就目前而言,这个方案能解决几乎所有的浏览器兼容问题,当然,隐患就是随着flash 的不断升级,可能会导致一些问题,但是那应该是很久以后的事情了
6 robinson
2016-6-20 18:07:08
电脑端兼容性不错,手机端不行,现在的手机不支持flash
发表评论
名称(*必填)
邮件(选填)
网站(选填)

记住我,下次回复时不用重新输入个人信息
© 2007-2019 飘易博客 Www.Piaoyi.Org 原创文章版权由飘易所有