diff options
author | Brandon Aaron <brandon.aaron@gmail.com> | 2007-05-14 17:46:00 +0000 |
---|---|---|
committer | Brandon Aaron <brandon.aaron@gmail.com> | 2007-05-14 17:46:00 +0000 |
commit | 108f308eaae62a78bd4dc8863f8c026f8828ef48 (patch) | |
tree | e34a7a412d417bb1cf668d70d7a480201dc33225 /src/jquery/jquery.js | |
parent | d0c68580e500a4b9ffd0bf577d82df6d0320659a (diff) | |
download | jquery-108f308eaae62a78bd4dc8863f8c026f8828ef48.tar.gz jquery-108f308eaae62a78bd4dc8863f8c026f8828ef48.zip |
Fix for #921 (IE clones events)
Diffstat (limited to 'src/jquery/jquery.js')
-rw-r--r-- | src/jquery/jquery.js | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js index 61a190e80..fbd569629 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; }, /** |