Final pass at fixing #5785. Need to make sure that inner-nodes are detached before...
[jquery.git] / src / manipulation.js
index 730dfca..3db2c35 100644 (file)
@@ -173,7 +173,7 @@ jQuery.fn.extend({
 
        html: function( value ) {
                if ( value === undefined ) {
-                       return this[0] ?
+                       return this[0] && this[0].nodeType === 1 ?
                                this[0].innerHTML.replace(rinlinejQuery, "") :
                                null;
 
@@ -196,6 +196,14 @@ jQuery.fn.extend({
                                this.empty().append( value );
                        }
 
+               } else if ( jQuery.isFunction( value ) ) {
+                       this.each(function(i){
+                               var self = jQuery(this), old = self.html();
+                               self.empty().append(function(){
+                                       return value.call( this, i, old );
+                               });
+                       });
+
                } else {
                        this.empty().append( value );
                }
@@ -205,6 +213,12 @@ jQuery.fn.extend({
 
        replaceWith: function( value ) {
                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();
+                       }
+
                        return this.each(function() {
                                var next = this.nextSibling, parent = this.parentNode;