JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)


Posted in Javascript onMay 27, 2013

目前,如果使用javascript来写复制到剪贴板的代码,一般都是浏览器不兼容的。所以采用flash的方式,模拟一个层,再来复制,就可以做到全部浏览器都适用哦~

需要下载一个swf文件,和一个js文件。把这两个文件,和htm放到一起。
图示:

JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)


必须放在服务器端使用哦。
图示:

JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)


JS代码:
ZeroClipboard.js 
// Simple Set Clipboard System 
// Author: Joseph Huckaby 
var ZeroClipboard = { 
version: "1.0.7", 
clients: {}, // registered upload clients on page, indexed by id 
moviePath: 'ZeroClipboard.swf', // URL to movie 
nextId: 1, // ID of next movie 
$: function(thingy) { 
// simple DOM lookup utility function 
if (typeof(thingy) == 'string') thingy = document.getElementById(thingy); 
if (!thingy.addClass) { 
// extend element with a few useful methods 
thingy.hide = function() { this.style.display = 'none'; }; 
thingy.show = function() { this.style.display = ''; }; 
thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; }; 
thingy.removeClass = function(name) { 
var classes = this.className.split(/\s+/); 
var idx = -1; 
for (var k = 0; k < classes.length; k++) { 
if (classes[k] == name) { idx = k; k = classes.length; } 
} 
if (idx > -1) { 
classes.splice( idx, 1 ); 
this.className = classes.join(' '); 
} 
return this; 
}; 
thingy.hasClass = function(name) { 
return !!this.className.match( new RegExp("\\s*" + name + "\\s*") ); 
}; 
} 
return thingy; 
}, 
setMoviePath: function(path) { 
// set path to ZeroClipboard.swf 
this.moviePath = path; 
}, 
dispatch: function(id, eventName, args) { 
// receive event from flash movie, send to client 
var client = this.clients[id]; 
if (client) { 
client.receiveEvent(eventName, args); 
} 
}, 
register: function(id, client) { 
// register new client to receive events 
this.clients[id] = client; 
}, 
getDOMObjectPosition: function(obj, stopObj) { 
// get absolute coordinates for dom element 
var info = { 
left: 0, 
top: 0, 
width: obj.width ? obj.width : obj.offsetWidth, 
height: obj.height ? obj.height : obj.offsetHeight 
}; 
while (obj && (obj != stopObj)) { 
info.left += obj.offsetLeft; 
info.top += obj.offsetTop; 
obj = obj.offsetParent; 
} 
return info; 
}, 
Client: function(elem) { 
// constructor for new simple upload client 
this.handlers = {}; 
// unique ID 
this.id = ZeroClipboard.nextId++; 
this.movieId = 'ZeroClipboardMovie_' + this.id; 
// register client with singleton to receive flash events 
ZeroClipboard.register(this.id, this); 
// create movie 
if (elem) this.glue(elem); 
} 
}; 
ZeroClipboard.Client.prototype = { 
id: 0, // unique ID for us 
ready: false, // whether movie is ready to receive events or not 
movie: null, // reference to movie object 
clipText: '', // text to copy to clipboard 
handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor 
cssEffects: true, // enable CSS mouse effects on dom container 
handlers: null, // user event handlers 
glue: function(elem, appendElem, stylesToAdd) { 
// glue to DOM element 
// elem can be ID or actual DOM element object 
this.domElement = ZeroClipboard.$(elem); 
// float just above object, or zIndex 99 if dom element isn't set 
var zIndex = 99; 
if (this.domElement.style.zIndex) { 
zIndex = parseInt(this.domElement.style.zIndex, 10) + 1; 
} 
if (typeof(appendElem) == 'string') { 
appendElem = ZeroClipboard.$(appendElem); 
} 
else if (typeof(appendElem) == 'undefined') { 
appendElem = document.getElementsByTagName('body')[0]; 
} 
// find X/Y position of domElement 
var box = ZeroClipboard.getDOMObjectPosition(this.domElement, appendElem); 
// create floating DIV above element 
this.div = document.createElement('div'); 
var style = this.div.style; 
style.position = 'absolute'; 
style.left = '' + box.left + 'px'; 
style.top = '' + box.top + 'px'; 
style.width = '' + box.width + 'px'; 
style.height = '' + box.height + 'px'; 
style.zIndex = zIndex; 
if (typeof(stylesToAdd) == 'object') { 
for (addedStyle in stylesToAdd) { 
style[addedStyle] = stylesToAdd[addedStyle]; 
} 
} 
// style.backgroundColor = '#f00'; // debug 
appendElem.appendChild(this.div); 
this.div.innerHTML = this.getHTML( box.width, box.height ); 
}, 
getHTML: function(width, height) { 
// return HTML for movie 
var html = ''; 
var flashvars = 'id=' + this.id + 
'&width=' + width + 
'&height=' + height; 
if (navigator.userAgent.match(/MSIE/)) { 
// IE gets an OBJECT tag 
var protocol = location.href.match(/^https/i) ? 'https://' : 'http://'; 
html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><param name="wmode" value="transparent"/></object>'; 
} 
else { 
// all other browsers get an EMBED tag 
html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />'; 
} 
return html; 
}, 
hide: function() { 
// temporarily hide floater offscreen 
if (this.div) { 
this.div.style.left = '-2000px'; 
} 
}, 
show: function() { 
// show ourselves after a call to hide() 
this.reposition(); 
}, 
destroy: function() { 
// destroy control and floater 
if (this.domElement && this.div) { 
this.hide(); 
this.div.innerHTML = ''; 
var body = document.getElementsByTagName('body')[0]; 
try { body.removeChild( this.div ); } catch(e) {;} 
this.domElement = null; 
this.div = null; 
} 
}, 
reposition: function(elem) { 
// reposition our floating div, optionally to new container 
// warning: container CANNOT change size, only position 
if (elem) { 
this.domElement = ZeroClipboard.$(elem); 
if (!this.domElement) this.hide(); 
} 
if (this.domElement && this.div) { 
var box = ZeroClipboard.getDOMObjectPosition(this.domElement); 
var style = this.div.style; 
style.left = '' + box.left + 'px'; 
style.top = '' + box.top + 'px'; 
} 
}, 
setText: function(newText) { 
// set text to be copied to clipboard 
this.clipText = newText; 
if (this.ready) this.movie.setText(newText); 
}, 
addEventListener: function(eventName, func) { 
// add user event listener for event 
// event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel 
eventName = eventName.toString().toLowerCase().replace(/^on/, ''); 
if (!this.handlers[eventName]) this.handlers[eventName] = []; 
this.handlers[eventName].push(func); 
}, 
setHandCursor: function(enabled) { 
// enable hand cursor (true), or default arrow cursor (false) 
this.handCursorEnabled = enabled; 
if (this.ready) this.movie.setHandCursor(enabled); 
}, 
setCSSEffects: function(enabled) { 
// enable or disable CSS effects on DOM container 
this.cssEffects = !!enabled; 
}, 
receiveEvent: function(eventName, args) { 
// receive event from flash 
eventName = eventName.toString().toLowerCase().replace(/^on/, ''); 
// special behavior for certain events 
switch (eventName) { 
case 'load': 
// movie claims it is ready, but in IE this isn't always the case... 
// bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function 
this.movie = document.getElementById(this.movieId); 
if (!this.movie) { 
var self = this; 
setTimeout( function() { self.receiveEvent('load', null); }, 1 ); 
return; 
} 
// firefox on pc needs a "kick" in order to set these in certain cases 
if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) { 
var self = this; 
setTimeout( function() { self.receiveEvent('load', null); }, 100 ); 
this.ready = true; 
return; 
} 
this.ready = true; 
this.movie.setText( this.clipText ); 
this.movie.setHandCursor( this.handCursorEnabled ); 
break; 
case 'mouseover': 
if (this.domElement && this.cssEffects) { 
this.domElement.addClass('hover'); 
if (this.recoverActive) this.domElement.addClass('active'); 
} 
break; 
case 'mouseout': 
if (this.domElement && this.cssEffects) { 
this.recoverActive = false; 
if (this.domElement.hasClass('active')) { 
this.domElement.removeClass('active'); 
this.recoverActive = true; 
} 
this.domElement.removeClass('hover'); 
} 
break; 
case 'mousedown': 
if (this.domElement && this.cssEffects) { 
this.domElement.addClass('active'); 
} 
break; 
case 'mouseup': 
if (this.domElement && this.cssEffects) { 
this.domElement.removeClass('active'); 
this.recoverActive = false; 
} 
break; 
} // switch eventName 
if (this.handlers[eventName]) { 
for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) { 
var func = this.handlers[eventName][idx]; 
if (typeof(func) == 'function') { 
// actual function reference 
func(this, args); 
} 
else if ((typeof(func) == 'object') && (func.length == 2)) { 
// PHP style object + method, i.e. [myObject, 'myMethod'] 
func[0][ func[1] ](this, args); 
} 
else if (typeof(func) == 'string') { 
// name of function 
window[func](this, args); 
} 
} // foreach event handler defined 
} // user defined handler for event 
} 
};

