From 3e9ef6f5c08e63a90ef2dfd3bdc833994e7a0ac8 Mon Sep 17 00:00:00 2001 From: jeresig Date: Mon, 11 Jan 2010 16:25:01 -0500 Subject: [PATCH] Final pass at fixing #5785. Need to make sure that inner-nodes are detached before the remove() occurs (and it should still occur, the nodes are being obliterated. --- src/manipulation.js | 8 +++++++- test/unit/manipulation.js | 16 +++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/manipulation.js b/src/manipulation.js index f2f6c7d..3db2c35 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -213,10 +213,16 @@ 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; - jQuery(this).detach(); + jQuery(this).remove(); if ( next ) { jQuery(next).before( value ); diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index 046d363..3eef122 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -626,7 +626,7 @@ test("insertAfter(String|Element|Array<Element>|jQuery)", function() { }); var testReplaceWith = function(val) { - expect(17); + expect(16); jQuery('#yahoo').replaceWith(val( 'buga' )); ok( jQuery("#replace")[0], 'Replace element with string' ); ok( !jQuery("#yahoo")[0], 'Verify that original element is gone, after string' ); @@ -652,12 +652,22 @@ var testReplaceWith = function(val) { var tmp = jQuery("
").appendTo("body").click(function(){ ok(true, "Newly bound click run." ); }); var y = jQuery('#yahoo').click(function(){ ok(true, "Previously bound click run." ); }); var child = y.append("test").find("b").click(function(){ ok(true, "Child bound click run." ); return false; }); + var child2 = y.append("test").find("u").click(function(){ ok(true, "Child 2 bound click run." ); return false; }); y.replaceWith( tmp ); tmp.click(); - y.click(); - child.click(); + y.click(); // Shouldn't be run + child.click(); // Shouldn't be run + + reset(); + + y = jQuery('#yahoo').click(function(){ ok(true, "Previously bound click run." ); }); + var child2 = y.append("test").find("u").click(function(){ ok(true, "Child 2 bound click run." ); return false; }); + + y.replaceWith( child2 ); + + child2.click(); reset(); -- 1.7.10.4