0
|
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 } );
|