aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichał Gołębiowski-Owczarek <m.goleb@gmail.com>2022-11-21 23:23:39 +0100
committerGitHub <noreply@github.com>2022-11-21 23:23:39 +0100
commit4c1171f2ed62584211250df0af8302d34c04621a (patch)
treeba1f6a5a977f32ca3dd67396458ca6bca602fe0e /src
parentf62d8e2159baf1eabf3b760b85b2dda56d569a09 (diff)
downloadjquery-4c1171f2ed62584211250df0af8302d34c04621a.tar.gz
jquery-4c1171f2ed62584211250df0af8302d34c04621a.zip
Selector: Re-introduce selector-native.js
Re-introduce the `selector-native` similar to the one on the `3.x-stable` branch. One difference is since the `main` branch inlined Sizzle, some selector utils can be shared between the main `selector` module and `selector-native`. The main `selector` module can be disabled in favor of `selector-native` via: grunt custom:-selector Other changes: * Tests: Fix Safari detection - Chrome Headless has a different user agent than Safari and a browser check in selector tests didn't take that into account. * Tests: Run selector-native tests in `npm test` * Selector: Fix querying on document fragments Ref gh-4395 Closes gh-5085
Diffstat (limited to 'src')
-rw-r--r--src/selector-native.js88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/selector-native.js b/src/selector-native.js
new file mode 100644
index 000000000..0e2e48d81
--- /dev/null
+++ b/src/selector-native.js
@@ -0,0 +1,88 @@
+/*
+ * Optional limited selector module for custom builds.
+ *
+ * Note that this DOES NOT SUPPORT many documented jQuery
+ * features in exchange for its smaller size:
+ *
+ * * Attribute not equal selector (!=)
+ * * Positional selectors (:first; :eq(n); :odd; etc.)
+ * * Type selectors (:input; :checkbox; :button; etc.)
+ * * State-based selectors (:animated; :visible; :hidden; etc.)
+ * * :has(selector)
+ * * :not(complex selector)
+ * * custom selectors via jQuery extensions
+ * * Leading combinators (e.g., $collection.find("> *"))
+ * * Reliable functionality on XML fragments
+ * * Requiring all parts of a selector to match elements under context
+ * (e.g., $div.find("div > *") now matches children of $div)
+ * * Matching against non-elements
+ * * Reliable sorting of disconnected nodes
+ * * querySelectorAll bug fixes (e.g., unreliable :focus on WebKit)
+ *
+ * If any of these are unacceptable tradeoffs, either use the full
+ * selector engine or customize this stub for the project's specific
+ * needs.
+ */
+
+import jQuery from "./core.js";
+import document from "./var/document.js";
+import documentElement from "./var/documentElement.js";
+import whitespace from "./var/whitespace.js";
+
+// The following utils are attached directly to the jQuery object.
+import "./selector/contains.js";
+import "./selector/escapeSelector.js";
+import "./selector/uniqueSort.js";
+
+// Support: IE 9 - 11+
+// IE requires a prefix.
+var matches = documentElement.matches || documentElement.msMatchesSelector;
+
+jQuery.extend( {
+ find: function( selector, context, results, seed ) {
+ var elem, nodeType,
+ i = 0;
+
+ results = results || [];
+ context = context || document;
+
+ // Same basic safeguard as in the full selector module
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ // Early return if context is not an element, document or document fragment
+ if ( ( nodeType = context.nodeType ) !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+ return [];
+ }
+
+ if ( seed ) {
+ while ( ( elem = seed[ i++ ] ) ) {
+ if ( jQuery.find.matchesSelector( elem, selector ) ) {
+ results.push( elem );
+ }
+ }
+ } else {
+ jQuery.merge( results, context.querySelectorAll( selector ) );
+ }
+
+ return results;
+ },
+ expr: {
+ attrHandle: {},
+ match: {
+ bool: new RegExp( "^(?:checked|selected|async|autofocus|autoplay|controls|defer" +
+ "|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$", "i" ),
+ needsContext: new RegExp( "^" + whitespace + "*[>+~]" )
+ }
+ }
+} );
+
+jQuery.extend( jQuery.find, {
+ matches: function( expr, elements ) {
+ return jQuery.find( expr, null, null, elements );
+ },
+ matchesSelector: function( elem, expr ) {
+ return matches.call( elem, expr );
+ }
+} );