Mercurial > nebulaweb3
comparison default/node_modules/jquery/src/selector-native.js @ 0:1d038bc9b3d2 default tip
Up:default
author | Liny <dev@neowd.com> |
---|---|
date | Sat, 31 May 2025 09:21:51 +0800 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1d038bc9b3d2 |
---|---|
1 define( [ | |
2 "./core", | |
3 "./var/document", | |
4 "./var/documentElement", | |
5 "./var/hasOwn", | |
6 "./var/indexOf" | |
7 ], function( jQuery, document, documentElement, hasOwn, indexOf ) { | |
8 | |
9 "use strict"; | |
10 | |
11 /* | |
12 * Optional (non-Sizzle) selector module for custom builds. | |
13 * | |
14 * Note that this DOES NOT SUPPORT many documented jQuery | |
15 * features in exchange for its smaller size: | |
16 * | |
17 * Attribute not equal selector | |
18 * Positional selectors (:first; :eq(n); :odd; etc.) | |
19 * Type selectors (:input; :checkbox; :button; etc.) | |
20 * State-based selectors (:animated; :visible; :hidden; etc.) | |
21 * :has(selector) | |
22 * :not(complex selector) | |
23 * custom selectors via Sizzle extensions | |
24 * Leading combinators (e.g., $collection.find("> *")) | |
25 * Reliable functionality on XML fragments | |
26 * Requiring all parts of a selector to match elements under context | |
27 * (e.g., $div.find("div > *") now matches children of $div) | |
28 * Matching against non-elements | |
29 * Reliable sorting of disconnected nodes | |
30 * querySelectorAll bug fixes (e.g., unreliable :focus on WebKit) | |
31 * | |
32 * If any of these are unacceptable tradeoffs, either use Sizzle or | |
33 * customize this stub for the project's specific needs. | |
34 */ | |
35 | |
36 var hasDuplicate, sortInput, | |
37 sortStable = jQuery.expando.split( "" ).sort( sortOrder ).join( "" ) === jQuery.expando, | |
38 matches = documentElement.matches || | |
39 documentElement.webkitMatchesSelector || | |
40 documentElement.mozMatchesSelector || | |
41 documentElement.oMatchesSelector || | |
42 documentElement.msMatchesSelector, | |
43 | |
44 // CSS string/identifier serialization | |
45 // https://drafts.csswg.org/cssom/#common-serializing-idioms | |
46 rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g, | |
47 fcssescape = function( ch, asCodePoint ) { | |
48 if ( asCodePoint ) { | |
49 | |
50 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER | |
51 if ( ch === "\0" ) { | |
52 return "\uFFFD"; | |
53 } | |
54 | |
55 // Control characters and (dependent upon position) numbers get escaped as code points | |
56 return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; | |
57 } | |
58 | |
59 // Other potentially-special ASCII characters get backslash-escaped | |
60 return "\\" + ch; | |
61 }; | |
62 | |
63 function sortOrder( a, b ) { | |
64 | |
65 // Flag for duplicate removal | |
66 if ( a === b ) { | |
67 hasDuplicate = true; | |
68 return 0; | |
69 } | |
70 | |
71 // Sort on method existence if only one input has compareDocumentPosition | |
72 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; | |
73 if ( compare ) { | |
74 return compare; | |
75 } | |
76 | |
77 // Calculate position if both inputs belong to the same document | |
78 compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? | |
79 a.compareDocumentPosition( b ) : | |
80 | |
81 // Otherwise we know they are disconnected | |
82 1; | |
83 | |
84 // Disconnected nodes | |
85 if ( compare & 1 ) { | |
86 | |
87 // Choose the first element that is related to our preferred document | |
88 if ( a === document || a.ownerDocument === document && | |
89 jQuery.contains( document, a ) ) { | |
90 return -1; | |
91 } | |
92 if ( b === document || b.ownerDocument === document && | |
93 jQuery.contains( document, b ) ) { | |
94 return 1; | |
95 } | |
96 | |
97 // Maintain original order | |
98 return sortInput ? | |
99 ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : | |
100 0; | |
101 } | |
102 | |
103 return compare & 4 ? -1 : 1; | |
104 } | |
105 | |
106 function uniqueSort( results ) { | |
107 var elem, | |
108 duplicates = [], | |
109 j = 0, | |
110 i = 0; | |
111 | |
112 hasDuplicate = false; | |
113 sortInput = !sortStable && results.slice( 0 ); | |
114 results.sort( sortOrder ); | |
115 | |
116 if ( hasDuplicate ) { | |
117 while ( ( elem = results[ i++ ] ) ) { | |
118 if ( elem === results[ i ] ) { | |
119 j = duplicates.push( i ); | |
120 } | |
121 } | |
122 while ( j-- ) { | |
123 results.splice( duplicates[ j ], 1 ); | |
124 } | |
125 } | |
126 | |
127 // Clear input after sorting to release objects | |
128 // See https://github.com/jquery/sizzle/pull/225 | |
129 sortInput = null; | |
130 | |
131 return results; | |
132 } | |
133 | |
134 function escape( sel ) { | |
135 return ( sel + "" ).replace( rcssescape, fcssescape ); | |
136 } | |
137 | |
138 jQuery.extend( { | |
139 uniqueSort: uniqueSort, | |
140 unique: uniqueSort, | |
141 escapeSelector: escape, | |
142 find: function( selector, context, results, seed ) { | |
143 var elem, nodeType, | |
144 i = 0; | |
145 | |
146 results = results || []; | |
147 context = context || document; | |
148 | |
149 // Same basic safeguard as Sizzle | |
150 if ( !selector || typeof selector !== "string" ) { | |
151 return results; | |
152 } | |
153 | |
154 // Early return if context is not an element or document | |
155 if ( ( nodeType = context.nodeType ) !== 1 && nodeType !== 9 ) { | |
156 return []; | |
157 } | |
158 | |
159 if ( seed ) { | |
160 while ( ( elem = seed[ i++ ] ) ) { | |
161 if ( jQuery.find.matchesSelector( elem, selector ) ) { | |
162 results.push( elem ); | |
163 } | |
164 } | |
165 } else { | |
166 jQuery.merge( results, context.querySelectorAll( selector ) ); | |
167 } | |
168 | |
169 return results; | |
170 }, | |
171 text: function( elem ) { | |
172 var node, | |
173 ret = "", | |
174 i = 0, | |
175 nodeType = elem.nodeType; | |
176 | |
177 if ( !nodeType ) { | |
178 | |
179 // If no nodeType, this is expected to be an array | |
180 while ( ( node = elem[ i++ ] ) ) { | |
181 | |
182 // Do not traverse comment nodes | |
183 ret += jQuery.text( node ); | |
184 } | |
185 } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { | |
186 | |
187 // Use textContent for elements | |
188 return elem.textContent; | |
189 } else if ( nodeType === 3 || nodeType === 4 ) { | |
190 return elem.nodeValue; | |
191 } | |
192 | |
193 // Do not include comment or processing instruction nodes | |
194 | |
195 return ret; | |
196 }, | |
197 contains: function( a, b ) { | |
198 var adown = a.nodeType === 9 ? a.documentElement : a, | |
199 bup = b && b.parentNode; | |
200 return a === bup || !!( bup && bup.nodeType === 1 && adown.contains( bup ) ); | |
201 }, | |
202 isXMLDoc: function( elem ) { | |
203 | |
204 // documentElement is verified for cases where it doesn't yet exist | |
205 // (such as loading iframes in IE - #4833) | |
206 var documentElement = elem && ( elem.ownerDocument || elem ).documentElement; | |
207 return documentElement ? documentElement.nodeName !== "HTML" : false; | |
208 }, | |
209 expr: { | |
210 attrHandle: {}, | |
211 match: { | |
212 bool: new RegExp( "^(?:checked|selected|async|autofocus|autoplay|controls|defer" + | |
213 "|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$", "i" ), | |
214 needsContext: /^[\x20\t\r\n\f]*[>+~]/ | |
215 } | |
216 } | |
217 } ); | |
218 | |
219 jQuery.extend( jQuery.find, { | |
220 matches: function( expr, elements ) { | |
221 return jQuery.find( expr, null, null, elements ); | |
222 }, | |
223 matchesSelector: function( elem, expr ) { | |
224 return matches.call( elem, expr ); | |
225 }, | |
226 attr: function( elem, name ) { | |
227 var fn = jQuery.expr.attrHandle[ name.toLowerCase() ], | |
228 | |
229 // Don't get fooled by Object.prototype properties (jQuery #13807) | |
230 value = fn && hasOwn.call( jQuery.expr.attrHandle, name.toLowerCase() ) ? | |
231 fn( elem, name, jQuery.isXMLDoc( elem ) ) : | |
232 undefined; | |
233 return value !== undefined ? value : elem.getAttribute( name ); | |
234 } | |
235 } ); | |
236 | |
237 } ); |