昨天注册了Bloggerwave,在后台操作的时候,发现他的js脚本复制到剪贴板居然在FireFox下有效,这可是我第一次发现复制到剪贴板这样的代码在FF下有效,当然IE就不用说了,js在IE下操作剪贴板还是很容易的。后来我就查看了他的源代码,发现人家采用了一个巧妙的方法,那就是利用flash作为跳板来完成此功能,具体代码如下:
- <script type="text/javascript">
- function CopyText(id)
- {
- //copyToClipboard(document.getElementById(id).value);
- }
- if (window.clipboardData) {
- window.clipboardData.setData("Text",text2copy);
- } else {
- var flashcopier = 'flashcopier';
- if(!document.getElementById(flashcopier)) {
- var divholder = document.createElement('div');
- divholder.id = flashcopier;
- document.body.appendChild(divholder);
- }
- document.getElementById(flashcopier).innerHTML = '';
- var divinfo = '<embed src="_clipboard.swf" FlashVars="clipboard='+escape(text2copy)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';//这里是关键
- document.getElementById(flashcopier).innerHTML = divinfo;
- alert('Text copied');
- }
- }
- function copyToClipboard(meintext)
- {
- if (window.clipboardData)
- {
- alert("ie");
- // the IE-manier
- window.clipboardData.setData("Text", meintext);
- // waarschijnlijk niet de beste manier om Moz/NS te detecteren;
- // het is mij echter onbekend vanaf welke versie dit precies werkt:
- }
- else if (window.netscape)
- {
- // dit is belangrijk maar staat nergens duidelijk vermeld:
- // you have to sign the code to enable this, or see notes below
- netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
- // maak een interface naar het clipboard
- var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
- if (!clip) return;
- alert("mozilla");
- // maak een transferable
- var trans = Components.classes['@mozilla.org/widget/transferable;1']
- .createInstance(Components.interfaces.nsITransferable);
- if (!trans) return;
- // specificeer wat voor soort data we op willen halen; text in dit geval
- trans.addDataFlavor('text/unicode');
- // om de data uit de transferable te halen hebben we 2 nieuwe objecten
- // nodig om het in op te slaan
- var str = new Object();
- var len = new Object();
- var str = Components.classes["@mozilla.org/supports-string;1"]
- .createInstance(Components.interfaces.nsISupportsString);
- var copytext=meintext;
- str.data=copytext;
- trans.setTransferData("text/unicode",str,copytext.length*2);
- var clipid=Components.interfaces.nsIClipboard;
- if (!clip) return false;
- clip.setData(trans,null,clipid.kGlobalClipboard);
- }
- alert("Following info was copied to your clipboard:\n\n" + meintext);
- return false;
- }
- </script>
下面是测试代码:
- <input type="text" id="mm" name="mm" value="test" /><input type="button" onclick='CopyText("mm")' value="copy" />
请保证该swf文件:_clipboard.swf 和你测试页面在同一个目录下!
下面是bloggerwave的付费评论的内容,看能否再此页面通过
masterseek
该日志未加标签

前4排已经被占据了 快抢好位置哦
这个我试过了,复制英文时没有问题,但在我这里复制中文会变为十六进制代码:(
[quote]这个我试过了,复制英文时没有问题,但在我…[/quote]确实存在这个问题,应该是flash里面处理的问题,修改js似乎没有用
不要写escape函数就行了,这样中文就没问题了.
太好了,it’s nice of you !thank you !