From 1b610266502490eab42a0b9ddfac2f93da0b0fe1 Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Fri, 5 Apr 2013 08:57:01 -0400 Subject: [PATCH] Fix #13721. Filter before .remove() loop so positionals work. Close gh-1221. --- src/manipulation.js | 26 ++++++++++++-------------- test/unit/manipulation.js | 19 ++++++++++++++++--- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/manipulation.js b/src/manipulation.js index 5cfc853be..f3c729fdf 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -72,23 +72,21 @@ jQuery.fn.extend({ // keepData is for internal use only--do not document remove: function( selector, keepData ) { var elem, - i = 0, - l = this.length; + elems = selector ? jQuery.filter( selector, this ) : this, + i = elems.length; - for ( ; i < l; i++ ) { - elem = this[ i ]; + while ( i-- ) { + elem = elems[ i ]; - if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) { - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem ) ); - } - - if ( elem.parentNode ) { - if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { - setGlobalEval( getAll( elem, "script" ) ); - } - elem.parentNode.removeChild( elem ); + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); } + elem.parentNode.removeChild( elem ); } } diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index 012a0efc9..6093dbfb6 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -1713,7 +1713,8 @@ test( "clone()/html() don't expose jQuery/Sizzle expandos (#12858)", function() }); var testRemove = function( method ) { - var first = jQuery("#ap").children().first(); + var markup, div, + first = jQuery("#ap").children().first(); first.data("foo", "bar"); @@ -1731,6 +1732,18 @@ var testRemove = function( method ) { jQuery("#ap").children()[ method ]("a, code"); equal( jQuery("#ap").children().length, 0, "Check multi-filtered remove" ); + // Positional and relative selectors + markup = "
1234
"; + div = jQuery( markup ); + div.children().remove("span:nth-child(2n)"); + equal( div.text(), "13", "relative selector in " + method ); + div = jQuery( markup ); + div.children().remove("span:first"); + equal( div.text(), "234", "positional selector in " + method ); + div = jQuery( markup ); + div.children().remove("span:last"); + equal( div.text(), "123", "positional selector in " + method ); + // using contents will get comments regular, text, and comment nodes // Handle the case where no comment is in the document ok( jQuery("#nonnodes").contents().length >= 2, "Check node,textnode,comment remove works" ); @@ -1743,7 +1756,7 @@ var testRemove = function( method ) { } }; -test( "remove()", 8, function() { +test( "remove()", 11, function() { testRemove("remove"); }); @@ -1762,7 +1775,7 @@ test( "remove() event cleaning ", 1, function() { cleanUp.remove(); }); -test( "detach()", 8, function() { +test( "detach()", 11, function() { testRemove("detach"); });