Fix #13721. Filter before .remove() loop so positionals work. Close gh-1221.

This commit is contained in:
Dave Methvin 2013-04-05 08:57:01 -04:00
parent 5031c9db4b
commit 1b61026650
2 changed files with 28 additions and 17 deletions

View File

@ -72,13 +72,12 @@ jQuery.fn.extend({
// keepData is for internal use only--do not document // keepData is for internal use only--do not document
remove: function( selector, keepData ) { remove: function( selector, keepData ) {
var elem, var elem,
i = 0, elems = selector ? jQuery.filter( selector, this ) : this,
l = this.length; i = elems.length;
for ( ; i < l; i++ ) { while ( i-- ) {
elem = this[ i ]; elem = elems[ i ];
if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) {
if ( !keepData && elem.nodeType === 1 ) { if ( !keepData && elem.nodeType === 1 ) {
jQuery.cleanData( getAll( elem ) ); jQuery.cleanData( getAll( elem ) );
} }
@ -90,7 +89,6 @@ jQuery.fn.extend({
elem.parentNode.removeChild( elem ); elem.parentNode.removeChild( elem );
} }
} }
}
return this; return this;
}, },

View File

@ -1713,7 +1713,8 @@ test( "clone()/html() don't expose jQuery/Sizzle expandos (#12858)", function()
}); });
var testRemove = function( method ) { var testRemove = function( method ) {
var first = jQuery("#ap").children().first(); var markup, div,
first = jQuery("#ap").children().first();
first.data("foo", "bar"); first.data("foo", "bar");
@ -1731,6 +1732,18 @@ var testRemove = function( method ) {
jQuery("#ap").children()[ method ]("a, code"); jQuery("#ap").children()[ method ]("a, code");
equal( jQuery("#ap").children().length, 0, "Check multi-filtered remove" ); equal( jQuery("#ap").children().length, 0, "Check multi-filtered remove" );
// Positional and relative selectors
markup = "<div><span>1</span><span>2</span><span>3</span><span>4</span></div>";
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 // using contents will get comments regular, text, and comment nodes
// Handle the case where no comment is in the document // Handle the case where no comment is in the document
ok( jQuery("#nonnodes").contents().length >= 2, "Check node,textnode,comment remove works" ); 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"); testRemove("remove");
}); });
@ -1762,7 +1775,7 @@ test( "remove() event cleaning ", 1, function() {
cleanUp.remove(); cleanUp.remove();
}); });
test( "detach()", 8, function() { test( "detach()", 11, function() {
testRemove("detach"); testRemove("detach");
}); });