From 108f308eaae62a78bd4dc8863f8c026f8828ef48 Mon Sep 17 00:00:00 2001 From: Brandon Aaron Date: Mon, 14 May 2007 17:46:00 +0000 Subject: [PATCH] Fix for #921 (IE clones events) --- src/jquery/jquery.js | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js index 61a190e..fbd5696 100644 --- a/src/jquery/jquery.js +++ b/src/jquery/jquery.js @@ -852,11 +852,30 @@ jQuery.fn = jQuery.prototype = { * @cat DOM/Manipulation */ clone: function(deep) { - return this.pushStack( jQuery.map( this, function(a){ - a = a.cloneNode( deep != undefined ? deep : true ); - a.$events = null; // drop $events expando to avoid firing incorrect events - return a; + // Need to remove events on the element and its descendants + var $this = this.add(this.find("*")); + $this.each(function() { + this._$events = {}; + for (var type in this.$events) + this._$events[type] = jQuery.extend({},this.$events[type]); + }).unbind(); + + // Do the clone + var r = this.pushStack( jQuery.map( this, function(a){ + return a.cloneNode( deep != undefined ? deep : true ); }) ); + + // Add the events back to the original and its descendants + $this.each(function() { + var events = this._$events; + for (var type in events) + for (var handler in events[type]) + jQuery.event.add(this, type, events[type][handler], events[type][handler].data); + this._$events = null; + }); + + // Return the cloned set + return r; }, /** -- 1.7.10.4