@@ -1,12 +1,12 @@
/*!
* Sizzle CSS Selector Engine v1.10.19
* Sizzle CSS Selector Engine v2.1.1
* http://sizzlejs.com/
*
* Copyright 2013 jQuery Foundation, Inc. and other contributors
* Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
* Released under the MIT license
* http://jquery.org/license
*
* Date: 2014-04-18
* Date: 2014-12-15
*/
( function ( window ) {
@@ -33,7 +33,7 @@ var i,
contains ,
// Instance-specific data
expando = "sizzle" + - ( new Date ( ) ) ,
expando = "sizzle" + 1 * new Date ( ) ,
preferredDoc = window . document ,
dirruns = 0 ,
done = 0 ,
@@ -48,7 +48,6 @@ var i,
} ,
// General-purpose constants
strundefined = typeof undefined ,
MAX_NEGATIVE = 1 << 31 ,
// Instance methods
@@ -58,12 +57,13 @@ var i,
push_native = arr . push ,
push = arr . push ,
slice = arr . slice ,
// Use a stripped-down indexOf if we can't use a native one
indexOf = arr . indexOf || function ( elem ) {
// Use a stripped-down indexOf as it's faster than native
// http://jsperf.com/thor-indexof-vs-for/5
indexOf = function ( list , elem ) {
var i = 0 ,
len = this . length ;
len = list . length ;
for ( ; i < len ; i ++ ) {
if ( this [ i ] === elem ) {
if ( list [ i ] === elem ) {
return i ;
}
}
@@ -74,25 +74,21 @@ var i,
// Regular expressions
// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
// http://www.w3.org/TR/css3-selectors/#whitespace
whitespace = "[\\x20\\t\\r\\n\\f]" ,
// http://www.w3.org/TR/css3-syntax/#characters
characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+" ,
// Loosely modeled on CSS identifier characters
// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
identifier = characterEncoding . replace ( "w" , "w#" ) ,
// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+" ,
// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
// Operator (capture 2)
"*([*^$|!~]?=)" + whitespace +
// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
"*\\]" ,
pseudos = ":(" + characterEncoding + ")(?:\\((" +
pseudos = ":(" + identifier + ")(?:\\((" +
// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
// 1. quoted (capture 3; capture 4 or capture 5)
"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
@@ -103,6 +99,7 @@ var i,
")\\)|)" ,
// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
rwhitespace = new RegExp ( whitespace + "+" , "g" ) ,
rtrim = new RegExp ( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$" , "g" ) ,
rcomma = new RegExp ( "^" + whitespace + "*," + whitespace + "*" ) ,
@@ -114,9 +111,9 @@ var i,
ridentifier = new RegExp ( "^" + identifier + "$" ) ,
matchExpr = {
"ID" : new RegExp ( "^#(" + characterEncoding + ")" ) ,
"CLASS" : new RegExp ( "^\\.(" + characterEncoding + ")" ) ,
"TAG" : new RegExp ( "^(" + characterEncoding . replace ( "w" , "w*" ) + ")" ) ,
"ID" : new RegExp ( "^#(" + identifier + ")" ) ,
"CLASS" : new RegExp ( "^\\.(" + identifier + ")" ) ,
"TAG" : new RegExp ( "^(" + identifier + "|[*] )" ) ,
"ATTR" : new RegExp ( "^" + attributes ) ,
"PSEUDO" : new RegExp ( "^" + pseudos ) ,
"CHILD" : new RegExp ( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
@@ -154,6 +151,14 @@ var i,
String . fromCharCode ( high + 0x10000 ) :
// Supplemental Plane codepoint (surrogate pair)
String . fromCharCode ( high >> 10 | 0xD800 , high & 0x3FF | 0xDC00 ) ;
} ,
// Used for iframes
// See setDocument()
// Removing the function wrapper causes a "Permission Denied"
// error in IE
unloadHandler = function ( ) {
setDocument ( ) ;
} ;
// Optimize for push.apply( _, NodeList )
@@ -201,14 +206,14 @@ function Sizzle( selector, context, results, seed ) {
return results ;
}
if ( ( nodeType = context . nodeType ) !== 1 && nodeType !== 9 ) {
if ( ( nodeType = context . nodeType ) !== 1 && nodeType !== 9 && nodeType !== 11 ) {
return [ ] ;
}
if ( documentIsHTML && ! seed ) {
// Shortcuts
if ( ( match = rquickExpr . exec ( selector ) ) ) {
// Try to shortcut find operations when possible (e.g., not under DocumentFragment)
if ( nodeType !== 11 && ( match = rquickExpr . exec ( selector ) ) ) {
// Speed-up: Sizzle("#ID")
if ( ( m = match [ 1 ] ) ) {
if ( nodeType === 9 ) {
@@ -240,7 +245,7 @@ function Sizzle( selector, context, results, seed ) {
return results ;
// Speed-up: Sizzle(".CLASS")
} else if ( ( m = match [ 3 ] ) && support . getElementsByClassName && context . getElementsByClassName ) {
} else if ( ( m = match [ 3 ] ) && support . getElementsByClassName ) {
push . apply ( results , context . getElementsByClassName ( m ) ) ;
return results ;
}
@@ -250,7 +255,7 @@ function Sizzle( selector, context, results, seed ) {
if ( support . qsa && ( ! rbuggyQSA || ! rbuggyQSA . test ( selector ) ) ) {
nid = old = expando ;
newContext = context ;
newSelector = nodeType === 9 && selector ;
newSelector = nodeType !== 1 && selector ;
// qSA works strangely on Element-rooted queries
// We can work around this by specifying an extra ID on the root
@@ -437,7 +442,7 @@ function createPositionalPseudo( fn ) {
* @returns {Element|Object|Boolean } The input node if acceptable, otherwise a falsy value
*/
function testContext ( context ) {
return context && typeof context . getElementsByTagName !== strundefined && context ;
return context && typeof context . getElementsByTagName !== "undefined" && context ;
}
// Expose support vars for convenience
@@ -461,9 +466,8 @@ isXML = Sizzle.isXML = function( elem ) {
* @returns {Object } Returns the current document
*/
setDocument = Sizzle . setDocument = function ( node ) {
var hasCompare ,
doc = node ? node . ownerDocument || node : preferredDoc ,
parent = doc . defaultView ;
var hasCompare , parent ,
doc = node ? node . ownerDocument || node : preferredDoc ;
// If no document and documentElement is available, return
if ( doc === document || doc . nodeType !== 9 || ! doc . documentElement ) {
@@ -473,9 +477,7 @@ setDocument = Sizzle.setDocument = function( node ) {
// Set our document
document = doc ;
docElem = doc . documentElement ;
// Support tests
documentIsHTML = ! isXML ( doc ) ;
parent = doc . defaultView ;
// Support: IE>8
// If iframe document is assigned to "document" variable and if iframe has been reloaded,
@@ -484,21 +486,22 @@ setDocument = Sizzle.setDocument = function( node ) {
if ( parent && parent !== parent . top ) {
// IE11 does not have attachEvent, so all must suffer
if ( parent . addEventListener ) {
parent . addEventListener ( "unload" , function ( ) {
setDocument ( ) ;
} , false ) ;
parent . addEventListener ( "unload" , unloadHandler , false ) ;
} else if ( parent . attachEvent ) {
parent . attachEvent ( "onunload" , function ( ) {
setDocument ( ) ;
} ) ;
parent . attachEvent ( "onunload" , unloadHandler ) ;
}
}
/* Support tests
---------------------------------------------------------------------- */
documentIsHTML = ! isXML ( doc ) ;
/* Attributes
---------------------------------------------------------------------- */
// Support: IE<8
// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
// Verify that getAttribute really returns attributes and not properties
// (excepting IE8 booleans)
support . attributes = assert ( function ( div ) {
div . className = "i" ;
return ! div . getAttribute ( "className" ) ;
@@ -513,17 +516,8 @@ setDocument = Sizzle.setDocument = function( node ) {
return ! div . getElementsByTagName ( "*" ) . length ;
} ) ;
// Check if getElementsByClassName can be trusted
support . getElementsByClassName = rnative . test ( doc . getElementsByClassName ) && assert ( function ( div ) {
div . innerHTML = "<div class='a'></div><div class='a i'></div>" ;
// Support: Safari<4
// Catch class over-caching
div . firstChild . className = "i" ;
// Support: Opera<10
// Catch gEBCN failure to find non-leading classes
return div . getElementsByClassName ( "i" ) . length === 2 ;
} ) ;
// Support: IE<9
support . getElementsByClassName = rnative . test ( doc . getElementsByClassName ) ;
// Support: IE<10
// Check if getElementById returns elements by name
@@ -537,7 +531,7 @@ setDocument = Sizzle.setDocument = function( node ) {
// ID find and filter
if ( support . getById ) {
Expr . find [ "ID" ] = function ( id , context ) {
if ( typeof context . getElementById !== strundefined && documentIsHTML ) {
if ( typeof context . getElementById !== "undefined" && documentIsHTML ) {
var m = context . getElementById ( id ) ;
// Check parentNode to catch when Blackberry 4.6 returns
// nodes that are no longer in the document #6963
@@ -558,7 +552,7 @@ setDocument = Sizzle.setDocument = function( node ) {
Expr . filter [ "ID" ] = function ( id ) {
var attrId = id . replace ( runescape , funescape ) ;
return function ( elem ) {
var node = typeof elem . getAttributeNode !== strundefined && elem . getAttributeNode ( "id" ) ;
var node = typeof elem . getAttributeNode !== "undefined" && elem . getAttributeNode ( "id" ) ;
return node && node . value === attrId ;
} ;
} ;
@@ -567,14 +561,20 @@ setDocument = Sizzle.setDocument = function( node ) {
// Tag
Expr . find [ "TAG" ] = support . getElementsByTagName ?
function ( tag , context ) {
if ( typeof context . getElementsByTagName !== strundefined ) {
if ( typeof context . getElementsByTagName !== "undefined" ) {
return context . getElementsByTagName ( tag ) ;
// DocumentFragment nodes don't have gEBTN
} else if ( support . qsa ) {
return context . querySelectorAll ( tag ) ;
}
} :
function ( tag , context ) {
var elem ,
tmp = [ ] ,
i = 0 ,
// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
results = context . getElementsByTagName ( tag ) ;
// Filter out possible comments
@@ -592,7 +592,7 @@ setDocument = Sizzle.setDocument = function( node ) {
// Class
Expr . find [ "CLASS" ] = support . getElementsByClassName && function ( className , context ) {
if ( typeof context . getElementsByClassName !== strundefined && documentIsHTML ) {
if ( documentIsHTML ) {
return context . getElementsByClassName ( className ) ;
}
} ;
@@ -621,13 +621,15 @@ setDocument = Sizzle.setDocument = function( node ) {
// setting a boolean content attribute,
// since its presence should be enough
// http://bugs.jquery.com/ticket/12359
div . innerHTML = "<select msallowclip=''><option selected=''></option></select>" ;
docElem . appendChild ( div ) . innerHTML = "<a id='" + expando + "'></a>" +
"<select id='" + expando + "-\f]' msallowcapture=''>" +
"<option selected=''></option></select>" ;
// Support: IE8, Opera 11-12.16
// Nothing should be selected when empty strings follow ^= or $= or *=
// The test attribute must be unknown in Opera but "safe" for WinRT
// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
if ( div . querySelectorAll ( "[msallowclip ^='']" ) . length ) {
if ( div . querySelectorAll ( "[msallowcapture ^='']" ) . length ) {
rbuggyQSA . push ( "[*^$]=" + whitespace + "*(?:''|\"\")" ) ;
}
@@ -637,12 +639,24 @@ setDocument = Sizzle.setDocument = function( node ) {
rbuggyQSA . push ( "\\[" + whitespace + "*(?:value|" + booleans + ")" ) ;
}
// Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+
if ( ! div . querySelectorAll ( "[id~=" + expando + "-]" ) . length ) {
rbuggyQSA . push ( "~=" ) ;
}
// Webkit/Opera - :checked should return selected option elements
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
// IE8 throws error here and will not see later tests
if ( ! div . querySelectorAll ( ":checked" ) . length ) {
rbuggyQSA . push ( ":checked" ) ;
}
// Support: Safari 8+, iOS 8+
// https://bugs.webkit.org/show_bug.cgi?id=136851
// In-page `selector#id sibing-combinator selector` fails
if ( ! div . querySelectorAll ( "a#" + expando + "+*" ) . length ) {
rbuggyQSA . push ( ".#.+[+~]" ) ;
}
} ) ;
assert ( function ( div ) {
@@ -759,7 +773,7 @@ setDocument = Sizzle.setDocument = function( node ) {
// Maintain original order
return sortInput ?
( indexOf . call ( sortInput , a ) - indexOf . call ( sortInput , b ) ) :
( indexOf ( sortInput , a ) - indexOf ( sortInput , b ) ) :
0 ;
}
@@ -786,7 +800,7 @@ setDocument = Sizzle.setDocument = function( node ) {
aup ? - 1 :
bup ? 1 :
sortInput ?
( indexOf . call ( sortInput , a ) - indexOf . call ( sortInput , b ) ) :
( indexOf ( sortInput , a ) - indexOf ( sortInput , b ) ) :
0 ;
// If the nodes are siblings, we can do a quick check
@@ -849,7 +863,7 @@ Sizzle.matchesSelector = function( elem, expr ) {
elem . document && elem . document . nodeType !== 11 ) {
return ret ;
}
} catch ( e ) { }
} catch ( e ) { }
}
return Sizzle ( expr , document , null , [ elem ] ) . length > 0 ;
@@ -1068,7 +1082,7 @@ Expr = Sizzle.selectors = {
return pattern ||
( pattern = new RegExp ( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" ) ) &&
classCache ( className , function ( elem ) {
return pattern . test ( typeof elem . className === "string" && elem . className || typeof elem . getAttribute !== strundefined && elem . getAttribute ( "class" ) || "" ) ;
return pattern . test ( typeof elem . className === "string" && elem . className || typeof elem . getAttribute !== "undefined" && elem . getAttribute ( "class" ) || "" ) ;
} ) ;
} ,
@@ -1090,7 +1104,7 @@ Expr = Sizzle.selectors = {
operator === "^=" ? check && result . indexOf ( check ) === 0 :
operator === "*=" ? check && result . indexOf ( check ) > - 1 :
operator === "$=" ? check && result . slice ( - check . length ) === check :
operator === "~=" ? ( " " + result + " " ) . indexOf ( check ) > - 1 :
operator === "~=" ? ( " " + result . replace ( rwhitespace , " " ) + " " ) . indexOf ( check ) > - 1 :
operator === "|=" ? result === check || result . slice ( 0 , check . length + 1 ) === check + "-" :
false ;
} ;
@@ -1210,7 +1224,7 @@ Expr = Sizzle.selectors = {
matched = fn ( seed , argument ) ,
i = matched . length ;
while ( i -- ) {
idx = indexOf . call ( seed , matched [ i ] ) ;
idx = indexOf ( seed , matched [ i ] ) ;
seed [ idx ] = ! ( matches [ idx ] = matched [ i ] ) ;
}
} ) :
@@ -1249,6 +1263,8 @@ Expr = Sizzle.selectors = {
function ( elem , context , xml ) {
input [ 0 ] = elem ;
matcher ( input , null , xml , results ) ;
// Don't keep the element (issue #299)
input [ 0 ] = null ;
return ! results . pop ( ) ;
} ;
} ) ,
@@ -1260,6 +1276,7 @@ Expr = Sizzle.selectors = {
} ) ,
"contains" : markFunction ( function ( text ) {
text = text . replace ( runescape , funescape ) ;
return function ( elem ) {
return ( elem . textContent || elem . innerText || getText ( elem ) ) . indexOf ( text ) > - 1 ;
} ;
@@ -1681,7 +1698,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
i = matcherOut . length ;
while ( i -- ) {
if ( ( elem = matcherOut [ i ] ) &&
( temp = postFinder ? indexOf . call ( seed , elem ) : preMap [ i ] ) > - 1 ) {
( temp = postFinder ? indexOf ( seed , elem ) : preMap [ i ] ) > - 1 ) {
seed [ temp ] = ! ( results [ temp ] = elem ) ;
}
@@ -1716,13 +1733,16 @@ function matcherFromTokens( tokens ) {
return elem === checkContext ;
} , implicitRelative , true ) ,
matchAnyContext = addCombinator ( function ( elem ) {
return indexOf . call ( checkContext , elem ) > - 1 ;
return indexOf ( checkContext , elem ) > - 1 ;
} , implicitRelative , true ) ,
matchers = [ function ( elem , context , xml ) {
return ( ! leadingRelative && ( xml || context !== outermostContext ) ) || (
var ret = ( ! leadingRelative && ( xml || context !== outermostContext ) ) || (
( checkContext = context ) . nodeType ?
matchContext ( elem , context , xml ) :
matchAnyContext ( elem , context , xml ) ) ;
// Avoid hanging onto element (issue #299)
checkContext = null ;
return ret ;
} ] ;
for ( ; i < len ; i ++ ) {
@@ -1972,7 +1992,7 @@ select = Sizzle.select = function( selector, context, results, seed ) {
// Sort stability
support . sortStable = expando . split ( "" ) . sort ( sortOrder ) . join ( "" ) === expando ;
// Support: Chrome<14
// Support: Chrome 14-35+
// Always assume duplicates if they aren't passed to the comparison function
support . detectDuplicates = ! ! hasDuplicate ;