html代码:
a.htm 
<html> 
<head> 
<title>Zero Clipboard Test</title> 
<style type="text/css"> 
body { font-family:arial,sans-serif; font-size:9pt; } 
.my_clip_button { width:150px; text-align:center; border:1px solid black; background-color:#ccc; margin:10px; padding:10px; cursor:default; font-size:9pt; } 
.my_clip_button.hover { background-color:#eee; } 
.my_clip_button.active { background-color:#aaa; } 
</style> 
</head> 
<body> 
<div id="d_clip_container" style="position:relative"> 
<div id="d_clip_button" class="my_clip_button"><b>Copy To Clipboard...</b></div> 
</div> 
<textarea id="myresource" class="clearfix" onChange="clip.setText(this.value)">我复制</textarea> 
<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('load', function (client) { 
debugstr("Flash movie loaded and ready."); 
}); 
clip.addEventListener('mouseOver', function (client) { 
// update the text on mouse over 
clip.setText( $('myresource').value ); 
}); 
clip.addEventListener('complete', function (client, text) { 
debugstr("Copied text to clipboard: " + text ); 
}); 
clip.glue( 'd_clip_button', 'd_clip_container' ); 
} 
setTimeout(function(){ 
init(); 
},1500); 
</script> 
</body> 
</html>

flash文件请自己到网上下载哈~
Javascript 相关文章推荐
JavaScript 自动完成脚本整理(33个)
Oct 20 Javascript
jquery.boxy插件的iframe扩展代码
Jul 02 Javascript
JavaScript判断变量是否为undefined的两种写法区别
Dec 04 Javascript
jQuery的animate函数实现图文切换动画效果
May 03 Javascript
基于JS实现的倒计时程序实例
Jul 24 Javascript
js实时获取并显示当前时间的方法
Jul 31 Javascript
JS实现根据密码长度显示安全条功能
Mar 08 Javascript
React利用插件和不用插件实现双向绑定的方法详解
Jul 03 Javascript
vue将单页面改造成多页面应用的方法
Nov 25 Javascript
vue router 传参获取不到的解决方式
Nov 13 Javascript
JavaScript Event Loop相关原理解析
Jun 10 Javascript
使用vue实现通过变量动态拼接url
Jul 22 Javascript
jQuery数据缓存功能的实现思路及简单模拟
May 27 #Javascript
jQuery函数的等价原生函数代码示例
May 27 #Javascript
JS HTML5 音乐天气播放器(Ajax获取天气信息)
May 26 #Javascript
jQuery动态地获取系统时间实现代码
May 24 #Javascript
JavaScript事件处理器中的event参数使用介绍
May 24 #Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
May 24 #Javascript
js过滤HTML标签以及空格的思路及代码
May 24 #Javascript
You might like
地摊中国 - 珍藏老照片
2020/08/18 杂记
织梦模板标记简介
2007/03/11 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
js返回上一页并刷新的多种实现方法
2014/02/26 Javascript
jquery中子元素和后代元素的区别示例介绍
2014/04/02 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
浅谈javascript实现八大排序
2015/04/27 Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
2015/11/25 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
微信小程序 轮播图实现原理及优化详解
2019/09/29 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
python基础教程之基本内置数据类型介绍
2014/02/20 Python
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
简单实现python爬虫功能
2015/12/31 Python
python删除字符串中指定字符的方法
2018/08/13 Python
浅谈Python中的bs4基础
2018/10/21 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
Python socket实现多对多全双工通信的方法
2019/02/13 Python
Python+Selenium使用Page Object实现页面自动化测试
2019/07/14 Python
css3动画鼠标放上图片逐渐变大鼠标离开图片逐渐缩小效果
2021/01/27 HTML / CSS
中国跨镜手机配件批发在线商店:TVC-Mall
2019/08/20 全球购物
英国领先的新鲜松露和最好的松露产品供应商:TruffleHunter
2019/08/26 全球购物
为什么要有struct关键字
2012/05/08 面试题
什么是View State?
2013/01/27 面试题
个人找工作求职简历的自我评价
2013/10/20 职场文书
大学生村官心得体会范文
2014/01/04 职场文书
2014年档案管理工作总结
2014/11/17 职场文书
关于感谢信的范文
2015/01/23 职场文书
关于长城的导游词
2015/01/30 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
在职证明书模板
2015/06/15 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
如何使用php生成zip压缩包
2021/04/21 PHP
Oracle更换为MySQL遇到的问题及解决
2021/05/21 Oracle