Merge branch 'master' of git://github.com/jquery/jquery into fixedbuild
[jquery.git] / src / manipulation.js
index 442a14d..27f81cc 100644 (file)
@@ -7,7 +7,7 @@ var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
        rtbody = /<tbody/i,
        rhtml = /<|&#?\w+;/,
        rnocache = /<(?:script|object|embed|option|style)/i,
-       // checked="checked" or checked (html5)
+       // checked="checked" or checked
        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
        wrapMap = {
                option: [ 1, "<select multiple='multiple'>", "</select>" ],
@@ -159,7 +159,7 @@ jQuery.fn.extend({
                                }
 
                                if ( elem.parentNode ) {
-                                        elem.parentNode.removeChild( elem );
+                                       elem.parentNode.removeChild( elem );
                                }
                        }
                }
@@ -184,7 +184,7 @@ 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 () {
@@ -261,7 +261,9 @@ jQuery.fn.extend({
                                }
                        });
                } else {
-                       return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
+                       return this.length ?
+                               this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+                               this;
                }
        },
 
@@ -353,8 +355,8 @@ function cloneCopyEvent( src, dest ) {
        }
 
        var internalKey = jQuery.expando,
-                       oldData = jQuery.data( src ),
-                       curData = jQuery.data( dest, oldData );
+               oldData = jQuery.data( src ),
+               curData = jQuery.data( dest, oldData );
 
        // Switch to use the internal data object, if it exists, for the next
        // stage of data copying
@@ -368,7 +370,7 @@ function cloneCopyEvent( src, dest ) {
 
                        for ( var type in events ) {
                                for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
-                                       jQuery.event.add( dest, type, events[ type ][ i ], events[ type ][ i ].data );
+                                       jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
                                }
                        }
                }
@@ -489,6 +491,18 @@ jQuery.each({
        };
 });
 
+function getAll( elem ) {
+       if ( "getElementsByTagName" in elem ) {
+               return elem.getElementsByTagName( "*" );
+       
+       } else if ( "querySelectorAll" in elem ) {
+               return elem.querySelectorAll( "*" );
+
+       } else {
+               return [];
+       }
+}
+
 jQuery.extend({
        clone: function( elem, dataAndEvents, deepDataAndEvents ) {
                var clone = elem.cloneNode(true),
@@ -496,17 +510,20 @@ jQuery.extend({
                                destElements,
                                i;
 
-               if ( !jQuery.support.noCloneEvent && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+               if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
                        // IE copies events bound via attachEvent when using cloneNode.
                        // Calling detachEvent on the clone will also remove the events
                        // from the original. In order to get around this, we use some
                        // 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("*");
-                       destElements = clone.getElementsByTagName("*");
+                       srcElements = getAll( elem );
+                       destElements = getAll( clone );
 
                        // Weird iteration because IE will replace the length property
                        // with an element if you are cloning the body and one of the
@@ -514,30 +531,25 @@ jQuery.extend({
                        for ( i = 0; srcElements[i]; ++i ) {
                                cloneFixAttributes( srcElements[i], destElements[i] );
                        }
-
-                       cloneFixAttributes( elem, clone );
                }
 
                // Copy the events from the original to the clone
                if ( dataAndEvents ) {
-
                        cloneCopyEvent( elem, clone );
 
-                       if ( deepDataAndEvents && "getElementsByTagName" in elem ) {
+                       if ( deepDataAndEvents ) {
+                               srcElements = getAll( elem );
+                               destElements = getAll( clone );
 
-                               srcElements = elem.getElementsByTagName("*");
-                               destElements = clone.getElementsByTagName("*");
-
-                               if ( srcElements.length ) {
-                                       for ( i = 0; srcElements[i]; ++i ) {
-                                               cloneCopyEvent( srcElements[i], destElements[i] );
-                                       }
+                               for ( i = 0; srcElements[i]; ++i ) {
+                                       cloneCopyEvent( srcElements[i], destElements[i] );
                                }
                        }
                }
+
                // Return the cloned set
                return clone;
-  },
+},
        clean: function( elems, context, fragment, scripts ) {
                context = context || document;