From: jeresig Date: Sat, 5 Dec 2009 20:30:36 +0000 (-0500) Subject: Make sure that the previous element is removed from the page before the next is inser... X-Git-Url: http://git.asbjorn.biz/?p=jquery.git;a=commitdiff_plain;h=2a6de9ab66653e5e424d9cc79d195b555158d04f Make sure that the previous element is removed from the page before the next is inserted, in replaceWith. Using a variation of the patch by snaury. Fixes #2697. --- diff --git a/src/manipulation.js b/src/manipulation.js index baf99d5..7128d11 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -210,7 +210,17 @@ jQuery.fn.extend({ replaceWith: function( value ) { if ( this[0] && this[0].parentNode ) { - return this.after( value ).remove(); + return this.each(function(){ + var next = this.nextSibling, parent = this.parentNode; + + jQuery(this).remove(); + + if ( next ) { + jQuery(next).before( value ); + } else { + jQuery(parent).append( value ); + } + }); } else { return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ); } diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index ec96c10..c8ea240 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -466,7 +466,7 @@ test("insertAfter(String|Element|Array<Element>|jQuery)", function() { }); var testReplaceWith = function(val) { - expect(12); + expect(14); 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' ); @@ -491,6 +491,13 @@ var testReplaceWith = function(val) { var set = jQuery("
").replaceWith(val("test")); equals( set[0].nodeName.toLowerCase(), "span", "Replace the disconnected node." ); equals( set.length, 1, "Replace the disconnected node." ); + + var $div = jQuery("
").appendTo("body"); + $div.replaceWith("
"); + equals(jQuery('.replacewith').length, 1, 'Check number of elements in page.'); + jQuery('.replacewith').remove(); } test("replaceWith(String|Element|Array<Element>|jQuery)", function() {