jQuery ZeroClipboard中Flash定位不准确的解决方案

转自波斯马,原文地址《jQuery ZeroClipboard中Flash定位不准确的解决方案

jQuery ZeroClipboard支持在多种浏览器中复制内容到剪贴板,IE、Firefox、Chrome等等都不在话下。其本身作为jQuery的一个插件封装了Zero Clioborad,其实现原理就是在要点击的按钮或链接上覆盖一个透明的Flash,实际上用户点击的是Flash,复制到剪贴板也是通过此Flash实现的。

大家用的很Happy,但是我用的时候发现点击按钮没有反应,后来发现是Flash出现的位置不对,可能原作者写的时候没有在复杂的样式环境下测试过。Flash的位置是动态设定的,找到其源码查看,发现一处可能有问题的地方:

 1 getDOMObjectPosition: function (obj, stopObj) {
 2 // get absolute coordinates for dom element
 3 var info = {
 4 left: 0,
 5 top: 0,
 6 width: obj.width ? obj.width : obj.offsetWidth,
 7 height: obj.height ? obj.height : obj.offsetHeight
 8 };
 9 
10 if (obj && (obj != stopObj)) {
11 info.left += obj.offsetLeft;
12 info.top += obj.offsetTop;
13 }
14 
15 return info;
16 },

注意下边这两句:

info.left += obj.offsetLeft;
info.top += obj.offsetTop;

obj.offsetTop 指 obj 距离上方或上层控件的位置,整型,单位像素;obj.offsetLeft 指 obj 距离左方或上层控件的位置,整型,单位像素。实际测试获取到的是相对于上层控件的位置。

但是在创建浮动层的时候,定位方式使用了absolute,同时设置top,left为上边的值:

 1 // create floating DIV above element
 2 this.div = document.createElement(‘div‘);
 3 this.div.className = "zclip";
 4 this.div.id = "zclip-" + this.movieId;
 5 jQuery(this.domElement).data(‘zclipId‘, ‘zclip-‘ + this.movieId);
 6 var style = this.div.style;
 7 style.position = ‘absolute‘;
 8 style.left = ‘‘ + box.left + ‘px‘;
 9 style.top = ‘‘ + box.top + ‘px‘;
10 style.width = ‘‘ + box.width + ‘px‘;
11 style.height = ‘‘ + box.height + ‘px‘;
12 style.zIndex = zIndex;

实际测试是到页面上方和左侧的距离。这样就是将相对于上层控件的位置应用为了相对于整个页面的位置,所以Flash没有出现在按钮的位置。

既然明确了这个问题,那获取按钮位置的时候我们就换一种方法,因为使用了jQuery,直接上Jquery的方法既可以了:

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
};

if (obj && (obj != stopObj)) {
// 修改了这里
//info.left += obj.offsetLeft;
//info.top += obj.offsetTop;
info.left += $(obj).offset().left;
info.top += $(obj).offset().top;
}

return info;
},

对于浏览器对CSS的解析不是很了解,此方案仅适合遇到这个问题的朋友尝试下,可能最终原因还不是这个,因为貌似大家一直用的挺好。

最后附上插件地址:https://github.com/patricklodder/jquery-zclip

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。