jQuery: The Write Less, Do More JavaScript Library

Ticket #2070 (closed bug: fixed)

Opened 5 months ago

Last modified 5 months ago

not() fails to filter out <SELECT> DOM element (1.2.2b)

Reported by: joern Assigned to: anonymous
Type: bug Priority: major
Milestone: 1.2.2 Component: core
Version: 1.2.1 Keywords:
Cc: Needs: Patch

Description

not() fails to filter out a single DOM element. Test:

Index: test/unit/core.js
===================================================================
--- test/unit/core.js	(revision 4206)
+++ test/unit/core.js	(working copy)
@@ -1058,7 +1058,7 @@
 });
 test("not()", function() {
-	expect(7);
+	expect(8);
 	ok( $("#main > p#ap > a").not("#google").length == 2, "not('selector')" );
 	ok( $("#main > p#ap > a").not(document.getElementById("google")).length == 2, "not(DOMElement)" );
 	isSet( $("p").not(".result").get(), q("firstp", "ap", "sndp", "en", "sap", "first"), "not('.class')" );
@@ -1066,6 +1066,9 @@
 	isSet( $("p").not($("#ap, #sndp, .result")).get(), q("firstp", "en", "sap", "first"), "not(jQuery)" );
 	ok( $("p").not(document.getElementsByTagName("p")).length == 0, "not(Array-like DOM collection)" );
 	isSet( $("#form option").not("option.emptyopt:contains('Nothing'),[selected],[value='1']").get(), q("option1c", "option1d", "option2c", "option3d" ), "not('complex selector')");
+
+	var selects = $("#form select");
+	isSet( selects.not( selects[1] ), ["select1", "select3"], "filter out DOM element");
 });
 test("andSelf()", function() {

Most likely the optimization in not() caused this to regress:

return this.filter(function() {
	// check to see if the selector is array-like otherwise assume it is just a DOM element
	return ( selector.length && selector[selector.length - 1] !== undefined )
		? jQuery.inArray( this, selector ) < 0
		: this != selector;

Attachments

Change History

Changed 5 months ago by davidserduke

  • status changed from new to closed
  • resolution set to duplicate

This should be fixed now in [4206]. Duplicate of #2062. Looks like you were writing this ticket while I was fixing it. :)

Changed 5 months ago by brandon

  • status changed from closed to reopened
  • resolution deleted

Looks like the test Joern checked in for this ticket is still failing though.

Changed 5 months ago by davidserduke

  • status changed from reopened to closed
  • resolution set to fixed
  • summary changed from not() fails to filter out DOM element (1.2.2b) to not() fails to filter out <SELECT> DOM element (1.2.2b)

There were actually two issues. First the test case had an error and was supposed to use the q() function instead of an array [].

The second was the code saw <select> as array-like since it is and keeps its options in an array-like manner. So the code was doing not() on the options inside the select. I added a !nodeType to the array-like check so it won't iterate through array-like objects that are actually DOM elements.

It appears that fixes this issue.

Changed 5 months ago by davidserduke

Fixed in [4212].

Note: See TracTickets for help on using tickets.