Show More
Commit Description:
merge
Commit Description:
merge
References:
File last commit:
Show/Diff file:
Action:
node_modules/jquery/src/selector-native.js
| 237 lines
| 6.2 KiB
| application/javascript
| JavascriptLexer
|
r789 | 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 ); | ||||
} | ||||
} ); | ||||
} ); | ||||