241 lines
6.3 KiB
JavaScript
241 lines
6.3 KiB
JavaScript
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,
|
|
rhtmlSuffix = /HTML$/i,
|
|
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 bup = b && b.parentNode;
|
|
return a === bup || !!( bup && bup.nodeType === 1 && a.contains( bup ) );
|
|
},
|
|
isXMLDoc: function( elem ) {
|
|
var namespace = elem.namespaceURI,
|
|
documentElement = ( elem.ownerDocument || elem ).documentElement;
|
|
|
|
// Assume HTML when documentElement doesn't yet exist, such as inside
|
|
// document fragments.
|
|
return !rhtmlSuffix.test( namespace ||
|
|
documentElement && documentElement.nodeName ||
|
|
"HTML" );
|
|
},
|
|
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 trac-13807)
|
|
value = fn && hasOwn.call( jQuery.expr.attrHandle, name.toLowerCase() ) ?
|
|
fn( elem, name, jQuery.isXMLDoc( elem ) ) :
|
|
undefined;
|
|
return value !== undefined ? value : elem.getAttribute( name );
|
|
}
|
|
} );
|
|
|
|
} );
|