jQueryCloneBug解决代码_jquery:首先,jQuery事件绑定的时候,所有事件用$.data()方法存储到了$.cache里面,用data('events')可以反复获取到它们: 代码如下: var $div = $('div.demo'), data = $div.data(); // 获取所有绑定事件: var events = data.even
导读jQueryCloneBug解决代码_jquery:首先,jQuery事件绑定的时候,所有事件用$.data()方法存储到了$.cache里面,用data('events')可以反复获取到它们: 代码如下: var $div = $('div.demo'), data = $div.data(); // 获取所有绑定事件: var events = data.even
首先,jQuery事件绑定的时候,所有事件用$.data()方法存储到了$.cache里面,用data('events')可以反复获取到它们: 代码如下: var $div = $('div.demo'), data = $div.data(); // 获取所有绑定事件: var events = data.events; // 除了window对象绑定事件的比较特殊: var windowEvents = $(window).data('__events__');
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 ); }); }
完整演示代码: 代码如下:
jQuery Clone Bug
返回 click me script>
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>
jQueryCloneBug解决代码_jquery:首先,jQuery事件绑定的时候,所有事件用$.data()方法存储到了$.cache里面,用data('events')可以反复获取到它们: 代码如下: var $div = $('div.demo'), data = $div.data(); // 获取所有绑定事件: var events = data.even