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 相关文章推荐
jQuery UI AutoComplete 自动完成使用小记
Aug 21 Javascript
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
Jul 08 Javascript
解析javascript 浏览器关闭事件
Jul 08 Javascript
jQuery中.live()方法的用法深入解析
Dec 30 Javascript
调用jQuery滑出效果时闪烁的解决方法
Mar 27 Javascript
JQuery简单实现锚点链接的平滑滚动
May 03 Javascript
Ajax中解析Json的两种方法对比分析
Jun 25 Javascript
jquery中checkbox使用方法简单实例演示
Nov 24 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
Feb 05 Javascript
JS实现最简单的冒泡排序算法
Feb 15 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
Jun 14 Javascript
微信小程序 bindtap 传参的实例代码
Feb 21 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
PHP中将字符串转化为整数(int) intval() printf() 性能测试
2020/03/20 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
2012/06/17 PHP
PHP 生成微信红包代码简单
2016/03/25 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
php代码调试利器firephp安装与使用方法分析
2018/08/21 PHP
javascript 日期常用的方法
2009/11/11 Javascript
JSON 学习之JSON in JavaScript详细使用说明
2010/02/23 Javascript
js 小贴士一星期合集
2010/04/07 Javascript
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
2017/01/04 Javascript
javascript回调函数的概念理解与用法分析
2017/05/27 Javascript
vue 子组件向父组件传值方法
2018/02/26 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
Vue项目中使用jquery的简单方法
2019/05/16 jQuery
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
vue获取验证码倒计时组件
2019/08/26 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
Python中使用中文的方法
2011/02/19 Python
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
详解基于django实现的webssh简单例子
2018/07/17 Python
详解windows python3.7安装numpy问题的解决方法
2018/08/13 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
马来西亚太阳镜、眼镜和隐形眼镜网上商店:Focus Point
2018/12/13 全球购物
病媒生物防治方案
2014/05/13 职场文书
全国文明单位申报材料
2014/05/31 职场文书
成绩报告单家长评语
2014/12/30 职场文书
千手观音观后感
2015/06/03 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书