X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=src%2Fmanipulation.js;h=62009be20d5150efc8d0d95bcdd4aa5d28792b01;hb=8db967e9d52407c8e76d81b9d472800667f6fa29;hp=c537c7095b55339deb389418ec32f41cccd9bef3;hpb=f8ef75eb9124ce924be5fb521c783efd5c996e33;p=jquery.git diff --git a/src/manipulation.js b/src/manipulation.js index c537c70..62009be 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -137,24 +137,55 @@ jQuery.fn.extend({ }, domManip: function( args, table, callback ) { + var fragment, scripts, cacheable, cached, cacheresults, first; + if ( this[0] ) { - var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), - scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), - first = fragment.firstChild; + if ( args.length === 1 && typeof args[0] === "string" ) { + cacheable = true; + cacheresults = jQuery.fragments[ args[0] ]; + if ( cacheresults ) { + if ( cacheresults !== 1 ) { + fragment = cacheresults; + } + cached = true; + } + } + + if ( !fragment ) { + fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(); + scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ); + } + + first = fragment.firstChild; - if ( first ) - for ( var i = 0, l = this.length; i < l; i++ ) - callback.call( root(this[i], first), this.length > 1 || i > 0 ? - fragment.cloneNode(true) : fragment ); + if ( first ) { + table = table && jQuery.nodeName( first, "tr" ); - if ( scripts ) + for ( var i = 0, l = this.length; i < l; i++ ) { + callback.call( + table ? + root(this[i], first) : + this[i], + cacheable || this.length > 1 || i > 0 ? + fragment.cloneNode(true) : + fragment + ); + } + } + + if ( scripts ) { jQuery.each( scripts, evalScript ); + } + + if ( cacheable ) { + jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1; + } } return this; function root( elem, cur ) { - return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ? + return jQuery.nodeName(elem, "table") ? (elem.getElementsByTagName("tbody")[0] || elem.appendChild(elem.ownerDocument.createElement("tbody"))) : elem; @@ -162,6 +193,8 @@ jQuery.fn.extend({ } }); +jQuery.fragments = {}; + jQuery.each({ appendTo: "append", prependTo: "prepend", @@ -186,8 +219,7 @@ jQuery.each({ remove: function( selector ) { if ( !selector || jQuery.multiFilter( selector, [ this ] ).length ) { if ( this.nodeType === 1 ) { - cleanData( this.getElementsByTagName("*") ); - cleanData( [this] ); + cleanData( jQuery("*", this).add(this) ); } if ( this.parentNode ) { @@ -199,7 +231,7 @@ jQuery.each({ empty: function() { // Remove element nodes and prevent memory leaks if ( this.nodeType === 1 ) { - cleanData( this.getElementsByTagName("*") ); + cleanData( jQuery("*", this) ); } // Remove any remaining nodes