Bug Tracker

Ticket #921: jquery.clone.diff

File jquery.clone.diff, 1.2 KB (added by brandon, 15 years ago)

This patch fixes it all.

  • src/jquery/jquery.js

     
    852852         * @cat DOM/Manipulation
    853853         */
    854854        clone: function(deep) {
    855                 return this.pushStack( jQuery.map( this, function(a){
    856                         a = a.cloneNode( deep != undefined ? deep : true );
    857                         a.$events = null; // drop $events expando to avoid firing incorrect events
    858                         return a;
     855                // Need to remove events on the element and its descendants
     856                var $this = this.add(this.find("*"));
     857                $this.each(function() {
     858                        this._$events = {};
     859                        for (var type in this.$events)
     860                                this._$events[type] = jQuery.extend({},this.$events[type]);
     861                }).unbind();
     862
     863                // Do the clone
     864                var r = this.pushStack( jQuery.map( this, function(a){
     865                        return a.cloneNode( deep != undefined ? deep : true );
    859866                }) );
     867
     868                // Add the events back to the original and its descendants
     869                $this.each(function() {
     870                        var events = this._$events;
     871                        for (var type in events)
     872                                for (var handler in events[type])
     873                                        jQuery.event.add(this, type, events[type][handler], events[type][handler].data);
     874                        this._$events = null;
     875                });
     876
     877                // Return the cloned set
     878                return r;
    860879        },
    861880
    862881        /**