Bug Tracker

Ticket #6384 (closed bug: duplicate)

Opened 5 years ago

Last modified 3 years ago

Sizzle duplicate selections when using POS filters

Reported by: manixrock Owned by:
Priority: high Milestone: 1.next
Component: selector Version: 1.4.2
Keywords: even Cc:
Blocking: Blocked by:

Description

In the following HTML:

<div><div><div><a></a></div></div></div>

the code "Sizzle('div:even a');" selects the same <a> tag twice. The reason for this is because internally Sizzle selects 'div:even', then selects 'a' with each resulting <div> from the previous selection, and since the second <div> is contained within the first, the same <a> gets selected twice.

This problem isn't specific to selectors with descendant-relations, next-sibling type selectors are also affected.

A solution for this that would work for all selector relationship types (descendant, child, sibling, next-sibling), is to add a checkForDuplicates variable that is true when a POS-type filter (:even, :nth, etc.) is detected, and whenever a match is found, if checkForDuplicates is true check that it doesn't already exist in the results.

Another solution is after the first selection of 'div:even' to remove any of the matches that are the child of another match (or if the next selector-relationship is of type next-sibling, remove if they are next-sibling; if child or next-adjacent do nothing). This is because the top-most tag will also search in all it's children and was the cause of the duplication. This should be faster than the first solution, and can probably be optimized a lot.

Change History

comment:1 Changed 4 years ago by dmethvin

See also #6700; should this be something Sizzle does, or should all the processing happen and the final set be de-duped?

comment:2 Changed 4 years ago by SlexAxton

  • Keywords even added
  • Priority set to low
  • Status changed from new to open
  • Milestone changed from 1.4.3 to 1.5

I thought one of the benefits of sizzle was that it was right-to-left, so it didn't suffer from the duplicate problems... hmm - I guess the :even selector ruins that? Does this hit qSA?

 http://jsfiddle.net/ytcbj/

Seems like a bug to me :/

comment:3 Changed 4 years ago by john

  • Component changed from traversing to selector

comment:4 Changed 4 years ago by john

  • Priority changed from low to high
  • Milestone set to 1.next

comment:5 Changed 3 years ago by john

  • Status changed from open to closed
  • Resolution set to duplicate

comment:6 Changed 3 years ago by john

Duplicate of #9810.

Note: See TracTickets for help on using tickets.