aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorjeresig <jeresig@gmail.com>2011-01-21 11:20:05 -0500
committerjeresig <jeresig@gmail.com>2011-01-21 11:20:05 -0500
commit61e80c55df9231c177d194ff075472898933c2c9 (patch)
treefe5251f07ba655a85551a5f910947a141860e908 /src
parent328a86f9a0d3f0907cc950f7543e34cb3efbda3f (diff)
parent33a67ffa9d85450f1edf1b1645b57f7641e2e2d2 (diff)
downloadjquery-61e80c55df9231c177d194ff075472898933c2c9.tar.gz
jquery-61e80c55df9231c177d194ff075472898933c2c9.zip
Merge branch '8013p' of https://github.com/rwldrn/jquery into rwldrn-8013p
Diffstat (limited to 'src')
-rw-r--r--src/core.js2
-rw-r--r--src/manipulation.js136
2 files changed, 74 insertions, 64 deletions
diff --git a/src/core.js b/src/core.js
index 236f84d88..aa97202d2 100644
--- a/src/core.js
+++ b/src/core.js
@@ -130,7 +130,7 @@ jQuery.fn = jQuery.prototype = {
} else {
ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
- selector = (ret.cacheable ? jQuery(ret.fragment).clone()[0] : ret.fragment).childNodes;
+ selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
}
return jQuery.merge( this, selector );
diff --git a/src/manipulation.js b/src/manipulation.js
index 596a45736..d758d803f 100644
--- a/src/manipulation.js
+++ b/src/manipulation.js
@@ -183,43 +183,13 @@ jQuery.fn.extend({
return this;
},
- clone: function( events ) {
- // Do the clone
- var ret = this.map(function() {
- var clone = this.cloneNode(true);
- if ( !jQuery.support.noCloneEvent && (this.nodeType === 1 || this.nodeType === 11) && !jQuery.isXMLDoc(this) ) {
- // 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.
-
- // Using Sizzle here is crazy slow, so we use getElementsByTagName
- // instead
- var srcElements = this.getElementsByTagName("*"),
- destElements = clone.getElementsByTagName("*");
-
- // 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 ) {
- cloneFixAttributes( srcElements[i], destElements[i] );
- }
-
- cloneFixAttributes( this, clone );
- }
-
- return clone;
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? true : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map( function () {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
});
-
- // Copy the events from the original to the clone
- if ( events === true ) {
- cloneCopyEvent( this, ret );
- cloneCopyEvent( this.find("*"), ret.find("*") );
- }
-
- // Return the cloned set
- return ret;
},
html: function( value ) {
@@ -347,7 +317,7 @@ jQuery.fn.extend({
root(this[i], first) :
this[i],
i > 0 || results.cacheable || (this.length > 1 && i > 0) ?
- jQuery(fragment).clone(true)[0] :
+ jQuery.clone( fragment, true, true ) :
fragment
);
}
@@ -369,40 +339,33 @@ function root( elem, cur ) {
elem;
}
-function cloneCopyEvent(orig, ret) {
- ret.each(function (nodeIndex) {
- if ( this.nodeType !== 1 || !jQuery.hasData(orig[nodeIndex]) ) {
- return;
- }
+function cloneCopyEvent( src, dest ) {
- // XXX remove for 1.5 RC or merge back in if there is actually a reason for this check that has been
- // unexposed by unit tests
- if ( this.nodeName !== (orig[nodeIndex] && orig[nodeIndex].nodeName) ) {
- throw "Cloned data mismatch";
- }
+ if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+ return;
+ }
- var internalKey = jQuery.expando,
- oldData = jQuery.data( orig[nodeIndex] ),
- curData = jQuery.data( this, oldData );
+ var internalKey = jQuery.expando,
+ 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
- if ( (oldData = oldData[ internalKey ]) ) {
- var events = oldData.events;
- curData = curData[ internalKey ] = jQuery.extend({}, oldData);
+ // Switch to use the internal data object, if it exists, for the next
+ // stage of data copying
+ if ( (oldData = oldData[ internalKey ]) ) {
+ var events = oldData.events;
+ curData = curData[ internalKey ] = jQuery.extend({}, oldData);
- if ( events ) {
- delete curData.handle;
- curData.events = {};
+ if ( events ) {
+ delete curData.handle;
+ curData.events = {};
- for ( var type in events ) {
- for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
- jQuery.event.add( this, type, events[ type ][ i ], events[ type ][ i ].data );
- }
+ 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 );
}
}
}
- });
+ }
}
function cloneFixAttributes(src, dest) {
@@ -520,6 +483,53 @@ jQuery.each({
});
jQuery.extend({
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var clone = elem.cloneNode(true),
+ srcElements,
+ destElements;
+
+ if ( !jQuery.support.noCloneEvent && (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.
+
+ // Using Sizzle here is crazy slow, so we use getElementsByTagName
+ // instead
+ srcElements = elem.getElementsByTagName("*");
+ destElements = clone.getElementsByTagName("*");
+
+ // 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 ) {
+ 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 ) {
+
+ srcElements = elem.getElementsByTagName("*");
+ destElements = clone.getElementsByTagName("*");
+
+ if ( srcElements.length ) {
+ for ( var 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;