123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- define( [
- "./core",
- "./var/document",
- "./var/documentElement",
- "./var/hasOwn",
- "./var/indexOf",
- "./var/slice",
- // The following utils are attached directly to the jQuery object.
- "./selector/contains",
- "./selector/escapeSelector"
- ], function( jQuery, document, documentElement, hasOwn, indexOf, slice ) {
- "use strict";
- /*
- * Optional limited 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 jQuery 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 the full
- * selector engine 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.msMatchesSelector;
- 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;
- }
- jQuery.extend( {
- // This method cannot be shared with the main selector module
- // as it does in 4.x because of an edge case quirk of putting
- // disconnected elements in the preferred document before other
- // elements in the full selector module. This will be a minor
- // breaking change in 4.0.0.
- uniqueSort: uniqueSort,
- unique: uniqueSort,
- find: function( selector, context, results, seed ) {
- var elem, nodeType,
- i = 0;
- results = results || [];
- context = context || document;
- // Same basic safeguard as in the full selector module
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
- // Early return if context is not an element, document or document fragment
- if ( ( nodeType = context.nodeType ) !== 1 && nodeType !== 9 && nodeType !== 11 ) {
- 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;
- },
- 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.fn.uniqueSort = function() {
- return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );
- };
- 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 );
- }
- } );
- } );
|