Fixes #8129. Fix cloning multiple selected options in IE8.
[jquery.git] / src / manipulation.js
index d758d80..19a6c22 100644 (file)
@@ -184,9 +184,9 @@ jQuery.fn.extend({
        },
 
        clone: function( dataAndEvents, deepDataAndEvents ) {
-               dataAndEvents = dataAndEvents == null ? true : dataAndEvents;
+               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
                deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-               
+
                return this.map( function () {
                        return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
                });
@@ -311,12 +311,19 @@ jQuery.fn.extend({
                        if ( first ) {
                                table = table && jQuery.nodeName( first, "tr" );
 
-                               for ( var i = 0, l = this.length; i < l; i++ ) {
+                               for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
                                        callback.call(
                                                table ?
                                                        root(this[i], first) :
                                                        this[i],
-                                               i > 0 || results.cacheable || (this.length > 1 && i > 0) ?
+                                               // Make sure that we do not leak memory by inadvertently discarding
+                                               // the original fragment (which might have attached data) instead of
+                                               // using it; in addition, use the original fragment object for the last
+                                               // item instead of first because it can end up being emptied incorrectly
+                                               // in certain situations (Bug #8070).
+                                               // Fragments from the fragment cache must always be cloned and never used
+                                               // in place.
+                                               results.cacheable || (l > 1 && i < lastIndex) ?
                                                        jQuery.clone( fragment, true, true ) :
                                                        fragment
                                        );
@@ -484,9 +491,10 @@ jQuery.each({
 
 jQuery.extend({
        clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-               var clone = elem.cloneNode(true), 
-                               srcElements, 
-                               destElements;
+               var clone = elem.cloneNode(true),
+                               srcElements,
+                               destElements,
+                               i;
 
                if ( !jQuery.support.noCloneEvent && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
                        // IE copies events bound via attachEvent when using cloneNode.
@@ -495,6 +503,8 @@ jQuery.extend({
                        // proprietary methods to clear the events. Thanks to MooTools
                        // guys for this hotness.
 
+                       cloneFixAttributes( elem, clone );
+
                        // Using Sizzle here is crazy slow, so we use getElementsByTagName
                        // instead
                        srcElements = elem.getElementsByTagName("*");
@@ -503,11 +513,9 @@ jQuery.extend({
                        // Weird iteration because IE will replace the length property
                        // with an element if you are cloning the body and one of the
                        // elements on the page has a name or id of "length"
-                       for ( var i = 0; srcElements[i]; ++i ) {
+                       for ( i = 0; srcElements[i]; ++i ) {
                                cloneFixAttributes( srcElements[i], destElements[i] );
                        }
-
-                       cloneFixAttributes( elem, clone );
                }
 
                // Copy the events from the original to the clone
@@ -521,7 +529,7 @@ jQuery.extend({
                                destElements = clone.getElementsByTagName("*");
 
                                if ( srcElements.length ) {
-                                       for ( var i = 0; srcElements[i]; ++i ) {
+                                       for ( i = 0; srcElements[i]; ++i ) {
                                                cloneCopyEvent( srcElements[i], destElements[i] );
                                        }
                                }