X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fmanipulation.js;h=196f2307202eb98c34a820583126de627bcfb082;hb=a6f3757d50f8be021505f4f7fa7201199e8b7f2d;hp=543bbcd5e6535c1f27993542e18ea7141b48b489;hpb=f9417b9da980f4fa79d03ba691d9f3442c5ab2f2;p=jquery.git diff --git a/src/manipulation.js b/src/manipulation.js index 543bbcd..196f230 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -4,8 +4,8 @@ var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i, rtagName = /<([\w:]+)/, rtbody = / self-closes a tag + .replace(/=([^="'>\s]+\/)>/g, '="$1">') .replace(rleadingWhitespace, "")], ownerDocument)[0]; } else { return this.cloneNode(true); @@ -266,16 +268,17 @@ jQuery.fn.extend({ if ( this[0] && this[0].parentNode ) { // Make sure that the elements are removed from the DOM before they are inserted // this can help fix replacing a parent with child elements - if ( !jQuery.isFunction( value ) ) { - value = jQuery( value ).detach(); - - } else { + if ( jQuery.isFunction( value ) ) { return this.each(function(i) { var self = jQuery(this), old = self.html(); self.replaceWith( value.call( this, i, old ) ); }); } + if ( typeof value !== "string" ) { + value = jQuery(value).detach(); + } + return this.each(function() { var next = this.nextSibling, parent = this.parentNode; @@ -297,7 +300,7 @@ jQuery.fn.extend({ }, domManip: function( args, table, callback ) { - var results, first, value = args[0], scripts = [], fragment; + var results, first, value = args[0], scripts = [], fragment, parent; // We can't cloneNode fragments that contain checked, in WebKit if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) { @@ -315,9 +318,12 @@ jQuery.fn.extend({ } if ( this[0] ) { + parent = value && value.parentNode; + // If we're in a fragment, just use that instead of building a new one - if ( args[0] && args[0].parentNode && args[0].parentNode.nodeType === 11 ) { - results = { fragment: args[0].parentNode }; + if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) { + results = { fragment: parent }; + } else { results = buildFragment( args, this, scripts ); } @@ -426,9 +432,10 @@ jQuery.each({ replaceAll: "replaceWith" }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { - var ret = [], insert = jQuery( selector ); + var ret = [], insert = jQuery( selector ), + parent = this.length === 1 && this[0].parentNode; - if ( this.length === 1 && this[0].parentNode && this[0].parentNode.nodeType === 11 && insert.length === 1 ) { + if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) { insert[ original ]( this[0] ); return this; @@ -540,7 +547,9 @@ jQuery.extend({ }, cleanData: function( elems ) { - var data, id, cache = jQuery.cache; + var data, id, cache = jQuery.cache, + special = jQuery.event.special, + deleteExpando = jQuery.support.deleteExpando; for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { id = elem[ jQuery.expando ]; @@ -549,12 +558,22 @@ jQuery.extend({ data = cache[ id ]; if ( data.events ) { - for ( var event in data.events ) { - removeEvent( elem, event, data.handle ); + for ( var type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + } else { + removeEvent( elem, type, data.handle ); + } } } - removeExpando( elem ); + if ( deleteExpando ) { + delete elem[ jQuery.expando ]; + + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } delete cache[ id ]; }