转自波斯马,原文地址《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的解析不是很了解,此方案仅适合遇到这个问题的朋友尝试下,可能最终原因还不是这个,因为貌似大家一直用的挺好。