annotate default/node_modules/jquery/external/sizzle/dist/sizzle.js @ 0:1d038bc9b3d2 default tip

Up:default
author Liny <dev@neowd.com>
date Sat, 31 May 2025 09:21:51 +0800
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1 /*!
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2 * Sizzle CSS Selector Engine v2.3.3
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
3 * https://sizzlejs.com/
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
4 *
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
5 * Copyright jQuery Foundation and other contributors
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
6 * Released under the MIT license
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
7 * http://jquery.org/license
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
8 *
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
9 * Date: 2016-08-08
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
10 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
11 (function( window ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
12
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
13 var i,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
14 support,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
15 Expr,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
16 getText,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
17 isXML,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
18 tokenize,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
19 compile,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
20 select,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
21 outermostContext,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
22 sortInput,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
23 hasDuplicate,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
24
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
25 // Local document vars
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
26 setDocument,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
27 document,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
28 docElem,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
29 documentIsHTML,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
30 rbuggyQSA,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
31 rbuggyMatches,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
32 matches,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
33 contains,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
34
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
35 // Instance-specific data
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
36 expando = "sizzle" + 1 * new Date(),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
37 preferredDoc = window.document,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
38 dirruns = 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
39 done = 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
40 classCache = createCache(),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
41 tokenCache = createCache(),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
42 compilerCache = createCache(),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
43 sortOrder = function( a, b ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
44 if ( a === b ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
45 hasDuplicate = true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
46 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
47 return 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
48 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
49
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
50 // Instance methods
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
51 hasOwn = ({}).hasOwnProperty,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
52 arr = [],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
53 pop = arr.pop,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
54 push_native = arr.push,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
55 push = arr.push,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
56 slice = arr.slice,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
57 // Use a stripped-down indexOf as it's faster than native
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
58 // https://jsperf.com/thor-indexof-vs-for/5
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
59 indexOf = function( list, elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
60 var i = 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
61 len = list.length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
62 for ( ; i < len; i++ ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
63 if ( list[i] === elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
64 return i;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
65 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
66 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
67 return -1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
68 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
69
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
70 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
71
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
72 // Regular expressions
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
73
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
74 // http://www.w3.org/TR/css3-selectors/#whitespace
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
75 whitespace = "[\\x20\\t\\r\\n\\f]",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
76
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
77 // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
78 identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
79
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
80 // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
81 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
82 // Operator (capture 2)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
83 "*([*^$|!~]?=)" + whitespace +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
84 // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
85 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
86 "*\\]",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
87
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
88 pseudos = ":(" + identifier + ")(?:\\((" +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
89 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
90 // 1. quoted (capture 3; capture 4 or capture 5)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
91 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
92 // 2. simple (capture 6)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
93 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
94 // 3. anything else (capture 2)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
95 ".*" +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
96 ")\\)|)",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
97
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
98 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
99 rwhitespace = new RegExp( whitespace + "+", "g" ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
100 rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
101
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
102 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
103 rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
104
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
105 rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
106
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
107 rpseudo = new RegExp( pseudos ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
108 ridentifier = new RegExp( "^" + identifier + "$" ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
109
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
110 matchExpr = {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
111 "ID": new RegExp( "^#(" + identifier + ")" ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
112 "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
113 "TAG": new RegExp( "^(" + identifier + "|[*])" ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
114 "ATTR": new RegExp( "^" + attributes ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
115 "PSEUDO": new RegExp( "^" + pseudos ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
116 "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
117 "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
118 "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
119 "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
120 // For use in libraries implementing .is()
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
121 // We use this for POS matching in `select`
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
122 "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
123 whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
124 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
125
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
126 rinputs = /^(?:input|select|textarea|button)$/i,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
127 rheader = /^h\d$/i,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
128
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
129 rnative = /^[^{]+\{\s*\[native \w/,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
130
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
131 // Easily-parseable/retrievable ID or TAG or CLASS selectors
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
132 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
133
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
134 rsibling = /[+~]/,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
135
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
136 // CSS escapes
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
137 // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
138 runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
139 funescape = function( _, escaped, escapedWhitespace ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
140 var high = "0x" + escaped - 0x10000;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
141 // NaN means non-codepoint
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
142 // Support: Firefox<24
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
143 // Workaround erroneous numeric interpretation of +"0x"
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
144 return high !== high || escapedWhitespace ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
145 escaped :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
146 high < 0 ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
147 // BMP codepoint
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
148 String.fromCharCode( high + 0x10000 ) :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
149 // Supplemental Plane codepoint (surrogate pair)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
150 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
151 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
152
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
153 // CSS string/identifier serialization
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
154 // https://drafts.csswg.org/cssom/#common-serializing-idioms
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
155 rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
156 fcssescape = function( ch, asCodePoint ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
157 if ( asCodePoint ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
158
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
159 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
160 if ( ch === "\0" ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
161 return "\uFFFD";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
162 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
163
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
164 // Control characters and (dependent upon position) numbers get escaped as code points
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
165 return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
166 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
167
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
168 // Other potentially-special ASCII characters get backslash-escaped
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
169 return "\\" + ch;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
170 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
171
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
172 // Used for iframes
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
173 // See setDocument()
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
174 // Removing the function wrapper causes a "Permission Denied"
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
175 // error in IE
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
176 unloadHandler = function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
177 setDocument();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
178 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
179
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
180 disabledAncestor = addCombinator(
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
181 function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
182 return elem.disabled === true && ("form" in elem || "label" in elem);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
183 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
184 { dir: "parentNode", next: "legend" }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
185 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
186
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
187 // Optimize for push.apply( _, NodeList )
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
188 try {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
189 push.apply(
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
190 (arr = slice.call( preferredDoc.childNodes )),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
191 preferredDoc.childNodes
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
192 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
193 // Support: Android<4.0
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
194 // Detect silently failing push.apply
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
195 arr[ preferredDoc.childNodes.length ].nodeType;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
196 } catch ( e ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
197 push = { apply: arr.length ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
198
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
199 // Leverage slice if possible
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
200 function( target, els ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
201 push_native.apply( target, slice.call(els) );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
202 } :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
203
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
204 // Support: IE<9
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
205 // Otherwise append directly
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
206 function( target, els ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
207 var j = target.length,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
208 i = 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
209 // Can't trust NodeList.length
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
210 while ( (target[j++] = els[i++]) ) {}
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
211 target.length = j - 1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
212 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
213 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
214 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
215
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
216 function Sizzle( selector, context, results, seed ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
217 var m, i, elem, nid, match, groups, newSelector,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
218 newContext = context && context.ownerDocument,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
219
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
220 // nodeType defaults to 9, since context defaults to document
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
221 nodeType = context ? context.nodeType : 9;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
222
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
223 results = results || [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
224
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
225 // Return early from calls with invalid selector or context
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
226 if ( typeof selector !== "string" || !selector ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
227 nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
228
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
229 return results;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
230 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
231
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
232 // Try to shortcut find operations (as opposed to filters) in HTML documents
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
233 if ( !seed ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
234
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
235 if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
236 setDocument( context );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
237 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
238 context = context || document;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
239
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
240 if ( documentIsHTML ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
241
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
242 // If the selector is sufficiently simple, try using a "get*By*" DOM method
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
243 // (excepting DocumentFragment context, where the methods don't exist)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
244 if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
245
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
246 // ID selector
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
247 if ( (m = match[1]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
248
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
249 // Document context
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
250 if ( nodeType === 9 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
251 if ( (elem = context.getElementById( m )) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
252
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
253 // Support: IE, Opera, Webkit
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
254 // TODO: identify versions
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
255 // getElementById can match elements by name instead of ID
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
256 if ( elem.id === m ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
257 results.push( elem );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
258 return results;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
259 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
260 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
261 return results;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
262 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
263
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
264 // Element context
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
265 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
266
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
267 // Support: IE, Opera, Webkit
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
268 // TODO: identify versions
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
269 // getElementById can match elements by name instead of ID
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
270 if ( newContext && (elem = newContext.getElementById( m )) &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
271 contains( context, elem ) &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
272 elem.id === m ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
273
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
274 results.push( elem );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
275 return results;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
276 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
277 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
278
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
279 // Type selector
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
280 } else if ( match[2] ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
281 push.apply( results, context.getElementsByTagName( selector ) );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
282 return results;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
283
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
284 // Class selector
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
285 } else if ( (m = match[3]) && support.getElementsByClassName &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
286 context.getElementsByClassName ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
287
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
288 push.apply( results, context.getElementsByClassName( m ) );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
289 return results;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
290 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
291 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
292
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
293 // Take advantage of querySelectorAll
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
294 if ( support.qsa &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
295 !compilerCache[ selector + " " ] &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
296 (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
297
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
298 if ( nodeType !== 1 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
299 newContext = context;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
300 newSelector = selector;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
301
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
302 // qSA looks outside Element context, which is not what we want
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
303 // Thanks to Andrew Dupont for this workaround technique
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
304 // Support: IE <=8
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
305 // Exclude object elements
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
306 } else if ( context.nodeName.toLowerCase() !== "object" ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
307
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
308 // Capture the context ID, setting it first if necessary
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
309 if ( (nid = context.getAttribute( "id" )) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
310 nid = nid.replace( rcssescape, fcssescape );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
311 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
312 context.setAttribute( "id", (nid = expando) );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
313 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
314
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
315 // Prefix every selector in the list
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
316 groups = tokenize( selector );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
317 i = groups.length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
318 while ( i-- ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
319 groups[i] = "#" + nid + " " + toSelector( groups[i] );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
320 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
321 newSelector = groups.join( "," );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
322
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
323 // Expand context for sibling selectors
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
324 newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
325 context;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
326 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
327
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
328 if ( newSelector ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
329 try {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
330 push.apply( results,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
331 newContext.querySelectorAll( newSelector )
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
332 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
333 return results;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
334 } catch ( qsaError ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
335 } finally {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
336 if ( nid === expando ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
337 context.removeAttribute( "id" );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
338 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
339 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
340 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
341 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
342 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
343 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
344
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
345 // All others
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
346 return select( selector.replace( rtrim, "$1" ), context, results, seed );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
347 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
348
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
349 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
350 * Create key-value caches of limited size
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
351 * @returns {function(string, object)} Returns the Object data after storing it on itself with
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
352 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
353 * deleting the oldest entry
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
354 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
355 function createCache() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
356 var keys = [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
357
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
358 function cache( key, value ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
359 // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
360 if ( keys.push( key + " " ) > Expr.cacheLength ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
361 // Only keep the most recent entries
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
362 delete cache[ keys.shift() ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
363 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
364 return (cache[ key + " " ] = value);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
365 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
366 return cache;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
367 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
368
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
369 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
370 * Mark a function for special use by Sizzle
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
371 * @param {Function} fn The function to mark
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
372 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
373 function markFunction( fn ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
374 fn[ expando ] = true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
375 return fn;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
376 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
377
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
378 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
379 * Support testing using an element
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
380 * @param {Function} fn Passed the created element and returns a boolean result
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
381 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
382 function assert( fn ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
383 var el = document.createElement("fieldset");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
384
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
385 try {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
386 return !!fn( el );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
387 } catch (e) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
388 return false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
389 } finally {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
390 // Remove from its parent by default
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
391 if ( el.parentNode ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
392 el.parentNode.removeChild( el );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
393 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
394 // release memory in IE
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
395 el = null;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
396 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
397 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
398
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
399 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
400 * Adds the same handler for all of the specified attrs
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
401 * @param {String} attrs Pipe-separated list of attributes
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
402 * @param {Function} handler The method that will be applied
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
403 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
404 function addHandle( attrs, handler ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
405 var arr = attrs.split("|"),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
406 i = arr.length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
407
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
408 while ( i-- ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
409 Expr.attrHandle[ arr[i] ] = handler;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
410 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
411 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
412
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
413 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
414 * Checks document order of two siblings
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
415 * @param {Element} a
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
416 * @param {Element} b
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
417 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
418 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
419 function siblingCheck( a, b ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
420 var cur = b && a,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
421 diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
422 a.sourceIndex - b.sourceIndex;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
423
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
424 // Use IE sourceIndex if available on both nodes
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
425 if ( diff ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
426 return diff;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
427 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
428
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
429 // Check if b follows a
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
430 if ( cur ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
431 while ( (cur = cur.nextSibling) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
432 if ( cur === b ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
433 return -1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
434 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
435 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
436 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
437
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
438 return a ? 1 : -1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
439 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
440
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
441 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
442 * Returns a function to use in pseudos for input types
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
443 * @param {String} type
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
444 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
445 function createInputPseudo( type ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
446 return function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
447 var name = elem.nodeName.toLowerCase();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
448 return name === "input" && elem.type === type;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
449 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
450 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
451
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
452 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
453 * Returns a function to use in pseudos for buttons
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
454 * @param {String} type
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
455 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
456 function createButtonPseudo( type ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
457 return function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
458 var name = elem.nodeName.toLowerCase();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
459 return (name === "input" || name === "button") && elem.type === type;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
460 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
461 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
462
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
463 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
464 * Returns a function to use in pseudos for :enabled/:disabled
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
465 * @param {Boolean} disabled true for :disabled; false for :enabled
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
466 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
467 function createDisabledPseudo( disabled ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
468
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
469 // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
470 return function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
471
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
472 // Only certain elements can match :enabled or :disabled
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
473 // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
474 // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
475 if ( "form" in elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
476
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
477 // Check for inherited disabledness on relevant non-disabled elements:
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
478 // * listed form-associated elements in a disabled fieldset
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
479 // https://html.spec.whatwg.org/multipage/forms.html#category-listed
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
480 // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
481 // * option elements in a disabled optgroup
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
482 // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
483 // All such elements have a "form" property.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
484 if ( elem.parentNode && elem.disabled === false ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
485
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
486 // Option elements defer to a parent optgroup if present
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
487 if ( "label" in elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
488 if ( "label" in elem.parentNode ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
489 return elem.parentNode.disabled === disabled;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
490 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
491 return elem.disabled === disabled;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
492 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
493 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
494
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
495 // Support: IE 6 - 11
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
496 // Use the isDisabled shortcut property to check for disabled fieldset ancestors
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
497 return elem.isDisabled === disabled ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
498
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
499 // Where there is no isDisabled, check manually
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
500 /* jshint -W018 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
501 elem.isDisabled !== !disabled &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
502 disabledAncestor( elem ) === disabled;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
503 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
504
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
505 return elem.disabled === disabled;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
506
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
507 // Try to winnow out elements that can't be disabled before trusting the disabled property.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
508 // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
509 // even exist on them, let alone have a boolean value.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
510 } else if ( "label" in elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
511 return elem.disabled === disabled;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
512 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
513
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
514 // Remaining elements are neither :enabled nor :disabled
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
515 return false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
516 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
517 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
518
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
519 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
520 * Returns a function to use in pseudos for positionals
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
521 * @param {Function} fn
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
522 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
523 function createPositionalPseudo( fn ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
524 return markFunction(function( argument ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
525 argument = +argument;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
526 return markFunction(function( seed, matches ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
527 var j,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
528 matchIndexes = fn( [], seed.length, argument ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
529 i = matchIndexes.length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
530
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
531 // Match elements found at the specified indexes
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
532 while ( i-- ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
533 if ( seed[ (j = matchIndexes[i]) ] ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
534 seed[j] = !(matches[j] = seed[j]);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
535 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
536 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
537 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
538 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
539 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
540
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
541 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
542 * Checks a node for validity as a Sizzle context
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
543 * @param {Element|Object=} context
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
544 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
545 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
546 function testContext( context ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
547 return context && typeof context.getElementsByTagName !== "undefined" && context;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
548 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
549
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
550 // Expose support vars for convenience
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
551 support = Sizzle.support = {};
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
552
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
553 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
554 * Detects XML nodes
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
555 * @param {Element|Object} elem An element or a document
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
556 * @returns {Boolean} True iff elem is a non-HTML XML node
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
557 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
558 isXML = Sizzle.isXML = function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
559 // documentElement is verified for cases where it doesn't yet exist
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
560 // (such as loading iframes in IE - #4833)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
561 var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
562 return documentElement ? documentElement.nodeName !== "HTML" : false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
563 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
564
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
565 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
566 * Sets document-related variables once based on the current document
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
567 * @param {Element|Object} [doc] An element or document object to use to set the document
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
568 * @returns {Object} Returns the current document
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
569 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
570 setDocument = Sizzle.setDocument = function( node ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
571 var hasCompare, subWindow,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
572 doc = node ? node.ownerDocument || node : preferredDoc;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
573
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
574 // Return early if doc is invalid or already selected
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
575 if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
576 return document;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
577 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
578
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
579 // Update global variables
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
580 document = doc;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
581 docElem = document.documentElement;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
582 documentIsHTML = !isXML( document );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
583
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
584 // Support: IE 9-11, Edge
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
585 // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
586 if ( preferredDoc !== document &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
587 (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
588
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
589 // Support: IE 11, Edge
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
590 if ( subWindow.addEventListener ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
591 subWindow.addEventListener( "unload", unloadHandler, false );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
592
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
593 // Support: IE 9 - 10 only
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
594 } else if ( subWindow.attachEvent ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
595 subWindow.attachEvent( "onunload", unloadHandler );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
596 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
597 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
598
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
599 /* Attributes
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
600 ---------------------------------------------------------------------- */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
601
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
602 // Support: IE<8
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
603 // Verify that getAttribute really returns attributes and not properties
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
604 // (excepting IE8 booleans)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
605 support.attributes = assert(function( el ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
606 el.className = "i";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
607 return !el.getAttribute("className");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
608 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
609
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
610 /* getElement(s)By*
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
611 ---------------------------------------------------------------------- */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
612
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
613 // Check if getElementsByTagName("*") returns only elements
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
614 support.getElementsByTagName = assert(function( el ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
615 el.appendChild( document.createComment("") );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
616 return !el.getElementsByTagName("*").length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
617 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
618
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
619 // Support: IE<9
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
620 support.getElementsByClassName = rnative.test( document.getElementsByClassName );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
621
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
622 // Support: IE<10
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
623 // Check if getElementById returns elements by name
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
624 // The broken getElementById methods don't pick up programmatically-set names,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
625 // so use a roundabout getElementsByName test
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
626 support.getById = assert(function( el ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
627 docElem.appendChild( el ).id = expando;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
628 return !document.getElementsByName || !document.getElementsByName( expando ).length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
629 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
630
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
631 // ID filter and find
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
632 if ( support.getById ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
633 Expr.filter["ID"] = function( id ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
634 var attrId = id.replace( runescape, funescape );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
635 return function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
636 return elem.getAttribute("id") === attrId;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
637 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
638 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
639 Expr.find["ID"] = function( id, context ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
640 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
641 var elem = context.getElementById( id );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
642 return elem ? [ elem ] : [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
643 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
644 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
645 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
646 Expr.filter["ID"] = function( id ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
647 var attrId = id.replace( runescape, funescape );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
648 return function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
649 var node = typeof elem.getAttributeNode !== "undefined" &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
650 elem.getAttributeNode("id");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
651 return node && node.value === attrId;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
652 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
653 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
654
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
655 // Support: IE 6 - 7 only
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
656 // getElementById is not reliable as a find shortcut
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
657 Expr.find["ID"] = function( id, context ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
658 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
659 var node, i, elems,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
660 elem = context.getElementById( id );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
661
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
662 if ( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
663
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
664 // Verify the id attribute
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
665 node = elem.getAttributeNode("id");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
666 if ( node && node.value === id ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
667 return [ elem ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
668 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
669
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
670 // Fall back on getElementsByName
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
671 elems = context.getElementsByName( id );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
672 i = 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
673 while ( (elem = elems[i++]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
674 node = elem.getAttributeNode("id");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
675 if ( node && node.value === id ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
676 return [ elem ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
677 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
678 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
679 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
680
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
681 return [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
682 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
683 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
684 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
685
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
686 // Tag
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
687 Expr.find["TAG"] = support.getElementsByTagName ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
688 function( tag, context ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
689 if ( typeof context.getElementsByTagName !== "undefined" ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
690 return context.getElementsByTagName( tag );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
691
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
692 // DocumentFragment nodes don't have gEBTN
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
693 } else if ( support.qsa ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
694 return context.querySelectorAll( tag );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
695 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
696 } :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
697
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
698 function( tag, context ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
699 var elem,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
700 tmp = [],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
701 i = 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
702 // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
703 results = context.getElementsByTagName( tag );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
704
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
705 // Filter out possible comments
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
706 if ( tag === "*" ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
707 while ( (elem = results[i++]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
708 if ( elem.nodeType === 1 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
709 tmp.push( elem );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
710 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
711 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
712
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
713 return tmp;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
714 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
715 return results;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
716 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
717
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
718 // Class
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
719 Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
720 if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
721 return context.getElementsByClassName( className );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
722 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
723 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
724
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
725 /* QSA/matchesSelector
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
726 ---------------------------------------------------------------------- */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
727
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
728 // QSA and matchesSelector support
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
729
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
730 // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
731 rbuggyMatches = [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
732
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
733 // qSa(:focus) reports false when true (Chrome 21)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
734 // We allow this because of a bug in IE8/9 that throws an error
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
735 // whenever `document.activeElement` is accessed on an iframe
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
736 // So, we allow :focus to pass through QSA all the time to avoid the IE error
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
737 // See https://bugs.jquery.com/ticket/13378
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
738 rbuggyQSA = [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
739
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
740 if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
741 // Build QSA regex
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
742 // Regex strategy adopted from Diego Perini
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
743 assert(function( el ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
744 // Select is set to empty string on purpose
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
745 // This is to test IE's treatment of not explicitly
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
746 // setting a boolean content attribute,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
747 // since its presence should be enough
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
748 // https://bugs.jquery.com/ticket/12359
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
749 docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
750 "<select id='" + expando + "-\r\\' msallowcapture=''>" +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
751 "<option selected=''></option></select>";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
752
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
753 // Support: IE8, Opera 11-12.16
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
754 // Nothing should be selected when empty strings follow ^= or $= or *=
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
755 // The test attribute must be unknown in Opera but "safe" for WinRT
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
756 // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
757 if ( el.querySelectorAll("[msallowcapture^='']").length ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
758 rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
759 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
760
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
761 // Support: IE8
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
762 // Boolean attributes and "value" are not treated correctly
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
763 if ( !el.querySelectorAll("[selected]").length ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
764 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
765 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
766
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
767 // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
768 if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
769 rbuggyQSA.push("~=");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
770 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
771
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
772 // Webkit/Opera - :checked should return selected option elements
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
773 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
774 // IE8 throws error here and will not see later tests
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
775 if ( !el.querySelectorAll(":checked").length ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
776 rbuggyQSA.push(":checked");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
777 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
778
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
779 // Support: Safari 8+, iOS 8+
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
780 // https://bugs.webkit.org/show_bug.cgi?id=136851
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
781 // In-page `selector#id sibling-combinator selector` fails
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
782 if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
783 rbuggyQSA.push(".#.+[+~]");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
784 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
785 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
786
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
787 assert(function( el ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
788 el.innerHTML = "<a href='' disabled='disabled'></a>" +
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
789 "<select disabled='disabled'><option/></select>";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
790
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
791 // Support: Windows 8 Native Apps
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
792 // The type and name attributes are restricted during .innerHTML assignment
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
793 var input = document.createElement("input");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
794 input.setAttribute( "type", "hidden" );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
795 el.appendChild( input ).setAttribute( "name", "D" );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
796
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
797 // Support: IE8
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
798 // Enforce case-sensitivity of name attribute
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
799 if ( el.querySelectorAll("[name=d]").length ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
800 rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
801 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
802
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
803 // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
804 // IE8 throws error here and will not see later tests
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
805 if ( el.querySelectorAll(":enabled").length !== 2 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
806 rbuggyQSA.push( ":enabled", ":disabled" );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
807 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
808
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
809 // Support: IE9-11+
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
810 // IE's :disabled selector does not pick up the children of disabled fieldsets
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
811 docElem.appendChild( el ).disabled = true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
812 if ( el.querySelectorAll(":disabled").length !== 2 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
813 rbuggyQSA.push( ":enabled", ":disabled" );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
814 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
815
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
816 // Opera 10-11 does not throw on post-comma invalid pseudos
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
817 el.querySelectorAll("*,:x");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
818 rbuggyQSA.push(",.*:");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
819 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
820 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
821
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
822 if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
823 docElem.webkitMatchesSelector ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
824 docElem.mozMatchesSelector ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
825 docElem.oMatchesSelector ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
826 docElem.msMatchesSelector) )) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
827
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
828 assert(function( el ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
829 // Check to see if it's possible to do matchesSelector
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
830 // on a disconnected node (IE 9)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
831 support.disconnectedMatch = matches.call( el, "*" );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
832
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
833 // This should fail with an exception
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
834 // Gecko does not error, returns false instead
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
835 matches.call( el, "[s!='']:x" );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
836 rbuggyMatches.push( "!=", pseudos );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
837 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
838 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
839
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
840 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
841 rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
842
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
843 /* Contains
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
844 ---------------------------------------------------------------------- */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
845 hasCompare = rnative.test( docElem.compareDocumentPosition );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
846
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
847 // Element contains another
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
848 // Purposefully self-exclusive
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
849 // As in, an element does not contain itself
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
850 contains = hasCompare || rnative.test( docElem.contains ) ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
851 function( a, b ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
852 var adown = a.nodeType === 9 ? a.documentElement : a,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
853 bup = b && b.parentNode;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
854 return a === bup || !!( bup && bup.nodeType === 1 && (
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
855 adown.contains ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
856 adown.contains( bup ) :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
857 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
858 ));
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
859 } :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
860 function( a, b ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
861 if ( b ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
862 while ( (b = b.parentNode) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
863 if ( b === a ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
864 return true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
865 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
866 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
867 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
868 return false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
869 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
870
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
871 /* Sorting
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
872 ---------------------------------------------------------------------- */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
873
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
874 // Document order sorting
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
875 sortOrder = hasCompare ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
876 function( a, b ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
877
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
878 // Flag for duplicate removal
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
879 if ( a === b ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
880 hasDuplicate = true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
881 return 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
882 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
883
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
884 // Sort on method existence if only one input has compareDocumentPosition
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
885 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
886 if ( compare ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
887 return compare;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
888 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
889
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
890 // Calculate position if both inputs belong to the same document
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
891 compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
892 a.compareDocumentPosition( b ) :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
893
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
894 // Otherwise we know they are disconnected
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
895 1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
896
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
897 // Disconnected nodes
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
898 if ( compare & 1 ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
899 (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
900
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
901 // Choose the first element that is related to our preferred document
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
902 if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
903 return -1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
904 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
905 if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
906 return 1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
907 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
908
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
909 // Maintain original order
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
910 return sortInput ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
911 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
912 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
913 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
914
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
915 return compare & 4 ? -1 : 1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
916 } :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
917 function( a, b ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
918 // Exit early if the nodes are identical
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
919 if ( a === b ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
920 hasDuplicate = true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
921 return 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
922 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
923
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
924 var cur,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
925 i = 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
926 aup = a.parentNode,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
927 bup = b.parentNode,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
928 ap = [ a ],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
929 bp = [ b ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
930
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
931 // Parentless nodes are either documents or disconnected
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
932 if ( !aup || !bup ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
933 return a === document ? -1 :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
934 b === document ? 1 :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
935 aup ? -1 :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
936 bup ? 1 :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
937 sortInput ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
938 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
939 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
940
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
941 // If the nodes are siblings, we can do a quick check
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
942 } else if ( aup === bup ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
943 return siblingCheck( a, b );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
944 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
945
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
946 // Otherwise we need full lists of their ancestors for comparison
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
947 cur = a;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
948 while ( (cur = cur.parentNode) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
949 ap.unshift( cur );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
950 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
951 cur = b;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
952 while ( (cur = cur.parentNode) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
953 bp.unshift( cur );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
954 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
955
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
956 // Walk down the tree looking for a discrepancy
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
957 while ( ap[i] === bp[i] ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
958 i++;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
959 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
960
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
961 return i ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
962 // Do a sibling check if the nodes have a common ancestor
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
963 siblingCheck( ap[i], bp[i] ) :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
964
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
965 // Otherwise nodes in our document sort first
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
966 ap[i] === preferredDoc ? -1 :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
967 bp[i] === preferredDoc ? 1 :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
968 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
969 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
970
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
971 return document;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
972 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
973
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
974 Sizzle.matches = function( expr, elements ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
975 return Sizzle( expr, null, null, elements );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
976 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
977
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
978 Sizzle.matchesSelector = function( elem, expr ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
979 // Set document vars if needed
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
980 if ( ( elem.ownerDocument || elem ) !== document ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
981 setDocument( elem );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
982 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
983
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
984 // Make sure that attribute selectors are quoted
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
985 expr = expr.replace( rattributeQuotes, "='$1']" );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
986
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
987 if ( support.matchesSelector && documentIsHTML &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
988 !compilerCache[ expr + " " ] &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
989 ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
990 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
991
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
992 try {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
993 var ret = matches.call( elem, expr );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
994
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
995 // IE 9's matchesSelector returns false on disconnected nodes
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
996 if ( ret || support.disconnectedMatch ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
997 // As well, disconnected nodes are said to be in a document
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
998 // fragment in IE 9
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
999 elem.document && elem.document.nodeType !== 11 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1000 return ret;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1001 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1002 } catch (e) {}
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1003 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1004
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1005 return Sizzle( expr, document, null, [ elem ] ).length > 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1006 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1007
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1008 Sizzle.contains = function( context, elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1009 // Set document vars if needed
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1010 if ( ( context.ownerDocument || context ) !== document ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1011 setDocument( context );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1012 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1013 return contains( context, elem );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1014 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1015
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1016 Sizzle.attr = function( elem, name ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1017 // Set document vars if needed
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1018 if ( ( elem.ownerDocument || elem ) !== document ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1019 setDocument( elem );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1020 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1021
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1022 var fn = Expr.attrHandle[ name.toLowerCase() ],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1023 // Don't get fooled by Object.prototype properties (jQuery #13807)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1024 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1025 fn( elem, name, !documentIsHTML ) :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1026 undefined;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1027
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1028 return val !== undefined ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1029 val :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1030 support.attributes || !documentIsHTML ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1031 elem.getAttribute( name ) :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1032 (val = elem.getAttributeNode(name)) && val.specified ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1033 val.value :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1034 null;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1035 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1036
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1037 Sizzle.escape = function( sel ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1038 return (sel + "").replace( rcssescape, fcssescape );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1039 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1040
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1041 Sizzle.error = function( msg ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1042 throw new Error( "Syntax error, unrecognized expression: " + msg );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1043 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1044
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1045 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1046 * Document sorting and removing duplicates
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1047 * @param {ArrayLike} results
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1048 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1049 Sizzle.uniqueSort = function( results ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1050 var elem,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1051 duplicates = [],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1052 j = 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1053 i = 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1054
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1055 // Unless we *know* we can detect duplicates, assume their presence
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1056 hasDuplicate = !support.detectDuplicates;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1057 sortInput = !support.sortStable && results.slice( 0 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1058 results.sort( sortOrder );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1059
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1060 if ( hasDuplicate ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1061 while ( (elem = results[i++]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1062 if ( elem === results[ i ] ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1063 j = duplicates.push( i );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1064 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1065 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1066 while ( j-- ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1067 results.splice( duplicates[ j ], 1 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1068 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1069 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1070
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1071 // Clear input after sorting to release objects
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1072 // See https://github.com/jquery/sizzle/pull/225
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1073 sortInput = null;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1074
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1075 return results;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1076 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1077
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1078 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1079 * Utility function for retrieving the text value of an array of DOM nodes
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1080 * @param {Array|Element} elem
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1081 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1082 getText = Sizzle.getText = function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1083 var node,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1084 ret = "",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1085 i = 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1086 nodeType = elem.nodeType;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1087
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1088 if ( !nodeType ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1089 // If no nodeType, this is expected to be an array
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1090 while ( (node = elem[i++]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1091 // Do not traverse comment nodes
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1092 ret += getText( node );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1093 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1094 } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1095 // Use textContent for elements
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1096 // innerText usage removed for consistency of new lines (jQuery #11153)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1097 if ( typeof elem.textContent === "string" ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1098 return elem.textContent;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1099 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1100 // Traverse its children
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1101 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1102 ret += getText( elem );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1103 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1104 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1105 } else if ( nodeType === 3 || nodeType === 4 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1106 return elem.nodeValue;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1107 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1108 // Do not include comment or processing instruction nodes
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1109
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1110 return ret;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1111 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1112
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1113 Expr = Sizzle.selectors = {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1114
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1115 // Can be adjusted by the user
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1116 cacheLength: 50,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1117
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1118 createPseudo: markFunction,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1119
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1120 match: matchExpr,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1121
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1122 attrHandle: {},
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1123
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1124 find: {},
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1125
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1126 relative: {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1127 ">": { dir: "parentNode", first: true },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1128 " ": { dir: "parentNode" },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1129 "+": { dir: "previousSibling", first: true },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1130 "~": { dir: "previousSibling" }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1131 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1132
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1133 preFilter: {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1134 "ATTR": function( match ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1135 match[1] = match[1].replace( runescape, funescape );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1136
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1137 // Move the given value to match[3] whether quoted or unquoted
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1138 match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1139
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1140 if ( match[2] === "~=" ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1141 match[3] = " " + match[3] + " ";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1142 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1143
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1144 return match.slice( 0, 4 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1145 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1146
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1147 "CHILD": function( match ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1148 /* matches from matchExpr["CHILD"]
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1149 1 type (only|nth|...)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1150 2 what (child|of-type)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1151 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1152 4 xn-component of xn+y argument ([+-]?\d*n|)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1153 5 sign of xn-component
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1154 6 x of xn-component
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1155 7 sign of y-component
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1156 8 y of y-component
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1157 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1158 match[1] = match[1].toLowerCase();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1159
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1160 if ( match[1].slice( 0, 3 ) === "nth" ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1161 // nth-* requires argument
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1162 if ( !match[3] ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1163 Sizzle.error( match[0] );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1164 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1165
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1166 // numeric x and y parameters for Expr.filter.CHILD
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1167 // remember that false/true cast respectively to 0/1
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1168 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1169 match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1170
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1171 // other types prohibit arguments
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1172 } else if ( match[3] ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1173 Sizzle.error( match[0] );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1174 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1175
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1176 return match;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1177 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1178
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1179 "PSEUDO": function( match ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1180 var excess,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1181 unquoted = !match[6] && match[2];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1182
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1183 if ( matchExpr["CHILD"].test( match[0] ) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1184 return null;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1185 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1186
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1187 // Accept quoted arguments as-is
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1188 if ( match[3] ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1189 match[2] = match[4] || match[5] || "";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1190
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1191 // Strip excess characters from unquoted arguments
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1192 } else if ( unquoted && rpseudo.test( unquoted ) &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1193 // Get excess from tokenize (recursively)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1194 (excess = tokenize( unquoted, true )) &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1195 // advance to the next closing parenthesis
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1196 (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1197
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1198 // excess is a negative index
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1199 match[0] = match[0].slice( 0, excess );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1200 match[2] = unquoted.slice( 0, excess );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1201 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1202
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1203 // Return only captures needed by the pseudo filter method (type and argument)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1204 return match.slice( 0, 3 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1205 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1206 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1207
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1208 filter: {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1209
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1210 "TAG": function( nodeNameSelector ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1211 var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1212 return nodeNameSelector === "*" ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1213 function() { return true; } :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1214 function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1215 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1216 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1217 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1218
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1219 "CLASS": function( className ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1220 var pattern = classCache[ className + " " ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1221
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1222 return pattern ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1223 (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1224 classCache( className, function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1225 return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1226 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1227 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1228
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1229 "ATTR": function( name, operator, check ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1230 return function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1231 var result = Sizzle.attr( elem, name );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1232
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1233 if ( result == null ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1234 return operator === "!=";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1235 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1236 if ( !operator ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1237 return true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1238 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1239
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1240 result += "";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1241
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1242 return operator === "=" ? result === check :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1243 operator === "!=" ? result !== check :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1244 operator === "^=" ? check && result.indexOf( check ) === 0 :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1245 operator === "*=" ? check && result.indexOf( check ) > -1 :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1246 operator === "$=" ? check && result.slice( -check.length ) === check :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1247 operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1248 operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1249 false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1250 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1251 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1252
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1253 "CHILD": function( type, what, argument, first, last ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1254 var simple = type.slice( 0, 3 ) !== "nth",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1255 forward = type.slice( -4 ) !== "last",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1256 ofType = what === "of-type";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1257
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1258 return first === 1 && last === 0 ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1259
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1260 // Shortcut for :nth-*(n)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1261 function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1262 return !!elem.parentNode;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1263 } :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1264
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1265 function( elem, context, xml ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1266 var cache, uniqueCache, outerCache, node, nodeIndex, start,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1267 dir = simple !== forward ? "nextSibling" : "previousSibling",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1268 parent = elem.parentNode,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1269 name = ofType && elem.nodeName.toLowerCase(),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1270 useCache = !xml && !ofType,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1271 diff = false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1272
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1273 if ( parent ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1274
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1275 // :(first|last|only)-(child|of-type)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1276 if ( simple ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1277 while ( dir ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1278 node = elem;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1279 while ( (node = node[ dir ]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1280 if ( ofType ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1281 node.nodeName.toLowerCase() === name :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1282 node.nodeType === 1 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1283
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1284 return false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1285 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1286 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1287 // Reverse direction for :only-* (if we haven't yet done so)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1288 start = dir = type === "only" && !start && "nextSibling";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1289 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1290 return true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1291 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1292
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1293 start = [ forward ? parent.firstChild : parent.lastChild ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1294
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1295 // non-xml :nth-child(...) stores cache data on `parent`
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1296 if ( forward && useCache ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1297
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1298 // Seek `elem` from a previously-cached index
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1299
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1300 // ...in a gzip-friendly way
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1301 node = parent;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1302 outerCache = node[ expando ] || (node[ expando ] = {});
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1303
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1304 // Support: IE <9 only
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1305 // Defend against cloned attroperties (jQuery gh-1709)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1306 uniqueCache = outerCache[ node.uniqueID ] ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1307 (outerCache[ node.uniqueID ] = {});
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1308
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1309 cache = uniqueCache[ type ] || [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1310 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1311 diff = nodeIndex && cache[ 2 ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1312 node = nodeIndex && parent.childNodes[ nodeIndex ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1313
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1314 while ( (node = ++nodeIndex && node && node[ dir ] ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1315
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1316 // Fallback to seeking `elem` from the start
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1317 (diff = nodeIndex = 0) || start.pop()) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1318
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1319 // When found, cache indexes on `parent` and break
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1320 if ( node.nodeType === 1 && ++diff && node === elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1321 uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1322 break;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1323 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1324 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1325
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1326 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1327 // Use previously-cached element index if available
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1328 if ( useCache ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1329 // ...in a gzip-friendly way
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1330 node = elem;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1331 outerCache = node[ expando ] || (node[ expando ] = {});
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1332
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1333 // Support: IE <9 only
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1334 // Defend against cloned attroperties (jQuery gh-1709)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1335 uniqueCache = outerCache[ node.uniqueID ] ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1336 (outerCache[ node.uniqueID ] = {});
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1337
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1338 cache = uniqueCache[ type ] || [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1339 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1340 diff = nodeIndex;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1341 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1342
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1343 // xml :nth-child(...)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1344 // or :nth-last-child(...) or :nth(-last)?-of-type(...)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1345 if ( diff === false ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1346 // Use the same loop as above to seek `elem` from the start
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1347 while ( (node = ++nodeIndex && node && node[ dir ] ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1348 (diff = nodeIndex = 0) || start.pop()) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1349
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1350 if ( ( ofType ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1351 node.nodeName.toLowerCase() === name :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1352 node.nodeType === 1 ) &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1353 ++diff ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1354
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1355 // Cache the index of each encountered element
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1356 if ( useCache ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1357 outerCache = node[ expando ] || (node[ expando ] = {});
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1358
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1359 // Support: IE <9 only
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1360 // Defend against cloned attroperties (jQuery gh-1709)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1361 uniqueCache = outerCache[ node.uniqueID ] ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1362 (outerCache[ node.uniqueID ] = {});
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1363
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1364 uniqueCache[ type ] = [ dirruns, diff ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1365 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1366
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1367 if ( node === elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1368 break;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1369 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1370 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1371 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1372 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1373 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1374
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1375 // Incorporate the offset, then check against cycle size
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1376 diff -= last;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1377 return diff === first || ( diff % first === 0 && diff / first >= 0 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1378 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1379 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1380 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1381
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1382 "PSEUDO": function( pseudo, argument ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1383 // pseudo-class names are case-insensitive
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1384 // http://www.w3.org/TR/selectors/#pseudo-classes
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1385 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1386 // Remember that setFilters inherits from pseudos
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1387 var args,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1388 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1389 Sizzle.error( "unsupported pseudo: " + pseudo );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1390
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1391 // The user may use createPseudo to indicate that
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1392 // arguments are needed to create the filter function
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1393 // just as Sizzle does
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1394 if ( fn[ expando ] ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1395 return fn( argument );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1396 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1397
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1398 // But maintain support for old signatures
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1399 if ( fn.length > 1 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1400 args = [ pseudo, pseudo, "", argument ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1401 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1402 markFunction(function( seed, matches ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1403 var idx,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1404 matched = fn( seed, argument ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1405 i = matched.length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1406 while ( i-- ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1407 idx = indexOf( seed, matched[i] );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1408 seed[ idx ] = !( matches[ idx ] = matched[i] );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1409 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1410 }) :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1411 function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1412 return fn( elem, 0, args );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1413 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1414 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1415
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1416 return fn;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1417 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1418 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1419
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1420 pseudos: {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1421 // Potentially complex pseudos
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1422 "not": markFunction(function( selector ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1423 // Trim the selector passed to compile
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1424 // to avoid treating leading and trailing
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1425 // spaces as combinators
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1426 var input = [],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1427 results = [],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1428 matcher = compile( selector.replace( rtrim, "$1" ) );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1429
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1430 return matcher[ expando ] ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1431 markFunction(function( seed, matches, context, xml ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1432 var elem,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1433 unmatched = matcher( seed, null, xml, [] ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1434 i = seed.length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1435
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1436 // Match elements unmatched by `matcher`
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1437 while ( i-- ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1438 if ( (elem = unmatched[i]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1439 seed[i] = !(matches[i] = elem);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1440 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1441 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1442 }) :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1443 function( elem, context, xml ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1444 input[0] = elem;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1445 matcher( input, null, xml, results );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1446 // Don't keep the element (issue #299)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1447 input[0] = null;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1448 return !results.pop();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1449 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1450 }),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1451
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1452 "has": markFunction(function( selector ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1453 return function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1454 return Sizzle( selector, elem ).length > 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1455 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1456 }),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1457
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1458 "contains": markFunction(function( text ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1459 text = text.replace( runescape, funescape );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1460 return function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1461 return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1462 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1463 }),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1464
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1465 // "Whether an element is represented by a :lang() selector
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1466 // is based solely on the element's language value
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1467 // being equal to the identifier C,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1468 // or beginning with the identifier C immediately followed by "-".
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1469 // The matching of C against the element's language value is performed case-insensitively.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1470 // The identifier C does not have to be a valid language name."
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1471 // http://www.w3.org/TR/selectors/#lang-pseudo
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1472 "lang": markFunction( function( lang ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1473 // lang value must be a valid identifier
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1474 if ( !ridentifier.test(lang || "") ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1475 Sizzle.error( "unsupported lang: " + lang );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1476 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1477 lang = lang.replace( runescape, funescape ).toLowerCase();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1478 return function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1479 var elemLang;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1480 do {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1481 if ( (elemLang = documentIsHTML ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1482 elem.lang :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1483 elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1484
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1485 elemLang = elemLang.toLowerCase();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1486 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1487 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1488 } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1489 return false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1490 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1491 }),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1492
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1493 // Miscellaneous
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1494 "target": function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1495 var hash = window.location && window.location.hash;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1496 return hash && hash.slice( 1 ) === elem.id;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1497 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1498
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1499 "root": function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1500 return elem === docElem;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1501 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1502
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1503 "focus": function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1504 return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1505 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1506
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1507 // Boolean properties
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1508 "enabled": createDisabledPseudo( false ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1509 "disabled": createDisabledPseudo( true ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1510
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1511 "checked": function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1512 // In CSS3, :checked should return both checked and selected elements
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1513 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1514 var nodeName = elem.nodeName.toLowerCase();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1515 return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1516 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1517
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1518 "selected": function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1519 // Accessing this property makes selected-by-default
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1520 // options in Safari work properly
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1521 if ( elem.parentNode ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1522 elem.parentNode.selectedIndex;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1523 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1524
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1525 return elem.selected === true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1526 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1527
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1528 // Contents
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1529 "empty": function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1530 // http://www.w3.org/TR/selectors/#empty-pseudo
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1531 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1532 // but not by others (comment: 8; processing instruction: 7; etc.)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1533 // nodeType < 6 works because attributes (2) do not appear as children
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1534 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1535 if ( elem.nodeType < 6 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1536 return false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1537 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1538 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1539 return true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1540 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1541
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1542 "parent": function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1543 return !Expr.pseudos["empty"]( elem );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1544 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1545
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1546 // Element/input types
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1547 "header": function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1548 return rheader.test( elem.nodeName );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1549 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1550
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1551 "input": function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1552 return rinputs.test( elem.nodeName );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1553 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1554
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1555 "button": function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1556 var name = elem.nodeName.toLowerCase();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1557 return name === "input" && elem.type === "button" || name === "button";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1558 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1559
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1560 "text": function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1561 var attr;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1562 return elem.nodeName.toLowerCase() === "input" &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1563 elem.type === "text" &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1564
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1565 // Support: IE<8
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1566 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1567 ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1568 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1569
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1570 // Position-in-collection
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1571 "first": createPositionalPseudo(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1572 return [ 0 ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1573 }),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1574
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1575 "last": createPositionalPseudo(function( matchIndexes, length ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1576 return [ length - 1 ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1577 }),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1578
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1579 "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1580 return [ argument < 0 ? argument + length : argument ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1581 }),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1582
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1583 "even": createPositionalPseudo(function( matchIndexes, length ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1584 var i = 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1585 for ( ; i < length; i += 2 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1586 matchIndexes.push( i );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1587 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1588 return matchIndexes;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1589 }),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1590
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1591 "odd": createPositionalPseudo(function( matchIndexes, length ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1592 var i = 1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1593 for ( ; i < length; i += 2 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1594 matchIndexes.push( i );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1595 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1596 return matchIndexes;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1597 }),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1598
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1599 "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1600 var i = argument < 0 ? argument + length : argument;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1601 for ( ; --i >= 0; ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1602 matchIndexes.push( i );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1603 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1604 return matchIndexes;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1605 }),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1606
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1607 "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1608 var i = argument < 0 ? argument + length : argument;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1609 for ( ; ++i < length; ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1610 matchIndexes.push( i );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1611 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1612 return matchIndexes;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1613 })
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1614 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1615 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1616
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1617 Expr.pseudos["nth"] = Expr.pseudos["eq"];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1618
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1619 // Add button/input type pseudos
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1620 for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1621 Expr.pseudos[ i ] = createInputPseudo( i );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1622 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1623 for ( i in { submit: true, reset: true } ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1624 Expr.pseudos[ i ] = createButtonPseudo( i );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1625 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1626
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1627 // Easy API for creating new setFilters
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1628 function setFilters() {}
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1629 setFilters.prototype = Expr.filters = Expr.pseudos;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1630 Expr.setFilters = new setFilters();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1631
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1632 tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1633 var matched, match, tokens, type,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1634 soFar, groups, preFilters,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1635 cached = tokenCache[ selector + " " ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1636
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1637 if ( cached ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1638 return parseOnly ? 0 : cached.slice( 0 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1639 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1640
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1641 soFar = selector;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1642 groups = [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1643 preFilters = Expr.preFilter;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1644
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1645 while ( soFar ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1646
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1647 // Comma and first run
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1648 if ( !matched || (match = rcomma.exec( soFar )) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1649 if ( match ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1650 // Don't consume trailing commas as valid
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1651 soFar = soFar.slice( match[0].length ) || soFar;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1652 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1653 groups.push( (tokens = []) );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1654 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1655
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1656 matched = false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1657
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1658 // Combinators
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1659 if ( (match = rcombinators.exec( soFar )) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1660 matched = match.shift();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1661 tokens.push({
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1662 value: matched,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1663 // Cast descendant combinators to space
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1664 type: match[0].replace( rtrim, " " )
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1665 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1666 soFar = soFar.slice( matched.length );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1667 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1668
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1669 // Filters
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1670 for ( type in Expr.filter ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1671 if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1672 (match = preFilters[ type ]( match ))) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1673 matched = match.shift();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1674 tokens.push({
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1675 value: matched,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1676 type: type,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1677 matches: match
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1678 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1679 soFar = soFar.slice( matched.length );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1680 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1681 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1682
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1683 if ( !matched ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1684 break;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1685 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1686 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1687
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1688 // Return the length of the invalid excess
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1689 // if we're just parsing
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1690 // Otherwise, throw an error or return tokens
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1691 return parseOnly ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1692 soFar.length :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1693 soFar ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1694 Sizzle.error( selector ) :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1695 // Cache the tokens
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1696 tokenCache( selector, groups ).slice( 0 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1697 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1698
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1699 function toSelector( tokens ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1700 var i = 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1701 len = tokens.length,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1702 selector = "";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1703 for ( ; i < len; i++ ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1704 selector += tokens[i].value;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1705 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1706 return selector;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1707 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1708
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1709 function addCombinator( matcher, combinator, base ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1710 var dir = combinator.dir,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1711 skip = combinator.next,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1712 key = skip || dir,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1713 checkNonElements = base && key === "parentNode",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1714 doneName = done++;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1715
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1716 return combinator.first ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1717 // Check against closest ancestor/preceding element
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1718 function( elem, context, xml ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1719 while ( (elem = elem[ dir ]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1720 if ( elem.nodeType === 1 || checkNonElements ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1721 return matcher( elem, context, xml );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1722 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1723 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1724 return false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1725 } :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1726
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1727 // Check against all ancestor/preceding elements
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1728 function( elem, context, xml ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1729 var oldCache, uniqueCache, outerCache,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1730 newCache = [ dirruns, doneName ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1731
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1732 // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1733 if ( xml ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1734 while ( (elem = elem[ dir ]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1735 if ( elem.nodeType === 1 || checkNonElements ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1736 if ( matcher( elem, context, xml ) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1737 return true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1738 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1739 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1740 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1741 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1742 while ( (elem = elem[ dir ]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1743 if ( elem.nodeType === 1 || checkNonElements ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1744 outerCache = elem[ expando ] || (elem[ expando ] = {});
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1745
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1746 // Support: IE <9 only
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1747 // Defend against cloned attroperties (jQuery gh-1709)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1748 uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1749
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1750 if ( skip && skip === elem.nodeName.toLowerCase() ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1751 elem = elem[ dir ] || elem;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1752 } else if ( (oldCache = uniqueCache[ key ]) &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1753 oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1754
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1755 // Assign to newCache so results back-propagate to previous elements
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1756 return (newCache[ 2 ] = oldCache[ 2 ]);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1757 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1758 // Reuse newcache so results back-propagate to previous elements
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1759 uniqueCache[ key ] = newCache;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1760
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1761 // A match means we're done; a fail means we have to keep checking
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1762 if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1763 return true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1764 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1765 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1766 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1767 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1768 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1769 return false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1770 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1771 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1772
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1773 function elementMatcher( matchers ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1774 return matchers.length > 1 ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1775 function( elem, context, xml ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1776 var i = matchers.length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1777 while ( i-- ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1778 if ( !matchers[i]( elem, context, xml ) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1779 return false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1780 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1781 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1782 return true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1783 } :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1784 matchers[0];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1785 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1786
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1787 function multipleContexts( selector, contexts, results ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1788 var i = 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1789 len = contexts.length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1790 for ( ; i < len; i++ ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1791 Sizzle( selector, contexts[i], results );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1792 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1793 return results;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1794 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1795
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1796 function condense( unmatched, map, filter, context, xml ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1797 var elem,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1798 newUnmatched = [],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1799 i = 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1800 len = unmatched.length,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1801 mapped = map != null;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1802
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1803 for ( ; i < len; i++ ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1804 if ( (elem = unmatched[i]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1805 if ( !filter || filter( elem, context, xml ) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1806 newUnmatched.push( elem );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1807 if ( mapped ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1808 map.push( i );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1809 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1810 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1811 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1812 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1813
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1814 return newUnmatched;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1815 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1816
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1817 function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1818 if ( postFilter && !postFilter[ expando ] ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1819 postFilter = setMatcher( postFilter );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1820 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1821 if ( postFinder && !postFinder[ expando ] ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1822 postFinder = setMatcher( postFinder, postSelector );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1823 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1824 return markFunction(function( seed, results, context, xml ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1825 var temp, i, elem,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1826 preMap = [],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1827 postMap = [],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1828 preexisting = results.length,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1829
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1830 // Get initial elements from seed or context
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1831 elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1832
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1833 // Prefilter to get matcher input, preserving a map for seed-results synchronization
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1834 matcherIn = preFilter && ( seed || !selector ) ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1835 condense( elems, preMap, preFilter, context, xml ) :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1836 elems,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1837
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1838 matcherOut = matcher ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1839 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1840 postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1841
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1842 // ...intermediate processing is necessary
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1843 [] :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1844
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1845 // ...otherwise use results directly
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1846 results :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1847 matcherIn;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1848
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1849 // Find primary matches
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1850 if ( matcher ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1851 matcher( matcherIn, matcherOut, context, xml );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1852 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1853
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1854 // Apply postFilter
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1855 if ( postFilter ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1856 temp = condense( matcherOut, postMap );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1857 postFilter( temp, [], context, xml );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1858
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1859 // Un-match failing elements by moving them back to matcherIn
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1860 i = temp.length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1861 while ( i-- ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1862 if ( (elem = temp[i]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1863 matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1864 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1865 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1866 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1867
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1868 if ( seed ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1869 if ( postFinder || preFilter ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1870 if ( postFinder ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1871 // Get the final matcherOut by condensing this intermediate into postFinder contexts
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1872 temp = [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1873 i = matcherOut.length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1874 while ( i-- ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1875 if ( (elem = matcherOut[i]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1876 // Restore matcherIn since elem is not yet a final match
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1877 temp.push( (matcherIn[i] = elem) );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1878 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1879 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1880 postFinder( null, (matcherOut = []), temp, xml );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1881 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1882
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1883 // Move matched elements from seed to results to keep them synchronized
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1884 i = matcherOut.length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1885 while ( i-- ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1886 if ( (elem = matcherOut[i]) &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1887 (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1888
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1889 seed[temp] = !(results[temp] = elem);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1890 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1891 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1892 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1893
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1894 // Add elements to results, through postFinder if defined
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1895 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1896 matcherOut = condense(
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1897 matcherOut === results ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1898 matcherOut.splice( preexisting, matcherOut.length ) :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1899 matcherOut
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1900 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1901 if ( postFinder ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1902 postFinder( null, results, matcherOut, xml );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1903 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1904 push.apply( results, matcherOut );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1905 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1906 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1907 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1908 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1909
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1910 function matcherFromTokens( tokens ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1911 var checkContext, matcher, j,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1912 len = tokens.length,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1913 leadingRelative = Expr.relative[ tokens[0].type ],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1914 implicitRelative = leadingRelative || Expr.relative[" "],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1915 i = leadingRelative ? 1 : 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1916
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1917 // The foundational matcher ensures that elements are reachable from top-level context(s)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1918 matchContext = addCombinator( function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1919 return elem === checkContext;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1920 }, implicitRelative, true ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1921 matchAnyContext = addCombinator( function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1922 return indexOf( checkContext, elem ) > -1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1923 }, implicitRelative, true ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1924 matchers = [ function( elem, context, xml ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1925 var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1926 (checkContext = context).nodeType ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1927 matchContext( elem, context, xml ) :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1928 matchAnyContext( elem, context, xml ) );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1929 // Avoid hanging onto element (issue #299)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1930 checkContext = null;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1931 return ret;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1932 } ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1933
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1934 for ( ; i < len; i++ ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1935 if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1936 matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1937 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1938 matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1939
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1940 // Return special upon seeing a positional matcher
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1941 if ( matcher[ expando ] ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1942 // Find the next relative operator (if any) for proper handling
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1943 j = ++i;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1944 for ( ; j < len; j++ ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1945 if ( Expr.relative[ tokens[j].type ] ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1946 break;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1947 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1948 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1949 return setMatcher(
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1950 i > 1 && elementMatcher( matchers ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1951 i > 1 && toSelector(
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1952 // If the preceding token was a descendant combinator, insert an implicit any-element `*`
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1953 tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1954 ).replace( rtrim, "$1" ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1955 matcher,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1956 i < j && matcherFromTokens( tokens.slice( i, j ) ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1957 j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1958 j < len && toSelector( tokens )
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1959 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1960 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1961 matchers.push( matcher );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1962 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1963 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1964
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1965 return elementMatcher( matchers );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1966 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1967
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1968 function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1969 var bySet = setMatchers.length > 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1970 byElement = elementMatchers.length > 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1971 superMatcher = function( seed, context, xml, results, outermost ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1972 var elem, j, matcher,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1973 matchedCount = 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1974 i = "0",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1975 unmatched = seed && [],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1976 setMatched = [],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1977 contextBackup = outermostContext,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1978 // We must always have either seed elements or outermost context
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1979 elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1980 // Use integer dirruns iff this is the outermost matcher
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1981 dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1982 len = elems.length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1983
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1984 if ( outermost ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1985 outermostContext = context === document || context || outermost;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1986 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1987
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1988 // Add elements passing elementMatchers directly to results
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1989 // Support: IE<9, Safari
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1990 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1991 for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1992 if ( byElement && elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1993 j = 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1994 if ( !context && elem.ownerDocument !== document ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1995 setDocument( elem );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1996 xml = !documentIsHTML;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1997 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1998 while ( (matcher = elementMatchers[j++]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1999 if ( matcher( elem, context || document, xml) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2000 results.push( elem );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2001 break;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2002 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2003 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2004 if ( outermost ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2005 dirruns = dirrunsUnique;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2006 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2007 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2008
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2009 // Track unmatched elements for set filters
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2010 if ( bySet ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2011 // They will have gone through all possible matchers
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2012 if ( (elem = !matcher && elem) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2013 matchedCount--;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2014 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2015
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2016 // Lengthen the array for every element, matched or not
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2017 if ( seed ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2018 unmatched.push( elem );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2019 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2020 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2021 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2022
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2023 // `i` is now the count of elements visited above, and adding it to `matchedCount`
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2024 // makes the latter nonnegative.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2025 matchedCount += i;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2026
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2027 // Apply set filters to unmatched elements
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2028 // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2029 // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2030 // no element matchers and no seed.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2031 // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2032 // case, which will result in a "00" `matchedCount` that differs from `i` but is also
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2033 // numerically zero.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2034 if ( bySet && i !== matchedCount ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2035 j = 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2036 while ( (matcher = setMatchers[j++]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2037 matcher( unmatched, setMatched, context, xml );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2038 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2039
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2040 if ( seed ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2041 // Reintegrate element matches to eliminate the need for sorting
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2042 if ( matchedCount > 0 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2043 while ( i-- ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2044 if ( !(unmatched[i] || setMatched[i]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2045 setMatched[i] = pop.call( results );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2046 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2047 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2048 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2049
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2050 // Discard index placeholder values to get only actual matches
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2051 setMatched = condense( setMatched );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2052 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2053
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2054 // Add matches to results
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2055 push.apply( results, setMatched );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2056
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2057 // Seedless set matches succeeding multiple successful matchers stipulate sorting
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2058 if ( outermost && !seed && setMatched.length > 0 &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2059 ( matchedCount + setMatchers.length ) > 1 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2060
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2061 Sizzle.uniqueSort( results );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2062 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2063 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2064
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2065 // Override manipulation of globals by nested matchers
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2066 if ( outermost ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2067 dirruns = dirrunsUnique;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2068 outermostContext = contextBackup;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2069 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2070
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2071 return unmatched;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2072 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2073
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2074 return bySet ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2075 markFunction( superMatcher ) :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2076 superMatcher;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2077 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2078
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2079 compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2080 var i,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2081 setMatchers = [],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2082 elementMatchers = [],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2083 cached = compilerCache[ selector + " " ];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2084
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2085 if ( !cached ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2086 // Generate a function of recursive functions that can be used to check each element
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2087 if ( !match ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2088 match = tokenize( selector );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2089 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2090 i = match.length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2091 while ( i-- ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2092 cached = matcherFromTokens( match[i] );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2093 if ( cached[ expando ] ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2094 setMatchers.push( cached );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2095 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2096 elementMatchers.push( cached );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2097 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2098 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2099
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2100 // Cache the compiled function
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2101 cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2102
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2103 // Save selector and tokenization
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2104 cached.selector = selector;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2105 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2106 return cached;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2107 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2108
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2109 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2110 * A low-level selection function that works with Sizzle's compiled
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2111 * selector functions
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2112 * @param {String|Function} selector A selector or a pre-compiled
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2113 * selector function built with Sizzle.compile
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2114 * @param {Element} context
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2115 * @param {Array} [results]
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2116 * @param {Array} [seed] A set of elements to match against
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2117 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2118 select = Sizzle.select = function( selector, context, results, seed ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2119 var i, tokens, token, type, find,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2120 compiled = typeof selector === "function" && selector,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2121 match = !seed && tokenize( (selector = compiled.selector || selector) );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2122
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2123 results = results || [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2124
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2125 // Try to minimize operations if there is only one selector in the list and no seed
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2126 // (the latter of which guarantees us context)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2127 if ( match.length === 1 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2128
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2129 // Reduce context if the leading compound selector is an ID
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2130 tokens = match[0] = match[0].slice( 0 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2131 if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2132 context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2133
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2134 context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2135 if ( !context ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2136 return results;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2137
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2138 // Precompiled matchers will still verify ancestry, so step up a level
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2139 } else if ( compiled ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2140 context = context.parentNode;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2141 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2142
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2143 selector = selector.slice( tokens.shift().value.length );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2144 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2145
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2146 // Fetch a seed set for right-to-left matching
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2147 i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2148 while ( i-- ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2149 token = tokens[i];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2150
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2151 // Abort if we hit a combinator
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2152 if ( Expr.relative[ (type = token.type) ] ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2153 break;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2154 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2155 if ( (find = Expr.find[ type ]) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2156 // Search, expanding context for leading sibling combinators
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2157 if ( (seed = find(
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2158 token.matches[0].replace( runescape, funescape ),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2159 rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2160 )) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2161
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2162 // If seed is empty or no tokens remain, we can return early
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2163 tokens.splice( i, 1 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2164 selector = seed.length && toSelector( tokens );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2165 if ( !selector ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2166 push.apply( results, seed );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2167 return results;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2168 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2169
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2170 break;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2171 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2172 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2173 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2174 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2175
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2176 // Compile and execute a filtering function if one is not provided
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2177 // Provide `match` to avoid retokenization if we modified the selector above
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2178 ( compiled || compile( selector, match ) )(
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2179 seed,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2180 context,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2181 !documentIsHTML,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2182 results,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2183 !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2184 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2185 return results;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2186 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2187
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2188 // One-time assignments
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2189
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2190 // Sort stability
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2191 support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2192
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2193 // Support: Chrome 14-35+
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2194 // Always assume duplicates if they aren't passed to the comparison function
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2195 support.detectDuplicates = !!hasDuplicate;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2196
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2197 // Initialize against the default document
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2198 setDocument();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2199
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2200 // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2201 // Detached nodes confoundingly follow *each other*
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2202 support.sortDetached = assert(function( el ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2203 // Should return 1, but returns 4 (following)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2204 return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2205 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2206
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2207 // Support: IE<8
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2208 // Prevent attribute/property "interpolation"
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2209 // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2210 if ( !assert(function( el ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2211 el.innerHTML = "<a href='#'></a>";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2212 return el.firstChild.getAttribute("href") === "#" ;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2213 }) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2214 addHandle( "type|href|height|width", function( elem, name, isXML ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2215 if ( !isXML ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2216 return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2217 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2218 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2219 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2220
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2221 // Support: IE<9
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2222 // Use defaultValue in place of getAttribute("value")
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2223 if ( !support.attributes || !assert(function( el ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2224 el.innerHTML = "<input/>";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2225 el.firstChild.setAttribute( "value", "" );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2226 return el.firstChild.getAttribute( "value" ) === "";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2227 }) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2228 addHandle( "value", function( elem, name, isXML ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2229 if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2230 return elem.defaultValue;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2231 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2232 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2233 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2234
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2235 // Support: IE<9
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2236 // Use getAttributeNode to fetch booleans when getAttribute lies
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2237 if ( !assert(function( el ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2238 return el.getAttribute("disabled") == null;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2239 }) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2240 addHandle( booleans, function( elem, name, isXML ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2241 var val;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2242 if ( !isXML ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2243 return elem[ name ] === true ? name.toLowerCase() :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2244 (val = elem.getAttributeNode( name )) && val.specified ?
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2245 val.value :
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2246 null;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2247 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2248 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2249 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2250
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2251 // EXPOSE
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2252 var _sizzle = window.Sizzle;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2253
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2254 Sizzle.noConflict = function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2255 if ( window.Sizzle === Sizzle ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2256 window.Sizzle = _sizzle;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2257 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2258
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2259 return Sizzle;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2260 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2261
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2262 if ( typeof define === "function" && define.amd ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2263 define(function() { return Sizzle; });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2264 // Sizzle requires that there be a global window in Common-JS like environments
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2265 } else if ( typeof module !== "undefined" && module.exports ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2266 module.exports = Sizzle;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2267 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2268 window.Sizzle = Sizzle;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2269 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2270 // EXPOSE
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2271
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2272 })( window );