]> source.dussan.org Git - jquery.git/commitdiff
Selector: Make selectors with leading combinators use qSA again
authorMichał Gołębiowski-Owczarek <m.goleb@gmail.com>
Mon, 14 Oct 2019 16:28:19 +0000 (18:28 +0200)
committerGitHub <noreply@github.com>
Mon, 14 Oct 2019 16:28:19 +0000 (18:28 +0200)
An optimization added in jquery/sizzle#431 skips the temporary IDs for selectors
not using child or descendant combinators. For sibling combinators, though, this
pushes a selector with a leading combinator to qSA directly which crashes and
falls back to a slower Sizzle route.

This commit makes selectors with leading combinators not skip the selector
rewriting. Note that after jquery/jquery#4454 & jquery/sizzle#453, all modern
browsers other than Edge leverage the :scope pseudo-class, avoiding temporary
id attributes.

Closes gh-4509
Ref jquery/sizzle#431

src/selector.js

index ea7a7b59188bd4f2f2ae7af24027d013b5d122f1..badb3dd6cddec2a068ac2759836ebe6d47f578f0 100644 (file)
@@ -226,8 +226,11 @@ function find( selector, context, results, seed ) {
                                // descendant combinators, which is not what we want.
                                // In such cases, we work around the behavior by prefixing every selector in the
                                // list with an ID selector referencing the scope context.
+                               // The technique has to be used as well when a leading combinator is used
+                               // as such selectors are not recognized by querySelectorAll.
                                // Thanks to Andrew Dupont for this technique.
-                               if ( nodeType === 1 && rdescend.test( selector ) ) {
+                               if ( nodeType === 1 &&
+                                       ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
 
                                        // Expand context for sibling selectors
                                        newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||