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 基础篇之运算符、语句(二)
Apr 07 Javascript
基于socket.io和node.js搭建即时通信系统
Jul 30 Javascript
javascript格式化指定日期对象的方法
Apr 21 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
Jun 12 Javascript
jquery实用技巧之输入框提示语句
Jul 28 Javascript
遍历json 对象的属性并且动态添加属性的实现
Dec 02 Javascript
BootStrap Fileinput初始化时的一些参数
Dec 30 Javascript
Jquery把获取到的input值转换成json
May 15 jQuery
input type=file 选择图片并且实现预览效果的实例
Oct 26 Javascript
vue2.0 移动端实现下拉刷新和上拉加载更多的示例
Apr 23 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
Jan 15 jQuery
vue 子组件watch监听不到prop的解决
Aug 09 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
用PHP编写PDF文档生成器
2006/10/09 PHP
Thinkphp关闭缓存的方法
2015/06/26 PHP
JavaScript 常用函数库详解
2009/10/21 Javascript
jquery蒙版控件实现代码
2010/12/08 Javascript
js设置function参数默认值(适合没有传参情况)
2014/02/24 Javascript
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
php register_shutdown_function函数详解
2017/07/23 Javascript
Angular指令之restict匹配模式的详解
2017/07/27 Javascript
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
Python中的Classes和Metaclasses详解
2015/04/02 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
2018/05/18 Python
目前最全的python的就业方向
2018/06/05 Python
opencv python 傅里叶变换的使用
2018/07/21 Python
Python numpy.array()生成相同元素数组的示例
2018/11/12 Python
django使用LDAP验证的方法示例
2018/12/10 Python
python交换两个变量的值方法
2019/01/12 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
python和go语言的区别是什么
2020/07/20 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
Blue Nile中国官网:全球知名的钻石和珠宝网络零售商
2020/03/22 全球购物
物流管理应届生求职信
2013/11/07 职场文书
2014年乡镇人大工作总结
2014/11/25 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
2014年班级工作总结范文
2014/12/23 职场文书
财务人员岗位职责
2015/02/03 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
爱国主义主题班会
2015/08/14 职场文书
导游词之平津战役纪念馆
2019/11/04 职场文书
Go语言读取txt文档的操作方法
2022/01/22 Golang
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python
Win11 BitLocker 驱动器加密
2022/04/19 数码科技