web 开发中常常要实现 "复制到剪切板" 功能。这个功能很实用,但是由于安全问题,浏览器的限制越来越严,实现的方法也越来越有限了。Firefox 默认下不能直接通过 Javascript 操作剪切板,必须开启相关的设置才行。想只通过 Javascript 技术实现跨浏览器 的剪切板是行不通的。现在常用的方法是利用 JavaScript+Flash实现,普遍流传的办法是 _clipboard.swf,这是国外最早实现的(著名的 Clipboard Copy 解决方案: http://www.jeffothy.com/weblog/clipboard-copy/)。但是很可惜,_clipboard.swf 在新出来的 flash10 中无效,因为 Flash10 中规定了只有在 swf 上进行了实际的操作(比如鼠标点击)才能启动剪切板。而 _clipboard.swf 方法的 swf 是隐藏的,通过 JavaScript 来操作 flash 的剪切板,显然没有对 swf 进行实际的用户操作。
[js]
function copy(v_str , tip_obj) {
copy_clip(v_str);
}
function copy_clip(text2copy) {
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="/img/_clipboard.swf" FlashVars="clipboard='+escape(text2copy)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
document.getElementById(flashcopier).innerHTML = divinfo;
}
return true;
}
function copyToClipboard(txt) {
if (window.clipboardData) {
window.clipboardData.clearData();
window.clipboardData.setData("Text", txt);
} else if (navigator.userAgent.indexOf("Opera") != -1) {
window.location = txt;
} else if (window.netscape) {
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
} catch (e) {
alert("您的firefox安全限制限制您进行剪贴板操作,请打开'about:config'将signed.applets.codebase_principal_support'设置为true'之后重试");
return false;
}
var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
if (!clip)
return false;
var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
if (!trans)
return false;
trans.addDataFlavor('text/unicode');
var str = new Object();
var len = new Object();
var str = Components.classes['@mozilla.org/supports-string;1'].createInstance(Components.interfaces.nsISupportsString);
var copytext = txt;
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);
}
return true;
}
[/js]
最近国外出现了一种新的方法,而且专门做了一个 JavaScript 库 Zero Clipboard ,它包含一个 flash 影片和一个 JavaScript 接口,这个 flash 是透明的(不是隐藏),用户不会察觉到它的存在。这个 flash 覆盖在一个 DOM元素上,比如 button,div之类,当点击这个 DOM 时,你实际点击的是这个 flash,这个作用在 flash 上的动作能够开启 flash 的剪切板。这实际上就是一种 clickjacking。
DEMO页面 : http://bowser.macminicolo.net/~jhuckaby/zeroclipboard/
Zero Clipboard项目主页: http://code.google.com/p/zeroclipboard/
没有评论 :
发表评论