jQuery Clone Bug解决代码


Posted in Javascript onDecember 22, 2010

首先,jQuery事件绑定的时候,所有事件用$.data()方法存储到了$.cache里面,用data('events')可以反复获取到它们:

var $div = $('div.demo'), data = $div.data(); 
// 获取所有绑定事件: 
var events = data.events; 
// 除了window对象绑定事件的比较特殊: 
var windowEvents = $(window).data('__events__');

在必要的时候,可以检索有没有绑定相关处理函数:
var clickHandler = function(){ 
console.log('click test'); 
}; 
$div.click(clickHandler); 
events.click.some(function(ev){ 
return ev.handler === clickHandler; 
});

BUG示例
<script type="text/javascript"> 
Array.prototype.xyzz = function (arg) { 
console.log(1,this,arg); 
}; 
Array.prototype.xyzzz = function (arg) { 
console.log(2,this,arg); 
}; 
$(function() { 
$('button').click(function () { 
$('div.demo').clone(true).appendTo( 'body' ); 
}) 
$('div.demo').click(function () { 
console.log('click..'); 
}) 
}); 
</script>

BUG来源
// event.js, jQuery.event.add: 
// jQuery 1.4.1 
handlers = events[ type ] = {}; 
// jQuery 1.4.2+ 
handlers = events[ type ] = []; 
// manipulation.js, jQuery.clone : , cloneCopyEvent(): 
for ( var type in events ) { 
for ( var handler in events[ type ] ) { 
jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data ); 
} 
}

在1.4.2之后,events[ type ]为数组,for...in循环会获取到数组原型上扩展的所有方法,接着绑定到DOM对象上。
解决
不扩展数组原型,不使用clone(true)方法。
hasOwnProperty检查。
使用each循环:
var self = this; 
for ( var type in events ) { 
jQuery.each(events[ type ],function(idx,evt) { 
jQuery.event.add( self, type, evt.handler, evt.data ); 
}); 
}

完整演示代码:
<!DOCTYPE HTML> 
<html> 
<head> 
<meta charset="utf-8" /> 
<title>jQuery Clone Bug</title> 
<style type="text/css"> 
.demo{ margin:1em;background:#07a; height:10em; width:10em; } 
</style> 
</head> 
<body> 
<button>doClone</button> 
<a href="https://3water.com">返回</a> 
<div class="demo">click me</div> 
<script src="http://demo.3water.com/jslib/jquery/jquery-1.4.4.js"></script> 
<script type="text/javascript"> 
Array.prototype.xyzz = function (arg) { 
console.log(1,this,arg); 
}; 
Array.prototype.xyzzz = function (arg) { 
console.log(2,this,arg); 
}; 
$(function() { 
$('button').click(function () { 
$('div.demo').clone(true).appendTo( 'body' ); 
}) 
$('div.demo').click(function () { 
console.log('click..'); 
}) 
}); 
// var events = $('div.demo:eq(0)').data().events 
// manipulation.js : cloneCopyEvent 
// :line 372 
// for ( var type in events ) { 
// for ( var handler in events[ type ] ) { 
// console.log(handler); 
// } 
// } 
// console.log($.isArray(events['click'])) 
// 原因 
// event.js : event.add 
// :line 106 
// handlers = events[ type ] = []; 
</script> 
</body> 
</html>

在线演示 /js/jquery_clone_bug/jQuery_clone_bug_demo.htm
Javascript 相关文章推荐
记录几个javascript有关的小细节
Apr 02 Javascript
javascript oop开发滑动(slide)菜单控件
Aug 25 Javascript
类似php的js数组的in_array函数自定义方法
Dec 27 Javascript
IE的事件传递-event.cancelBubble示例介绍
Jan 12 Javascript
JavaScript 里的类数组对象
Apr 08 Javascript
JavaScript浏览器对象之一Window对象详解
Jun 03 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
Jun 26 Javascript
详解微信小程序——自定义圆形进度条
Dec 29 Javascript
vue2.0获取自定义属性的值
Mar 28 Javascript
VUE使用vuex解决模块间传值问题的方法
Jun 01 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
Nov 14 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
Feb 01 Javascript
修改jquery.lazyload.js实现页面延迟载入
Dec 22 #Javascript
jquery插件 autoComboBox 下拉框
Dec 22 #Javascript
Jquery截取中文字符串的实现代码
Dec 22 #Javascript
jquery里的each使用方法详解
Dec 22 #Javascript
jQuery学习笔记之jQuery的动画
Dec 22 #Javascript
jQuery学习笔记之jQuery的事件
Dec 22 #Javascript
jQuery学习笔记之jQuery的DOM操作
Dec 22 #Javascript
You might like
VOLVO车载收音机
2021/03/02 无线电
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
基于JavaScript 类的使用详解
2013/05/07 Javascript
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
2015/06/12 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
JS功能代码集锦
2016/05/04 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
js实现各浏览器全屏代码实例
2018/07/03 Javascript
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
python异步任务队列示例
2014/04/01 Python
python实现得到一个给定类的虚函数
2014/09/28 Python
python采用getopt解析命令行输入参数实例
2014/09/30 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
Django框架中间件(Middleware)用法实例分析
2019/05/24 Python
财会自我鉴定范文
2013/12/27 职场文书
教师对学生的评语
2014/04/28 职场文书
教师年度考核评语
2014/04/28 职场文书
小学兴趣小组活动总结
2014/07/07 职场文书
家装业务员岗位职责
2015/04/03 职场文书
导游词之阆中古城
2019/12/23 职场文书
Pytest中conftest.py的用法
2021/06/27 Python