You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
237 lines
6.2 KiB
237 lines
6.2 KiB
define( [ |
|
"./core", |
|
"./var/document", |
|
"./var/documentElement", |
|
"./var/hasOwn", |
|
"./var/indexOf" |
|
], function( jQuery, document, documentElement, hasOwn, indexOf ) { |
|
|
|
"use strict"; |
|
|
|
/* |
|
* Optional (non-Sizzle) selector module for custom builds. |
|
* |
|
* Note that this DOES NOT SUPPORT many documented jQuery |
|
* features in exchange for its smaller size: |
|
* |
|
* Attribute not equal selector |
|
* Positional selectors (:first; :eq(n); :odd; etc.) |
|
* Type selectors (:input; :checkbox; :button; etc.) |
|
* State-based selectors (:animated; :visible; :hidden; etc.) |
|
* :has(selector) |
|
* :not(complex selector) |
|
* custom selectors via Sizzle extensions |
|
* Leading combinators (e.g., $collection.find("> *")) |
|
* Reliable functionality on XML fragments |
|
* Requiring all parts of a selector to match elements under context |
|
* (e.g., $div.find("div > *") now matches children of $div) |
|
* Matching against non-elements |
|
* Reliable sorting of disconnected nodes |
|
* querySelectorAll bug fixes (e.g., unreliable :focus on WebKit) |
|
* |
|
* If any of these are unacceptable tradeoffs, either use Sizzle or |
|
* customize this stub for the project's specific needs. |
|
*/ |
|
|
|
var hasDuplicate, sortInput, |
|
sortStable = jQuery.expando.split( "" ).sort( sortOrder ).join( "" ) === jQuery.expando, |
|
matches = documentElement.matches || |
|
documentElement.webkitMatchesSelector || |
|
documentElement.mozMatchesSelector || |
|
documentElement.oMatchesSelector || |
|
documentElement.msMatchesSelector, |
|
|
|
// CSS string/identifier serialization |
|
// https://drafts.csswg.org/cssom/#common-serializing-idioms |
|
rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g, |
|
fcssescape = function( ch, asCodePoint ) { |
|
if ( asCodePoint ) { |
|
|
|
// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER |
|
if ( ch === "\0" ) { |
|
return "\uFFFD"; |
|
} |
|
|
|
// Control characters and (dependent upon position) numbers get escaped as code points |
|
return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; |
|
} |
|
|
|
// Other potentially-special ASCII characters get backslash-escaped |
|
return "\\" + ch; |
|
}; |
|
|
|
function sortOrder( a, b ) { |
|
|
|
// Flag for duplicate removal |
|
if ( a === b ) { |
|
hasDuplicate = true; |
|
return 0; |
|
} |
|
|
|
// Sort on method existence if only one input has compareDocumentPosition |
|
var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; |
|
if ( compare ) { |
|
return compare; |
|
} |
|
|
|
// Calculate position if both inputs belong to the same document |
|
compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? |
|
a.compareDocumentPosition( b ) : |
|
|
|
// Otherwise we know they are disconnected |
|
1; |
|
|
|
// Disconnected nodes |
|
if ( compare & 1 ) { |
|
|
|
// Choose the first element that is related to our preferred document |
|
if ( a === document || a.ownerDocument === document && |
|
jQuery.contains( document, a ) ) { |
|
return -1; |
|
} |
|
if ( b === document || b.ownerDocument === document && |
|
jQuery.contains( document, b ) ) { |
|
return 1; |
|
} |
|
|
|
// Maintain original order |
|
return sortInput ? |
|
( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : |
|
0; |
|
} |
|
|
|
return compare & 4 ? -1 : 1; |
|
} |
|
|
|
function uniqueSort( results ) { |
|
var elem, |
|
duplicates = [], |
|
j = 0, |
|
i = 0; |
|
|
|
hasDuplicate = false; |
|
sortInput = !sortStable && results.slice( 0 ); |
|
results.sort( sortOrder ); |
|
|
|
if ( hasDuplicate ) { |
|
while ( ( elem = results[ i++ ] ) ) { |
|
if ( elem === results[ i ] ) { |
|
j = duplicates.push( i ); |
|
} |
|
} |
|
while ( j-- ) { |
|
results.splice( duplicates[ j ], 1 ); |
|
} |
|
} |
|
|
|
// Clear input after sorting to release objects |
|
// See https://github.com/jquery/sizzle/pull/225 |
|
sortInput = null; |
|
|
|
return results; |
|
} |
|
|
|
function escape( sel ) { |
|
return ( sel + "" ).replace( rcssescape, fcssescape ); |
|
} |
|
|
|
jQuery.extend( { |
|
uniqueSort: uniqueSort, |
|
unique: uniqueSort, |
|
escapeSelector: escape, |
|
find: function( selector, context, results, seed ) { |
|
var elem, nodeType, |
|
i = 0; |
|
|
|
results = results || []; |
|
context = context || document; |
|
|
|
// Same basic safeguard as Sizzle |
|
if ( !selector || typeof selector !== "string" ) { |
|
return results; |
|
} |
|
|
|
// Early return if context is not an element or document |
|
if ( ( nodeType = context.nodeType ) !== 1 && nodeType !== 9 ) { |
|
return []; |
|
} |
|
|
|
if ( seed ) { |
|
while ( ( elem = seed[ i++ ] ) ) { |
|
if ( jQuery.find.matchesSelector( elem, selector ) ) { |
|
results.push( elem ); |
|
} |
|
} |
|
} else { |
|
jQuery.merge( results, context.querySelectorAll( selector ) ); |
|
} |
|
|
|
return results; |
|
}, |
|
text: function( elem ) { |
|
var node, |
|
ret = "", |
|
i = 0, |
|
nodeType = elem.nodeType; |
|
|
|
if ( !nodeType ) { |
|
|
|
// If no nodeType, this is expected to be an array |
|
while ( ( node = elem[ i++ ] ) ) { |
|
|
|
// Do not traverse comment nodes |
|
ret += jQuery.text( node ); |
|
} |
|
} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { |
|
|
|
// Use textContent for elements |
|
return elem.textContent; |
|
} else if ( nodeType === 3 || nodeType === 4 ) { |
|
return elem.nodeValue; |
|
} |
|
|
|
// Do not include comment or processing instruction nodes |
|
|
|
return ret; |
|
}, |
|
contains: function( a, b ) { |
|
var adown = a.nodeType === 9 ? a.documentElement : a, |
|
bup = b && b.parentNode; |
|
return a === bup || !!( bup && bup.nodeType === 1 && adown.contains( bup ) ); |
|
}, |
|
isXMLDoc: function( elem ) { |
|
|
|
// documentElement is verified for cases where it doesn't yet exist |
|
// (such as loading iframes in IE - #4833) |
|
var documentElement = elem && ( elem.ownerDocument || elem ).documentElement; |
|
return documentElement ? documentElement.nodeName !== "HTML" : false; |
|
}, |
|
expr: { |
|
attrHandle: {}, |
|
match: { |
|
bool: new RegExp( "^(?:checked|selected|async|autofocus|autoplay|controls|defer" + |
|
"|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$", "i" ), |
|
needsContext: /^[\x20\t\r\n\f]*[>+~]/ |
|
} |
|
} |
|
} ); |
|
|
|
jQuery.extend( jQuery.find, { |
|
matches: function( expr, elements ) { |
|
return jQuery.find( expr, null, null, elements ); |
|
}, |
|
matchesSelector: function( elem, expr ) { |
|
return matches.call( elem, expr ); |
|
}, |
|
attr: function( elem, name ) { |
|
var fn = jQuery.expr.attrHandle[ name.toLowerCase() ], |
|
|
|
// Don't get fooled by Object.prototype properties (jQuery #13807) |
|
value = fn && hasOwn.call( jQuery.expr.attrHandle, name.toLowerCase() ) ? |
|
fn( elem, name, jQuery.isXMLDoc( elem ) ) : |
|
undefined; |
|
return value !== undefined ? value : elem.getAttribute( name ); |
|
} |
|
} ); |
|
|
|
} );
|
|
|