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