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 Base64编码和解码,实现URL参数传递。
Sep 18 Javascript
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
Mar 23 Javascript
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
Apr 29 Javascript
js实现简洁大方的二级下拉菜单效果代码
Sep 01 Javascript
javascript创建对象、对象继承的实用方式详解
Mar 08 Javascript
批量下载对路网图片并生成html的实现方法
Jun 07 Javascript
JS键盘版计算器的制作方法
Dec 03 Javascript
VUE JS 使用组件实现双向绑定的示例代码
Jan 10 Javascript
JavaScript设计模式之工厂模式简单实例教程
Jul 03 Javascript
layer.open 获取不到表单信息的解决方法
Sep 26 Javascript
小程序实现简单语音聊天的示例代码
Jul 24 Javascript
jQuery实现简单弹幕制作
Dec 10 jQuery
修改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
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
php文件操作之小型留言本实例
2015/06/20 PHP
IE 下的只读 innerHTML
2009/08/21 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
JavaScript调用客户端的可执行文件(示例代码)
2013/11/28 Javascript
用jquery模仿的a的title属性的例子
2014/10/22 Javascript
AngularJs根据访问的页面动态加载Controller的解决方案
2015/02/04 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
详解nodeJS之路径PATH模块
2017/05/31 NodeJs
JS和jQuery通过this获取html标签中的属性值(实例代码)
2017/09/11 jQuery
浅谈react-router HashRouter和BrowserRouter的使用
2017/12/29 Javascript
5 种JavaScript编码规范
2018/01/30 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
Angular6 正则表达式允许输入部分中文字符
2018/09/10 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
JavaScript的词法结构精华篇
2018/10/17 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
js实现简易计算器功能
2019/10/18 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
python解析html开发库pyquery使用方法
2014/02/07 Python
python用来获得图片exif信息的库实例分析
2015/03/16 Python
在Python的Django框架下使用django-tagging的教程
2015/05/30 Python
Python内置函数delattr的具体用法
2017/11/23 Python
Django中login_required装饰器的深入介绍
2017/11/24 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
pytorch: Parameter 的数据结构实例
2019/12/31 Python
Python常用模块函数代码汇总解析
2020/08/31 Python
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
学生操行评语大全
2014/04/24 职场文书
房地产广告策划方案
2014/05/15 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
个人违纪检讨书
2014/09/15 职场文书
【海涛教你打DOTA】剑圣第一人称视角解说
2022/04/01 DOTA