关于jquery的jquery.zclip.js在使用时隐藏元素失效讨论
2015-08-13 18:18
726 查看
今天在做一个粘贴功能时,想在元素加载dom节点的时候也就是 $(function() {})的时候 对一个隐藏元素绑定 jquery.zclip.js 的zclip方法
$("#copyBt").zclip({
path:'http://static.zqgame.com/js/ZeroClipboard.swf',
copy:function(){
var copyText = $(this).prev().val();
if(!copyText || " " == copyText){
return null;
}
return copyText;
},
afterCopy:function(){
alert("已经成功复制到您的剪贴板!");
}
});
但是发现绑定的click按钮始终不能复制成功,纠结了一天,调试了一天也没有解决。后来把上面这段代码放在隐藏元素显示之后去绑定按钮发现 复制功能能成功使用。然后去寻找原因发现
在jquery.zclip.js的源码中 其实有这样的判断
if (o.is(':visible') && (typeof settings.copy == 'string' || $.isFunction(settings.copy))) {
ZeroClipboard.setMoviePath(settings.path);
var clip = new ZeroClipboard.Client();
if ($.isFunction(settings.copy)) {
o.bind('zClip_copy', settings.copy);
}
if ($.isFunction(settings.beforeCopy)) {
o.bind('zClip_beforeCopy', settings.beforeCopy);
}
if ($.isFunction(settings.afterCopy)) {
o.bind('zClip_afterCopy', settings.afterCopy);
}
发现其实作者在一开始就判断元素是否是visible的如果是可见的才给元素绑定zClip_copy这些的功能
在后面的代码中
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)) {
alert($(obj).val());
info.left += obj.offsetLeft;
info.top += obj.offsetTop;
}
return info;
},
它会调用元素的offsetLeft方法获取他的位置,如果隐藏元素是会返回为0,Zclip复制的原理是给元素上面覆盖一层SWF的层所以如果找不到元素的位置也就不会给元素覆盖一层SWF了 所以作者一开始就 判断了VISIBLE
终于找到原因了,弄懂原理还是很激动
1、如果在样式文件或页面文件代码中直接用display:none对元素进行了隐藏,载入页面后,在没有通过js设置样式使元素显示的前提下,使用js代码会无法正确获得该元素的一些属性,比如offSetTop,offSetLeft等,返回的值会为0,通过js设置style.display来使元素显示后才能正确获得这些值。
$("#copyBt").zclip({
path:'http://static.zqgame.com/js/ZeroClipboard.swf',
copy:function(){
var copyText = $(this).prev().val();
if(!copyText || " " == copyText){
return null;
}
return copyText;
},
afterCopy:function(){
alert("已经成功复制到您的剪贴板!");
}
});
但是发现绑定的click按钮始终不能复制成功,纠结了一天,调试了一天也没有解决。后来把上面这段代码放在隐藏元素显示之后去绑定按钮发现 复制功能能成功使用。然后去寻找原因发现
在jquery.zclip.js的源码中 其实有这样的判断
if (o.is(':visible') && (typeof settings.copy == 'string' || $.isFunction(settings.copy))) {
ZeroClipboard.setMoviePath(settings.path);
var clip = new ZeroClipboard.Client();
if ($.isFunction(settings.copy)) {
o.bind('zClip_copy', settings.copy);
}
if ($.isFunction(settings.beforeCopy)) {
o.bind('zClip_beforeCopy', settings.beforeCopy);
}
if ($.isFunction(settings.afterCopy)) {
o.bind('zClip_afterCopy', settings.afterCopy);
}
发现其实作者在一开始就判断元素是否是visible的如果是可见的才给元素绑定zClip_copy这些的功能
在后面的代码中
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)) {
alert($(obj).val());
info.left += obj.offsetLeft;
info.top += obj.offsetTop;
}
return info;
},
它会调用元素的offsetLeft方法获取他的位置,如果隐藏元素是会返回为0,Zclip复制的原理是给元素上面覆盖一层SWF的层所以如果找不到元素的位置也就不会给元素覆盖一层SWF了 所以作者一开始就 判断了VISIBLE
终于找到原因了,弄懂原理还是很激动
1、如果在样式文件或页面文件代码中直接用display:none对元素进行了隐藏,载入页面后,在没有通过js设置样式使元素显示的前提下,使用js代码会无法正确获得该元素的一些属性,比如offSetTop,offSetLeft等,返回的值会为0,通过js设置style.display来使元素显示后才能正确获得这些值。
相关文章推荐
- jquery:ajax不接收返回值回
- DL DD DT 下拉列表(jquery)-代码很简洁
- jquery-焦点定位追加内容
- jQuery ajax传递特殊字符参数(例如+)
- 一个例子看清楚JQuery子元素选择器children()和find()的区别
- 在jQuery中使用$而避免跟其它库产生冲突的方法
- JQ $("#form :input" )与$("#form input")的区别 以及后代元素和子元素
- jQuery插件开发教程
- jQuery缓存数据——仿Map
- jquery暂停和中断循环
- 结合jQuery的unload方法实现JS退出页面弹出对话框
- 再JavaScript的jQuery库中编写动画效果的指南
- jQuery使用 $.grep() 方法
- jquery中子元素和后代元素的区别
- jquery each报 Uncaught TypeError: Cannot use 'in' operator to search for错误
- 使用jquery.fileDownload.js插件导出excel
- Jquery 中 ajaxSubmit使用讲解 j-m 后台登录
- jquery ajax请求后台 的简单例子
- jQuery插件手把手教会(一)
- 对于jQuery性能的一些优化建议