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 相关文章推荐
开发 Internet Explorer 右键功能表(ContextMenu)
Jul 03 Javascript
javascript处理表单示例(javascript提交表单)
Apr 28 Javascript
Javascript简单实现面向对象编程继承实例代码
Nov 27 Javascript
深入理解jQuery3.0的domManip函数
Sep 01 Javascript
Angular企业级开发——MVC之控制器详解
Feb 20 Javascript
自定义vue全局组件use使用、vuex的使用详解
Jun 14 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
Jul 06 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
Jan 25 jQuery
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
Sep 28 Javascript
原生js实现商品筛选功能
Oct 28 Javascript
vue keep-alive的简单总结
Jan 25 Vue.js
vue项目配置sass及引入外部scss文件
Apr 14 Vue.js
修改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
PHP4和PHP5性能测试和对比 测试代码与环境
2007/08/17 PHP
使用php记录用户通过搜索引擎进网站的关键词
2014/02/13 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
潜说js对象和数组
2011/05/25 Javascript
读jQuery之八 包装事件对象
2011/06/21 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
JavaScript实现的一个倒计时的类
2015/03/12 Javascript
JavaScript中模拟实现jsonp
2015/06/19 Javascript
Js+php实现异步拖拽上传文件
2015/06/23 Javascript
浅谈AngularJS中使用$resource(已更新)
2017/09/14 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
2017/12/28 Javascript
除Console.log()外更多的Javascript调试命令
2018/01/24 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
2019/04/12 Javascript
基于Fixed定位的框选功能的实现代码
2019/05/13 Javascript
vue-cli3单页构建大型项目方案
2020/04/07 Javascript
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
python根据日期返回星期几的方法
2015/07/06 Python
python用户评论标签匹配的解决方法
2018/05/31 Python
Python使用numpy模块创建数组操作示例
2018/06/20 Python
在Pycharm terminal中字体大小设置的方法
2019/01/16 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
python小白切忌乱用表达式
2020/05/29 Python
Pytorch环境搭建与基本语法
2020/06/03 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
python时间time模块处理大全
2020/10/25 Python
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
公证委托书大全
2014/04/04 职场文书
2014年群众路线教育实践活动整改措施
2014/09/24 职场文书
12.4全国法制宣传日活动方案
2014/11/02 职场文书
2014年宣传思想工作总结
2014/12/10 职场文书
立案决定书范文
2015/06/24 职场文书
2015年度女工工作总结
2015/10/22 职场文书
分家协议书范本
2016/03/22 职场文书
浅谈CSS不规则边框的生成方案
2021/05/25 HTML / CSS