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.

This commit is contained in:
jeresig 2010-01-11 16:25:01 -05:00
parent cb4880ee83
commit 3e9ef6f5c0
2 changed files with 20 additions and 4 deletions

View File

@ -213,10 +213,16 @@ jQuery.fn.extend({
replaceWith: function( value ) { replaceWith: function( value ) {
if ( this[0] && this[0].parentNode ) { 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() { return this.each(function() {
var next = this.nextSibling, parent = this.parentNode; var next = this.nextSibling, parent = this.parentNode;
jQuery(this).detach(); jQuery(this).remove();
if ( next ) { if ( next ) {
jQuery(next).before( value ); jQuery(next).before( value );

View File

@ -626,7 +626,7 @@ test("insertAfter(String|Element|Array<Element>|jQuery)", function() {
}); });
var testReplaceWith = function(val) { var testReplaceWith = function(val) {
expect(17); expect(16);
jQuery('#yahoo').replaceWith(val( '<b id="replace">buga</b>' )); jQuery('#yahoo').replaceWith(val( '<b id="replace">buga</b>' ));
ok( jQuery("#replace")[0], 'Replace element with string' ); ok( jQuery("#replace")[0], 'Replace element with string' );
ok( !jQuery("#yahoo")[0], 'Verify that original element is gone, after string' ); ok( !jQuery("#yahoo")[0], 'Verify that original element is gone, after string' );
@ -652,12 +652,22 @@ var testReplaceWith = function(val) {
var tmp = jQuery("<div/>").appendTo("body").click(function(){ ok(true, "Newly bound click run." ); }); var tmp = jQuery("<div/>").appendTo("body").click(function(){ ok(true, "Newly bound click run." ); });
var y = jQuery('#yahoo').click(function(){ ok(true, "Previously bound click run." ); }); var y = jQuery('#yahoo').click(function(){ ok(true, "Previously bound click run." ); });
var child = y.append("<b>test</b>").find("b").click(function(){ ok(true, "Child bound click run." ); return false; }); var child = y.append("<b>test</b>").find("b").click(function(){ ok(true, "Child bound click run." ); return false; });
var child2 = y.append("<u>test</u>").find("u").click(function(){ ok(true, "Child 2 bound click run." ); return false; });
y.replaceWith( tmp ); y.replaceWith( tmp );
tmp.click(); tmp.click();
y.click(); y.click(); // Shouldn't be run
child.click(); child.click(); // Shouldn't be run
reset();
y = jQuery('#yahoo').click(function(){ ok(true, "Previously bound click run." ); });
var child2 = y.append("<u>test</u>").find("u").click(function(){ ok(true, "Child 2 bound click run." ); return false; });
y.replaceWith( child2 );
child2.click();
reset(); reset();