jquery
Advanced tools
Comparing version 3.6.4 to 3.7.0
167
AUTHORS.txt
@@ -21,12 +21,20 @@ John Resig <jeresig@gmail.com> | ||
Ariel Flesler <aflesler@gmail.com> | ||
Cheah Chu Yeow <chuyeow@gmail.com> | ||
Andrew Chalkley <andrew@chalkley.org> | ||
Fabio Buffoni <fabio.buffoni@bitmaster.it> | ||
Stefan Bauckmeier <stefan@bauckmeier.de> | ||
Jon Evans <jon@springyweb.com> | ||
TJ Holowaychuk <tj@vision-media.ca> | ||
Riccardo De Agostini <rdeago@gmail.com> | ||
Michael Bensoussan <mickey@seesmic.com> | ||
Louis-Rémi Babé <lrbabe@gmail.com> | ||
Robert Katić <robert.katic@gmail.com> | ||
Louis-Rémi Babé <lrbabe@gmail.com> | ||
Damian Janowski <damian.janowski@gmail.com> | ||
Anton Kovalyov <anton@kovalyov.net> | ||
Dušan B. Jovanovic <dbjdbj@gmail.com> | ||
Earle Castledine <mrspeaker@gmail.com> | ||
Damian Janowski <damian.janowski@gmail.com> | ||
Rich Dougherty <rich@rd.gen.nz> | ||
Kim Dalsgaard <kim@kimdalsgaard.com> | ||
Andrea Giammarchi <andrea.giammarchi@gmail.com> | ||
Fabian Jakobs <fabian.jakobs@web.de> | ||
Mark Gibson <jollytoad@gmail.com> | ||
@@ -39,5 +47,6 @@ Karl Swedberg <kswedberg@gmail.com> | ||
Batiste Bieler <batiste.bieler@gmail.com> | ||
Jake Archibald <jake.archibald@bbc.co.uk> | ||
Alexander Farkas <info@corrupt-system.de> | ||
Filipe Fortes <filipe@fortes.com> | ||
Rick Waldron <waldron.rick@gmail.com> | ||
Filipe Fortes <filipe@fortes.com> | ||
Neeraj Singh <neerajdotname@gmail.com> | ||
@@ -50,14 +59,16 @@ Paul Irish <paul.irish@gmail.com> | ||
Tom Viner <github@viner.tv> | ||
J. Ryan Stinnett <jryans@gmail.com> | ||
Douglas Neiner <doug@dougneiner.com> | ||
Adam J. Sontag <ajpiano@ajpiano.com> | ||
Heungsub Lee <h@subl.ee> | ||
Dave Reed <dareed@microsoft.com> | ||
Ralph Whitbeck <ralph.whitbeck@gmail.com> | ||
Carl Fürstenberg <azatoth@gmail.com> | ||
Jacob Wright <jacwright@gmail.com> | ||
J. Ryan Stinnett <jryans@gmail.com> | ||
Ralph Whitbeck <ralph.whitbeck@gmail.com> | ||
unknown <Igen005@.upcorp.ad.uprr.com> | ||
temp01 <temp01irc@gmail.com> | ||
Heungsub Lee <h@subl.ee> | ||
Colin Snover <github.com@zetafleet.com> | ||
Jared Grippe <jared@deadlyicon.com> | ||
Ryan W Tenney <ryan@10e.us> | ||
Alex Sexton <AlexSexton@gmail.com> | ||
Pinhook <contact@pinhooklabs.com> | ||
@@ -67,3 +78,2 @@ Ron Otten <r.j.g.otten@gmail.com> | ||
Anton Matzneller <obhvsbypqghgc@gmail.com> | ||
Alex Sexton <AlexSexton@gmail.com> | ||
Dan Heberden <danheberden@gmail.com> | ||
@@ -78,10 +88,9 @@ Henri Wiechers <hwiechers@gmail.com> | ||
Xavi Ramirez <xavi.rmz@gmail.com> | ||
Jared Grippe <jared@deadlyicon.com> | ||
Sylvester Keil <sylvester@keil.or.at> | ||
Brandon Sterne <bsterne@mozilla.com> | ||
Mathias Bynens <mathias@qiwi.be> | ||
Lee Carpenter <elcarpie@gmail.com> | ||
Timmy Willison <4timmywil@gmail.com> | ||
Corey Frang <gnarf37@gmail.com> | ||
Digitalxero <digitalxero> | ||
Anton Kovalyov <anton@kovalyov.net> | ||
David Murdoch <david@davidmurdoch.com> | ||
@@ -93,3 +102,2 @@ Josh Varner <josh.varner@gmail.com> | ||
Michael Murray <m@murz.net> | ||
Lee Carpenter <elcarpie@gmail.com> | ||
Alexis Abril <me@alexisabril.com> | ||
@@ -114,8 +122,9 @@ Rob Morgan <robbym@gmail.com> | ||
Shi Chuan <shichuanr@gmail.com> | ||
Matt Mueller <mattmuelle@gmail.com> | ||
Berker Peksag <berker.peksag@gmail.com> | ||
Toby Brain <tobyb@freshview.com> | ||
Matt Mueller <mattmuelle@gmail.com> | ||
Justin <drakefjustin@gmail.com> | ||
Daniel Herman <daniel.c.herman@gmail.com> | ||
Oleg Gaidarenko <markelog@gmail.com> | ||
Rock Hymas <rock@fogcreek.com> | ||
Richard Gibson <richard.gibson@gmail.com> | ||
@@ -132,2 +141,3 @@ Rafaël Blais Masson <rafbmasson@gmail.com> | ||
tsinha <tsinha@Anthonys-MacBook-Pro.local> | ||
Dominik D. Geyer <dominik.geyer@gmail.com> | ||
Matt Farmer <matt@frmr.me> | ||
@@ -141,18 +151,28 @@ Trey Hunner <treyhunner@gmail.com> | ||
Chad Killingsworth <chadkillingsworth@missouristate.edu> | ||
Vitya Muhachev <vic99999@yandex.ru> | ||
Nowres Rafid <nowres.rafed@gmail.com> | ||
David Benjamin <davidben@mit.edu> | ||
Alan Plum <github@ap.apsq.de> | ||
Uri Gilad <antishok@gmail.com> | ||
Chris Faulkner <thefaulkner@gmail.com> | ||
Marcel Greter <marcel.greter@ocbnet.ch> | ||
Elijah Manor <elijah.manor@gmail.com> | ||
Daniel Chatfield <chatfielddaniel@gmail.com> | ||
Daniel Gálvez <dgalvez@editablething.com> | ||
Nikita Govorov <nikita.govorov@gmail.com> | ||
Wesley Walser <waw325@gmail.com> | ||
Mike Pennisi <mike@mikepennisi.com> | ||
Matthias Jäggli <matthias.jaeggli@gmail.com> | ||
Devin Cooper <cooper.semantics@gmail.com> | ||
Markus Staab <markus.staab@redaxo.de> | ||
Dave Riddle <david@joyvuu.com> | ||
Callum Macrae <callum@lynxphp.com> | ||
Jonathan Sampson <jjdsampson@gmail.com> | ||
Benjamin Truyman <bentruyman@gmail.com> | ||
Jay Merrifield <fracmak@gmail.com> | ||
James Huston <james@jameshuston.net> | ||
Sai Lung Wong <sai.wong@huffingtonpost.com> | ||
Erick Ruiz de Chávez <erickrdch@gmail.com> | ||
David Bonner <dbonner@cogolabs.com> | ||
Allen J Schmidt Jr <cobrasoft@gmail.com> | ||
Akintayo Akinwunmi <aakinwunmi@judge.com> | ||
@@ -164,19 +184,12 @@ MORGAN <morgan@morgangraphics.com> | ||
Greg Lavallee <greglavallee@wapolabs.com> | ||
Daniel Gálvez <dgalvez@editablething.com> | ||
Sai Lung Wong <sai.wong@huffingtonpost.com> | ||
Tom H Fuertes <TomFuertes@gmail.com> | ||
Roland Eckl <eckl.roland@googlemail.com> | ||
Jay Merrifield <fracmak@gmail.com> | ||
Allen J Schmidt Jr <cobrasoft@gmail.com> | ||
Jonathan Sampson <jjdsampson@gmail.com> | ||
Marcel Greter <marcel.greter@ocbnet.ch> | ||
Matthias Jäggli <matthias.jaeggli@gmail.com> | ||
Yiming He <yiminghe@gmail.com> | ||
David Fox <dfoxinator@gmail.com> | ||
Yiming He <yiminghe@gmail.com> | ||
Devin Cooper <cooper.semantics@gmail.com> | ||
Bennett Sorbo <bsorbo@gmail.com> | ||
Paul Ramos <paul.b.ramos@gmail.com> | ||
Rod Vagg <rod@vagg.org> | ||
Bennett Sorbo <bsorbo@gmail.com> | ||
Sebastian Burkhard <sebi.burkhard@gmail.com> | ||
Zachary Adam Kaplan <razic@viralkitty.com> | ||
Adam Coulombe <me@adam.co> | ||
nanto_vi <nanto@moon.email.ne.jp> | ||
@@ -186,19 +199,22 @@ nanto <nanto@moon.email.ne.jp> | ||
Ryunosuke SATO <tricknotes.rs@gmail.com> | ||
Diego Tres <diegotres@gmail.com> | ||
Jean Boussier <jean.boussier@gmail.com> | ||
Adam Coulombe <me@adam.co> | ||
Andrew Plummer <plummer.andrew@gmail.com> | ||
Mark Raddatz <mraddatz@gmail.com> | ||
Pascal Borreli <pascal@borreli.com> | ||
Isaac Z. Schlueter <i@izs.me> | ||
Karl Sieburg <ksieburg@yahoo.com> | ||
Pascal Borreli <pascal@borreli.com> | ||
Nguyen Phuc Lam <ruado1987@gmail.com> | ||
Dmitry Gusev <dmitry.gusev@gmail.com> | ||
Steven Benner <admin@stevenbenner.com> | ||
Li Xudong <istonelee@gmail.com> | ||
Michał Gołębiowski-Owczarek <m.goleb@gmail.com> | ||
Li Xudong <istonelee@gmail.com> | ||
Steven Benner <admin@stevenbenner.com> | ||
Renato Oliveira dos Santos <ros3@cin.ufpe.br> | ||
Frederic Junod <frederic.junod@camptocamp.com> | ||
Tom H Fuertes <tomfuertes@gmail.com> | ||
Renato Oliveira dos Santos <ros3@cin.ufpe.br> | ||
Mitch Foley <mitch@thefoley.net> | ||
ros3cin <ros3@cin.ufpe.br> | ||
Kyle Robinson Young <kyle@dontkry.com> | ||
John Paul <john@johnkpaul.com> | ||
Jason Bedard <jason+jquery@jbedard.ca> | ||
Kyle Robinson Young <kyle@dontkry.com> | ||
Chris Talkington <chris@talkingtontech.com> | ||
@@ -208,18 +224,19 @@ Eddie Monge <eddie@eddiemonge.com> | ||
Jason Merino <jasonmerino@gmail.com> | ||
Dan Burzo <danburzo@gmail.com> | ||
Jeremy Dunck <jdunck@gmail.com> | ||
Chris Price <price.c@gmail.com> | ||
Guy Bedford <guybedford@gmail.com> | ||
njhamann <njhamann@gmail.com> | ||
Goare Mao <mygoare@gmail.com> | ||
Amey Sakhadeo <me@ameyms.com> | ||
Mike Sidorov <mikes.ekb@gmail.com> | ||
Anthony Ryan <anthonyryan1@gmail.com> | ||
Dominik D. Geyer <dominik.geyer@gmail.com> | ||
Lihan Li <frankieteardrop@gmail.com> | ||
George Kats <katsgeorgeek@gmail.com> | ||
Lihan Li <frankieteardrop@gmail.com> | ||
Dongseok Paeng <dongseok83.paeng@lge.com> | ||
Ronny Springer <springer.ronny@gmail.com> | ||
Ilya Kantor <iliakan@gmail.com> | ||
Marian Sollmann <marian.sollmann@cargomedia.ch> | ||
Chris Antaki <ChrisAntaki@gmail.com> | ||
Marian Sollmann <marian.sollmann@cargomedia.ch> | ||
njhamann <njhamann@gmail.com> | ||
Ilya Kantor <iliakan@gmail.com> | ||
David Hong <d.hong@me.com> | ||
John Paul <john@johnkpaul.com> | ||
Jakob Stoeck <jakob@pokermania.de> | ||
@@ -230,75 +247,84 @@ Christopher Jones <chris@cjqed.com> | ||
Leonardo Balter <leonardo.balter@gmail.com> | ||
Rodrigo Rosenfeld Rosas <rr.rosas@gmail.com> | ||
Daniel Husar <dano.husar@gmail.com> | ||
Philip Jägenstedt <philip@foolip.org> | ||
John Hoven <hovenj@gmail.com> | ||
Roman Reiß <me@silverwind.io> | ||
Benjy Cui <benjytrys@gmail.com> | ||
Rodrigo Rosenfeld Rosas <rr.rosas@gmail.com> | ||
John Hoven <hovenj@gmail.com> | ||
Philip Jägenstedt <philip@foolip.org> | ||
Christian Kosmowski <ksmwsk@gmail.com> | ||
David Corbacho <davidcorbacho@gmail.com> | ||
Liang Peng <poppinlp@gmail.com> | ||
TJ VanToll <tj.vantoll@gmail.com> | ||
Aurelio De Rosa <aurelioderosa@gmail.com> | ||
Senya Pugach <upisfree@outlook.com> | ||
Aurelio De Rosa <aurelioderosa@gmail.com> | ||
Dan Hart <danhart@notonthehighstreet.com> | ||
Nazar Mokrynskyi <nazar@mokrynskyi.com> | ||
Benjamin Tan <demoneaux@gmail.com> | ||
Amit Merchant <bullredeyes@gmail.com> | ||
Jason Bedard <jason+github@jbedard.ca> | ||
Veaceslav Grimalschi <grimalschi@yandex.ru> | ||
Richard McDaniel <rm0026@uah.edu> | ||
Arthur Verschaeve <contact@arthurverschaeve.be> | ||
Dan Hart <danhart@notonthehighstreet.com> | ||
Shivaji Varma <contact@shivajivarma.com> | ||
Ben Toews <mastahyeti@gmail.com> | ||
Bin Xin <rhyzix@gmail.com> | ||
David Corbacho <davidcorbacho@gmail.com> | ||
Veaceslav Grimalschi <grimalschi@yandex.ru> | ||
Daniel Husar <dano.husar@gmail.com> | ||
Neftaly Hernandez <neftaly.hernandez@gmail.com> | ||
T.J. Crowder <tj.crowder@farsightsoftware.com> | ||
Nicolas HENRY <icewil@gmail.com> | ||
Frederic Hemberger <mail@frederic-hemberger.de> | ||
Ben Toews <mastahyeti@gmail.com> | ||
Victor Homyakov <vkhomyackov@gmail.com> | ||
Aditya Raghavan <araghavan3@gmail.com> | ||
Victor Homyakov <vkhomyackov@gmail.com> | ||
Shivaji Varma <contact@shivajivarma.com> | ||
Nicolas HENRY <icewil@gmail.com> | ||
Anne-Gaelle Colom <coloma@westminster.ac.uk> | ||
Leonardo Braga <leonardo.braga@gmail.com> | ||
George Mauer <gmauer@gmail.com> | ||
Leonardo Braga <leonardo.braga@gmail.com> | ||
Stephen Edgar <stephen@netweb.com.au> | ||
Thomas Tortorini <thomastortorini@gmail.com> | ||
Jörn Wagner <joern.wagner@explicatis.com> | ||
Jon Hester <jon.d.hester@gmail.com> | ||
Colin Frick <colin@bash.li> | ||
Winston Howes <winstonhowes@gmail.com> | ||
Jon Hester <jon.d.hester@gmail.com> | ||
Alexander O'Mara <me@alexomara.com> | ||
Chris Rebert <github@rebertia.com> | ||
Bastian Buchholz <buchholz.bastian@googlemail.com> | ||
Mu Haibao <mhbseal@163.com> | ||
Calvin Metcalf <calvin.metcalf@gmail.com> | ||
Arthur Stolyar <nekr.fabula@gmail.com> | ||
Calvin Metcalf <calvin.metcalf@gmail.com> | ||
Mu Haibao <mhbseal@163.com> | ||
Richard McDaniel <rm0026@uah.edu> | ||
Chris Rebert <github@rebertia.com> | ||
Gabriel Schulhof <gabriel.schulhof@intel.com> | ||
Gilad Peleg <giladp007@gmail.com> | ||
Julian Alexander Murillo <julian.alexander.murillo@gmail.com> | ||
Kevin Kirsche <Kev.Kirsche+GitHub@gmail.com> | ||
Martin Naumann <martin@geekonaut.de> | ||
Yongwoo Jeon <yongwoo.jeon@navercorp.com> | ||
John-David Dalton <john.david.dalton@gmail.com> | ||
Marek Lewandowski <m.lewandowski@cksource.com> | ||
Bruno Pérel <brunoperel@gmail.com> | ||
Daniel Nill <daniellnill@gmail.com> | ||
Reed Loden <reed@reedloden.com> | ||
Daniel Nill <daniellnill@gmail.com> | ||
Yongwoo Jeon <yongwoo.jeon@navercorp.com> | ||
Sean Henderson <seanh.za@gmail.com> | ||
Gary Ye <garysye@gmail.com> | ||
Richard Kraaijenhagen <stdin+git@riichard.com> | ||
Connor Atherton <c.liam.atherton@gmail.com> | ||
Gary Ye <garysye@gmail.com> | ||
Christian Grete <webmaster@christiangrete.com> | ||
Tom von Clef <thomas.vonclef@gmail.com> | ||
Liza Ramo <liza.h.ramo@gmail.com> | ||
Julian Alexander Murillo <julian.alexander.murillo@gmail.com> | ||
Joelle Fleurantin <joasqueeniebee@gmail.com> | ||
Steve Mao <maochenyan@gmail.com> | ||
Jon Dufresne <jon.dufresne@gmail.com> | ||
Jae Sung Park <alberto.park@gmail.com> | ||
Jun Sun <klsforever@gmail.com> | ||
Josh Soref <apache@soref.com> | ||
Saptak Sengupta <saptak013@gmail.com> | ||
Henry Wong <henryw4k@gmail.com> | ||
Jon Dufresne <jon.dufresne@gmail.com> | ||
Jun Sun <klsforever@gmail.com> | ||
Martijn W. van der Lee <martijn@vanderlee.com> | ||
Devin Wilson <dwilson6.github@gmail.com> | ||
Steve Mao <maochenyan@gmail.com> | ||
Damian Senn <jquery@topaxi.codes> | ||
Zack Hall <zackhall@outlook.com> | ||
Vitaliy Terziev <vitaliyterziev@gmail.com> | ||
Todor Prikumov <tono_pr@abv.bg> | ||
Bernhard M. Wiedemann <jquerybmw@lsmod.de> | ||
Todor Prikumov <tono_pr@abv.bg> | ||
Jha Naman <createnaman@gmail.com> | ||
Alexander Lisianoi <all3fox@gmail.com> | ||
William Robinet <william.robinet@conostix.com> | ||
Alexander Lisianoi <all3fox@gmail.com> | ||
Vitaliy Terziev <vitaliyterziev@gmail.com> | ||
Joe Trumbull <trumbull.j@gmail.com> | ||
Alexander K <xpyro@ya.ru> | ||
Damian Senn <jquery@topaxi.codes> | ||
Ralin Chimev <ralin.chimev@gmail.com> | ||
@@ -311,16 +337,16 @@ Felipe Sateler <fsateler@gmail.com> | ||
Alex Padilla <alexonezero@outlook.com> | ||
karan-96 <karanbatra96@gmail.com> | ||
南漂一卒 <shiy007@qq.com> | ||
karan-96 <karanbatra96@gmail.com> | ||
Erik Lax <erik@datahack.se> | ||
Boom Lee <teabyii@gmail.com> | ||
Andreas Solleder <asol@num42.de> | ||
CDAGaming <cstack2011@yahoo.com> | ||
Pierre Spring <pierre@nelm.io> | ||
Shashanka Nataraj <shashankan.10@gmail.com> | ||
Erik Lax <erik@datahack.se> | ||
CDAGaming <cstack2011@yahoo.com> | ||
Matan Kotler-Berkowitz <205matan@gmail.com> | ||
Jordan Beland <jordan.beland@gmail.com> | ||
Henry Zhu <hi@henryzoo.com> | ||
Saptak Sengupta <saptak013@gmail.com> | ||
Nilton Cesar <niltoncms@gmail.com> | ||
basil.belokon <basil.belokon@gmail.com> | ||
Andrey Meshkov <ay.meshkov@gmail.com> | ||
tmybr11 <tomas.perone@gmail.com> | ||
@@ -330,9 +356,14 @@ Luis Emilio Velasco Sanchez <emibloque@gmail.com> | ||
Bert Zhang <enbo@users.noreply.github.com> | ||
Sébastien Règne <regseb@users.noreply.github.com> | ||
wartmanm <3869625+wartmanm@users.noreply.github.com> | ||
Siddharth Dungarwal <sd5869@gmail.com> | ||
abnud1 <ahmad13932013@hotmail.com> | ||
Andrei Fangli <andrei_fangli@outlook.com> | ||
Marja Hölttä <marja.holtta@gmail.com> | ||
abnud1 <ahmad13932013@hotmail.com> | ||
buddh4 <mail@jharrer.de> | ||
Hoang <dangkyokhoang@gmail.com> | ||
Wonseop Kim <wonseop.kim@samsung.com> | ||
Pat O'Callaghan <patocallaghan@gmail.com> | ||
JuanMa Ruiz <ruizjuanma@gmail.com> | ||
Ahmed.S.ElAfifi <ahmed.s.elafifi@gmail.com> | ||
Wonseop Kim <wonseop.kim@samsung.com> | ||
Christian Oliff <christianoliff@pm.me> | ||
@@ -339,0 +370,0 @@ Christian Wenz <christian@wenz.org> |
@@ -5,3 +5,3 @@ { | ||
"description": "JavaScript library for DOM operations", | ||
"version": "3.6.4", | ||
"version": "3.7.0", | ||
"main": "dist/jquery.js", | ||
@@ -11,3 +11,3 @@ "homepage": "https://jquery.com", | ||
"name": "OpenJS Foundation and other contributors", | ||
"url": "https://github.com/jquery/jquery/blob/3.6.4/AUTHORS.txt" | ||
"url": "https://github.com/jquery/jquery/blob/3.7.0/AUTHORS.txt" | ||
}, | ||
@@ -50,3 +50,3 @@ "repository": { | ||
"jsdom": "19.0.0", | ||
"karma": "^6.3.17", | ||
"karma": "6.4.1", | ||
"karma-browserstack-launcher": "1.6.0", | ||
@@ -58,4 +58,6 @@ "karma-chrome-launcher": "3.1.1", | ||
"karma-qunit": "4.1.2", | ||
"karma-webkit-launcher": "2.1.0", | ||
"load-grunt-tasks": "5.1.0", | ||
"native-promise-only": "0.8.1", | ||
"playwright-webkit": "1.30.0", | ||
"promises-aplus-tests": "2.1.2", | ||
@@ -67,3 +69,2 @@ "q": "1.5.1", | ||
"sinon": "2.3.7", | ||
"sizzle": "2.3.10", | ||
"strip-json-comments": "2.0.1", | ||
@@ -80,5 +81,5 @@ "testswarm": "1.1.2", | ||
"test:no-deprecated": "grunt test:prepare && grunt custom:-deprecated && grunt karma:main", | ||
"test:no-sizzle": "grunt test:prepare && grunt custom:-sizzle && grunt karma:main", | ||
"test:selector-native": "grunt test:prepare && grunt custom:-selector && grunt karma:main", | ||
"test:slim": "grunt test:prepare && grunt custom:slim && grunt karma:main", | ||
"test": "npm run test:slim && npm run test:no-deprecated && npm run test:no-sizzle && grunt && grunt test:slow && grunt karma:main && grunt karma:amd", | ||
"test": "npm run test:slim && npm run test:no-deprecated && npm run test:selector-native && grunt && grunt test:slow && grunt karma:main && grunt karma:amd", | ||
"jenkins": "npm run test:browserless" | ||
@@ -85,0 +86,0 @@ }, |
@@ -8,3 +8,3 @@ # jQuery | ||
If upgrading, please see the [blog post for 3.6.4](https://blog.jquery.com/2023/03/06/jquery-3-6-4-released-selector-forgiveness/). This includes notable differences from the previous version and a more readable changelog. | ||
If upgrading, please see the [blog post for 3.7.0](https://blog.jquery.com/2023/05/11/jquery-3-7-0-released-staying-in-order/). This includes notable differences from the previous version and a more readable changelog. | ||
@@ -20,3 +20,3 @@ ## Including jQuery | ||
```html | ||
<script src="https://code.jquery.com/jquery-3.6.4.min.js"></script> | ||
<script src="https://code.jquery.com/jquery-3.7.0.min.js"></script> | ||
``` | ||
@@ -23,0 +23,0 @@ |
@@ -28,5 +28,6 @@ /* global Symbol */ | ||
var | ||
version = "3.6.4", | ||
var version = "3.7.0", | ||
rhtmlSuffix = /HTML$/i, | ||
// Define a local copy of jQuery | ||
@@ -276,2 +277,29 @@ jQuery = function( selector, context ) { | ||
// Retrieve the text value of an array of DOM nodes | ||
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 ) { | ||
return elem.textContent; | ||
} else if ( nodeType === 3 || nodeType === 4 ) { | ||
return elem.nodeValue; | ||
} | ||
// Do not include comment or processing instruction nodes | ||
return ret; | ||
}, | ||
// results is for internal usage only | ||
@@ -299,2 +327,11 @@ makeArray: function( arr, results ) { | ||
isXMLDoc: function( elem ) { | ||
var namespace = elem && elem.namespaceURI, | ||
docElem = elem && ( elem.ownerDocument || elem ).documentElement; | ||
// Assume HTML when documentElement doesn't yet exist, such as inside | ||
// document fragments. | ||
return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); | ||
}, | ||
// Support: Android <=4.0 only, PhantomJS 1 only | ||
@@ -301,0 +338,0 @@ // push.apply(_, arraylike) throws on ancient WebKit |
define( [ | ||
"../core", | ||
"../var/documentElement", | ||
"../selector" // jQuery.contains | ||
"../selector/contains" // jQuery.contains | ||
], function( jQuery, documentElement ) { | ||
@@ -6,0 +6,0 @@ "use strict"; |
@@ -54,3 +54,4 @@ define( [ | ||
extra = 0, | ||
delta = 0; | ||
delta = 0, | ||
marginDelta = 0; | ||
@@ -65,4 +66,6 @@ // Adjustment may not be necessary | ||
// Both box models exclude margin | ||
// Count margin delta separately to only add it after scroll gutter adjustment. | ||
// This is needed to make negative margins work with `outerHeight( true )` (gh-3982). | ||
if ( box === "margin" ) { | ||
delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); | ||
marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); | ||
} | ||
@@ -118,3 +121,3 @@ | ||
return delta; | ||
return delta + marginDelta; | ||
} | ||
@@ -217,22 +220,31 @@ | ||
cssNumber: { | ||
"animationIterationCount": true, | ||
"columnCount": true, | ||
"fillOpacity": true, | ||
"flexGrow": true, | ||
"flexShrink": true, | ||
"fontWeight": true, | ||
"gridArea": true, | ||
"gridColumn": true, | ||
"gridColumnEnd": true, | ||
"gridColumnStart": true, | ||
"gridRow": true, | ||
"gridRowEnd": true, | ||
"gridRowStart": true, | ||
"lineHeight": true, | ||
"opacity": true, | ||
"order": true, | ||
"orphans": true, | ||
"widows": true, | ||
"zIndex": true, | ||
"zoom": true | ||
animationIterationCount: true, | ||
aspectRatio: true, | ||
borderImageSlice: true, | ||
columnCount: true, | ||
flexGrow: true, | ||
flexShrink: true, | ||
fontWeight: true, | ||
gridArea: true, | ||
gridColumn: true, | ||
gridColumnEnd: true, | ||
gridColumnStart: true, | ||
gridRow: true, | ||
gridRowEnd: true, | ||
gridRowStart: true, | ||
lineHeight: true, | ||
opacity: true, | ||
order: true, | ||
orphans: true, | ||
scale: true, | ||
widows: true, | ||
zIndex: true, | ||
zoom: true, | ||
// SVG-related | ||
fillOpacity: true, | ||
floodOpacity: true, | ||
stopOpacity: true, | ||
strokeMiterlimit: true, | ||
strokeOpacity: true | ||
}, | ||
@@ -239,0 +251,0 @@ |
@@ -197,3 +197,3 @@ define( [ | ||
jQuery.Deferred.exceptionHook( e, | ||
process.stackTrace ); | ||
process.error ); | ||
} | ||
@@ -226,6 +226,13 @@ | ||
// Call an optional hook to record the stack, in case of exception | ||
// Call an optional hook to record the error, in case of exception | ||
// since it's otherwise lost when execution goes async | ||
if ( jQuery.Deferred.getStackHook ) { | ||
process.stackTrace = jQuery.Deferred.getStackHook(); | ||
if ( jQuery.Deferred.getErrorHook ) { | ||
process.error = jQuery.Deferred.getErrorHook(); | ||
// The deprecated alias of the above. While the name suggests | ||
// returning the stack, not an error instance, jQuery just passes | ||
// it directly to `console.warn` so both will work; an instance | ||
// just better cooperates with source maps. | ||
} else if ( jQuery.Deferred.getStackHook ) { | ||
process.error = jQuery.Deferred.getStackHook(); | ||
} | ||
@@ -232,0 +239,0 @@ window.setTimeout( process ); |
@@ -12,3 +12,6 @@ define( [ | ||
jQuery.Deferred.exceptionHook = function( error, stack ) { | ||
// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error | ||
// captured before the async barrier to get the original error cause | ||
// which may otherwise be hidden. | ||
jQuery.Deferred.exceptionHook = function( error, asyncError ) { | ||
@@ -18,3 +21,4 @@ // Support: IE 8 - 9 only | ||
if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { | ||
window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); | ||
window.console.warn( "jQuery.Deferred exception: " + error.message, | ||
error.stack, asyncError ); | ||
} | ||
@@ -21,0 +25,0 @@ }; |
214
src/event.js
@@ -30,21 +30,2 @@ define( [ | ||
// Support: IE <=9 - 11+ | ||
// focus() and blur() are asynchronous, except when they are no-op. | ||
// So expect focus to be synchronous when the element is already active, | ||
// and blur to be synchronous when the element is not already active. | ||
// (focus and blur are always synchronous in other supported browsers, | ||
// this just defines when we can count on it). | ||
function expectSync( elem, type ) { | ||
return ( elem === safeActiveElement() ) === ( type === "focus" ); | ||
} | ||
// Support: IE <=9 only | ||
// Accessing document.activeElement can throw unexpectedly | ||
// https://bugs.jquery.com/ticket/13393 | ||
function safeActiveElement() { | ||
try { | ||
return document.activeElement; | ||
} catch ( err ) { } | ||
} | ||
function on( elem, types, selector, data, fn, one ) { | ||
@@ -487,3 +468,3 @@ var origFn, type; | ||
// dataPriv.set( el, "click", ... ) | ||
leverageNative( el, "click", returnTrue ); | ||
leverageNative( el, "click", true ); | ||
} | ||
@@ -539,6 +520,6 @@ | ||
// already occurred before other listeners are invoked. | ||
function leverageNative( el, type, expectSync ) { | ||
function leverageNative( el, type, isSetup ) { | ||
// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add | ||
if ( !expectSync ) { | ||
// Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add | ||
if ( !isSetup ) { | ||
if ( dataPriv.get( el, type ) === undefined ) { | ||
@@ -555,3 +536,3 @@ jQuery.event.add( el, type, returnTrue ); | ||
handler: function( event ) { | ||
var notAsync, result, | ||
var result, | ||
saved = dataPriv.get( this, type ); | ||
@@ -562,5 +543,3 @@ | ||
// Interrupt processing of the outer synthetic .trigger()ed event | ||
// Saved data should be false in such cases, but might be a leftover capture object | ||
// from an async native handler (gh-4350) | ||
if ( !saved.length ) { | ||
if ( !saved ) { | ||
@@ -574,12 +553,6 @@ // Store arguments for use when handling the inner native event | ||
// Trigger the native event and capture its result | ||
// Support: IE <=9 - 11+ | ||
// focus() and blur() are asynchronous | ||
notAsync = expectSync( this, type ); | ||
this[ type ](); | ||
result = dataPriv.get( this, type ); | ||
if ( saved !== result || notAsync ) { | ||
dataPriv.set( this, type, false ); | ||
} else { | ||
result = {}; | ||
} | ||
dataPriv.set( this, type, false ); | ||
if ( saved !== result ) { | ||
@@ -591,13 +564,8 @@ | ||
// Support: Chrome 86+ | ||
// In Chrome, if an element having a focusout handler is blurred by | ||
// clicking outside of it, it invokes the handler synchronously. If | ||
// that handler calls `.remove()` on the element, the data is cleared, | ||
// leaving `result` undefined. We need to guard against this. | ||
return result && result.value; | ||
return result; | ||
} | ||
// If this is an inner synthetic event for an event with a bubbling surrogate | ||
// (focus or blur), assume that the surrogate already propagated from triggering the | ||
// native event and prevent that from happening again here. | ||
// (focus or blur), assume that the surrogate already propagated from triggering | ||
// the native event and prevent that from happening again here. | ||
// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the | ||
@@ -612,18 +580,21 @@ // bubbling surrogate propagates *after* the non-bubbling base), but that seems | ||
// Fire an inner synthetic event with the original arguments | ||
} else if ( saved.length ) { | ||
} else if ( saved ) { | ||
// ...and capture the result | ||
dataPriv.set( this, type, { | ||
value: jQuery.event.trigger( | ||
dataPriv.set( this, type, jQuery.event.trigger( | ||
saved[ 0 ], | ||
saved.slice( 1 ), | ||
this | ||
) ); | ||
// Support: IE <=9 - 11+ | ||
// Extend with the prototype to reset the above stopImmediatePropagation() | ||
jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), | ||
saved.slice( 1 ), | ||
this | ||
) | ||
} ); | ||
// Abort handling of the native event | ||
event.stopImmediatePropagation(); | ||
// Abort handling of the native event by all jQuery handlers while allowing | ||
// native handlers on the same element to run. On target, this is achieved | ||
// by stopping immediate propagation just on the jQuery event. However, | ||
// the native event is re-wrapped by a jQuery one on each level of the | ||
// propagation so the only way to stop it for jQuery is to stop it for | ||
// everyone via native `stopPropagation()`. This is not a problem for | ||
// focus/blur which don't bubble, but it does also stop click on checkboxes | ||
// and radios. We accept this limitation. | ||
event.stopPropagation(); | ||
event.isImmediatePropagationStopped = returnTrue; | ||
} | ||
@@ -767,2 +738,41 @@ } | ||
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { | ||
function focusMappedHandler( nativeEvent ) { | ||
if ( document.documentMode ) { | ||
// Support: IE 11+ | ||
// Attach a single focusin/focusout handler on the document while someone wants | ||
// focus/blur. This is because the former are synchronous in IE while the latter | ||
// are async. In other browsers, all those handlers are invoked synchronously. | ||
// `handle` from private data would already wrap the event, but we need | ||
// to change the `type` here. | ||
var handle = dataPriv.get( this, "handle" ), | ||
event = jQuery.event.fix( nativeEvent ); | ||
event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; | ||
event.isSimulated = true; | ||
// First, handle focusin/focusout | ||
handle( nativeEvent ); | ||
// ...then, handle focus/blur | ||
// | ||
// focus/blur don't bubble while focusin/focusout do; simulate the former by only | ||
// invoking the handler at the lower level. | ||
if ( event.target === event.currentTarget ) { | ||
// The setup part calls `leverageNative`, which, in turn, calls | ||
// `jQuery.event.add`, so event handle will already have been set | ||
// by this point. | ||
handle( event ); | ||
} | ||
} else { | ||
// For non-IE browsers, attach a single capturing handler on the document | ||
// while someone wants focusin/focusout. | ||
jQuery.event.simulate( delegateType, nativeEvent.target, | ||
jQuery.event.fix( nativeEvent ) ); | ||
} | ||
} | ||
jQuery.event.special[ type ] = { | ||
@@ -773,9 +783,25 @@ | ||
var attaches; | ||
// Claim the first handler | ||
// dataPriv.set( this, "focus", ... ) | ||
// dataPriv.set( this, "blur", ... ) | ||
leverageNative( this, type, expectSync ); | ||
leverageNative( this, type, true ); | ||
// Return false to allow normal processing in the caller | ||
return false; | ||
if ( document.documentMode ) { | ||
// Support: IE 9 - 11+ | ||
// We use the same native handler for focusin & focus (and focusout & blur) | ||
// so we need to coordinate setup & teardown parts between those events. | ||
// Use `delegateType` as the key as `type` is already used by `leverageNative`. | ||
attaches = dataPriv.get( this, delegateType ); | ||
if ( !attaches ) { | ||
this.addEventListener( delegateType, focusMappedHandler ); | ||
} | ||
dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); | ||
} else { | ||
// Return false to allow normal processing in the caller | ||
return false; | ||
} | ||
}, | ||
@@ -791,2 +817,20 @@ trigger: function() { | ||
teardown: function() { | ||
var attaches; | ||
if ( document.documentMode ) { | ||
attaches = dataPriv.get( this, delegateType ) - 1; | ||
if ( !attaches ) { | ||
this.removeEventListener( delegateType, focusMappedHandler ); | ||
dataPriv.remove( this, delegateType ); | ||
} else { | ||
dataPriv.set( this, delegateType, attaches ); | ||
} | ||
} else { | ||
// Return false to indicate standard teardown should be applied | ||
return false; | ||
} | ||
}, | ||
// Suppress native focus or blur if we're currently inside | ||
@@ -800,2 +844,54 @@ // a leveraged native-event stack | ||
}; | ||
// Support: Firefox <=44 | ||
// Firefox doesn't have focus(in | out) events | ||
// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 | ||
// | ||
// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 | ||
// focus(in | out) events fire after focus & blur events, | ||
// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order | ||
// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 | ||
// | ||
// Support: IE 9 - 11+ | ||
// To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, | ||
// attach a single handler for both events in IE. | ||
jQuery.event.special[ delegateType ] = { | ||
setup: function() { | ||
// Handle: regular nodes (via `this.ownerDocument`), window | ||
// (via `this.document`) & document (via `this`). | ||
var doc = this.ownerDocument || this.document || this, | ||
dataHolder = document.documentMode ? this : doc, | ||
attaches = dataPriv.get( dataHolder, delegateType ); | ||
// Support: IE 9 - 11+ | ||
// We use the same native handler for focusin & focus (and focusout & blur) | ||
// so we need to coordinate setup & teardown parts between those events. | ||
// Use `delegateType` as the key as `type` is already used by `leverageNative`. | ||
if ( !attaches ) { | ||
if ( document.documentMode ) { | ||
this.addEventListener( delegateType, focusMappedHandler ); | ||
} else { | ||
doc.addEventListener( type, focusMappedHandler, true ); | ||
} | ||
} | ||
dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); | ||
}, | ||
teardown: function() { | ||
var doc = this.ownerDocument || this.document || this, | ||
dataHolder = document.documentMode ? this : doc, | ||
attaches = dataPriv.get( dataHolder, delegateType ) - 1; | ||
if ( !attaches ) { | ||
if ( document.documentMode ) { | ||
this.removeEventListener( delegateType, focusMappedHandler ); | ||
} else { | ||
doc.removeEventListener( type, focusMappedHandler, true ); | ||
} | ||
dataPriv.remove( dataHolder, delegateType ); | ||
} else { | ||
dataPriv.set( dataHolder, delegateType, attaches ); | ||
} | ||
} | ||
}; | ||
} ); | ||
@@ -802,0 +898,0 @@ |
@@ -14,3 +14,2 @@ define( [ | ||
"./event", | ||
"./event/focusin", | ||
"./manipulation", | ||
@@ -17,0 +16,0 @@ "./manipulation/_evalUrl", |
@@ -251,3 +251,4 @@ define( [ | ||
// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 | ||
// We eschew jQuery#find here for performance reasons: | ||
// https://jsperf.com/getall-vs-sizzle/2 | ||
destElements = getAll( clone ); | ||
@@ -254,0 +255,0 @@ srcElements = getAll( elem ); |
@@ -6,9 +6,14 @@ define( [ | ||
"./var/hasOwn", | ||
"./var/indexOf" | ||
], function( jQuery, document, documentElement, hasOwn, indexOf ) { | ||
"./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 (non-Sizzle) selector module for custom builds. | ||
* Optional limited selector module for custom builds. | ||
* | ||
@@ -18,49 +23,28 @@ * Note that this DOES NOT SUPPORT many documented jQuery | ||
* | ||
* 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) | ||
* * 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 Sizzle or | ||
* customize this stub for the project's specific needs. | ||
* 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, | ||
rhtmlSuffix = /HTML$/i, | ||
sortStable = jQuery.expando.split( "" ).sort( sortOrder ).join( "" ) === jQuery.expando, | ||
matches = documentElement.matches || | ||
documentElement.webkitMatchesSelector || | ||
documentElement.mozMatchesSelector || | ||
documentElement.oMatchesSelector || | ||
documentElement.msMatchesSelector, | ||
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 ) { | ||
@@ -137,10 +121,12 @@ | ||
function escape( sel ) { | ||
return ( sel + "" ).replace( rcssescape, fcssescape ); | ||
} | ||
jQuery.extend( { | ||
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, | ||
escapeSelector: escape, | ||
find: function( selector, context, results, seed ) { | ||
@@ -153,3 +139,3 @@ var elem, nodeType, | ||
// Same basic safeguard as Sizzle | ||
// Same basic safeguard as in the full selector module | ||
if ( !selector || typeof selector !== "string" ) { | ||
@@ -159,4 +145,4 @@ return results; | ||
// Early return if context is not an element or document | ||
if ( ( nodeType = context.nodeType ) !== 1 && nodeType !== 9 ) { | ||
// Early return if context is not an element, document or document fragment | ||
if ( ( nodeType = context.nodeType ) !== 1 && nodeType !== 9 && nodeType !== 11 ) { | ||
return []; | ||
@@ -177,42 +163,2 @@ } | ||
}, | ||
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: { | ||
@@ -228,2 +174,6 @@ attrHandle: {}, | ||
jQuery.fn.uniqueSort = function() { | ||
return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); | ||
}; | ||
jQuery.extend( jQuery.find, { | ||
@@ -230,0 +180,0 @@ matches: function( expr, elements ) { |
2113
src/selector.js
@@ -1,3 +0,2112 @@ | ||
define( [ "./selector-sizzle" ], function() { | ||
"use strict"; | ||
define( [ | ||
"./core", | ||
"./core/nodeName", | ||
"./var/arr", | ||
"./var/document", | ||
"./var/indexOf", | ||
"./var/hasOwn", | ||
"./var/pop", | ||
"./var/push", | ||
"./var/slice", | ||
"./var/sort", | ||
"./var/splice", | ||
"./var/whitespace", | ||
"./var/rtrimCSS", | ||
"./var/support", | ||
// The following utils are attached directly to the jQuery object. | ||
"./selector/contains", | ||
"./selector/escapeSelector" | ||
], function( jQuery, nodeName, arr, document, indexOf, hasOwn, pop, push, | ||
slice, sort, splice, whitespace, rtrimCSS, support ) { | ||
"use strict"; | ||
var preferredDoc = document, | ||
pushNative = push; | ||
( function() { | ||
var i, | ||
Expr, | ||
outermostContext, | ||
sortInput, | ||
hasDuplicate, | ||
push = pushNative, | ||
// Local document vars | ||
document, | ||
documentElement, | ||
documentIsHTML, | ||
rbuggyQSA, | ||
matches, | ||
// Instance-specific data | ||
expando = jQuery.expando, | ||
dirruns = 0, | ||
done = 0, | ||
classCache = createCache(), | ||
tokenCache = createCache(), | ||
compilerCache = createCache(), | ||
nonnativeSelectorCache = createCache(), | ||
sortOrder = function( a, b ) { | ||
if ( a === b ) { | ||
hasDuplicate = true; | ||
} | ||
return 0; | ||
}, | ||
booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + | ||
"loop|multiple|open|readonly|required|scoped", | ||
// Regular expressions | ||
// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram | ||
identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + | ||
"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", | ||
// Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors | ||
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 = ":(" + identifier + ")(?:\\((" + | ||
// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: | ||
// 1. quoted (capture 3; capture 4 or capture 5) | ||
"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + | ||
// 2. simple (capture 6) | ||
"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + | ||
// 3. anything else (capture 2) | ||
".*" + | ||
")\\)|)", | ||
// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter | ||
rwhitespace = new RegExp( whitespace + "+", "g" ), | ||
rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), | ||
rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + | ||
whitespace + "*" ), | ||
rdescend = new RegExp( whitespace + "|>" ), | ||
rpseudo = new RegExp( pseudos ), | ||
ridentifier = new RegExp( "^" + identifier + "$" ), | ||
matchExpr = { | ||
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 + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + | ||
whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), | ||
bool: new RegExp( "^(?:" + booleans + ")$", "i" ), | ||
// For use in libraries implementing .is() | ||
// We use this for POS matching in `select` | ||
needsContext: new RegExp( "^" + whitespace + | ||
"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + | ||
"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) | ||
}, | ||
rinputs = /^(?:input|select|textarea|button)$/i, | ||
rheader = /^h\d$/i, | ||
// Easily-parseable/retrievable ID or TAG or CLASS selectors | ||
rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, | ||
rsibling = /[+~]/, | ||
// CSS escapes | ||
// https://www.w3.org/TR/CSS21/syndata.html#escaped-characters | ||
runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + | ||
"?|\\\\([^\\r\\n\\f])", "g" ), | ||
funescape = function( escape, nonHex ) { | ||
var high = "0x" + escape.slice( 1 ) - 0x10000; | ||
if ( nonHex ) { | ||
// Strip the backslash prefix from a non-hex escape sequence | ||
return nonHex; | ||
} | ||
// Replace a hexadecimal escape sequence with the encoded Unicode code point | ||
// Support: IE <=11+ | ||
// For values outside the Basic Multilingual Plane (BMP), manually construct a | ||
// surrogate pair | ||
return high < 0 ? | ||
String.fromCharCode( high + 0x10000 ) : | ||
String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); | ||
}, | ||
// Used for iframes; see `setDocument`. | ||
// Support: IE 9 - 11+, Edge 12 - 18+ | ||
// Removing the function wrapper causes a "Permission Denied" | ||
// error in IE/Edge. | ||
unloadHandler = function() { | ||
setDocument(); | ||
}, | ||
inDisabledFieldset = addCombinator( | ||
function( elem ) { | ||
return elem.disabled === true && nodeName( elem, "fieldset" ); | ||
}, | ||
{ dir: "parentNode", next: "legend" } | ||
); | ||
// Support: IE <=9 only | ||
// Accessing document.activeElement can throw unexpectedly | ||
// https://bugs.jquery.com/ticket/13393 | ||
function safeActiveElement() { | ||
try { | ||
return document.activeElement; | ||
} catch ( err ) { } | ||
} | ||
// Optimize for push.apply( _, NodeList ) | ||
try { | ||
push.apply( | ||
( arr = slice.call( preferredDoc.childNodes ) ), | ||
preferredDoc.childNodes | ||
); | ||
// Support: Android <=4.0 | ||
// Detect silently failing push.apply | ||
// eslint-disable-next-line no-unused-expressions | ||
arr[ preferredDoc.childNodes.length ].nodeType; | ||
} catch ( e ) { | ||
push = { | ||
apply: function( target, els ) { | ||
pushNative.apply( target, slice.call( els ) ); | ||
}, | ||
call: function( target ) { | ||
pushNative.apply( target, slice.call( arguments, 1 ) ); | ||
} | ||
}; | ||
} | ||
function find( selector, context, results, seed ) { | ||
var m, i, elem, nid, match, groups, newSelector, | ||
newContext = context && context.ownerDocument, | ||
// nodeType defaults to 9, since context defaults to document | ||
nodeType = context ? context.nodeType : 9; | ||
results = results || []; | ||
// Return early from calls with invalid selector or context | ||
if ( typeof selector !== "string" || !selector || | ||
nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { | ||
return results; | ||
} | ||
// Try to shortcut find operations (as opposed to filters) in HTML documents | ||
if ( !seed ) { | ||
setDocument( context ); | ||
context = context || document; | ||
if ( documentIsHTML ) { | ||
// If the selector is sufficiently simple, try using a "get*By*" DOM method | ||
// (excepting DocumentFragment context, where the methods don't exist) | ||
if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { | ||
// ID selector | ||
if ( ( m = match[ 1 ] ) ) { | ||
// Document context | ||
if ( nodeType === 9 ) { | ||
if ( ( elem = context.getElementById( m ) ) ) { | ||
// Support: IE 9 only | ||
// getElementById can match elements by name instead of ID | ||
if ( elem.id === m ) { | ||
push.call( results, elem ); | ||
return results; | ||
} | ||
} else { | ||
return results; | ||
} | ||
// Element context | ||
} else { | ||
// Support: IE 9 only | ||
// getElementById can match elements by name instead of ID | ||
if ( newContext && ( elem = newContext.getElementById( m ) ) && | ||
find.contains( context, elem ) && | ||
elem.id === m ) { | ||
push.call( results, elem ); | ||
return results; | ||
} | ||
} | ||
// Type selector | ||
} else if ( match[ 2 ] ) { | ||
push.apply( results, context.getElementsByTagName( selector ) ); | ||
return results; | ||
// Class selector | ||
} else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { | ||
push.apply( results, context.getElementsByClassName( m ) ); | ||
return results; | ||
} | ||
} | ||
// Take advantage of querySelectorAll | ||
if ( !nonnativeSelectorCache[ selector + " " ] && | ||
( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { | ||
newSelector = selector; | ||
newContext = context; | ||
// qSA considers elements outside a scoping root when evaluating child or | ||
// descendant combinators, which is not what we want. | ||
// In such cases, we work around the behavior by prefixing every selector in the | ||
// list with an ID selector referencing the scope context. | ||
// The technique has to be used as well when a leading combinator is used | ||
// as such selectors are not recognized by querySelectorAll. | ||
// Thanks to Andrew Dupont for this technique. | ||
if ( nodeType === 1 && | ||
( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { | ||
// Expand context for sibling selectors | ||
newContext = rsibling.test( selector ) && testContext( context.parentNode ) || | ||
context; | ||
// We can use :scope instead of the ID hack if the browser | ||
// supports it & if we're not changing the context. | ||
// Support: IE 11+, Edge 17 - 18+ | ||
// IE/Edge sometimes throw a "Permission denied" error when | ||
// strict-comparing two documents; shallow comparisons work. | ||
// eslint-disable-next-line eqeqeq | ||
if ( newContext != context || !support.scope ) { | ||
// Capture the context ID, setting it first if necessary | ||
if ( ( nid = context.getAttribute( "id" ) ) ) { | ||
nid = jQuery.escapeSelector( nid ); | ||
} else { | ||
context.setAttribute( "id", ( nid = expando ) ); | ||
} | ||
} | ||
// Prefix every selector in the list | ||
groups = tokenize( selector ); | ||
i = groups.length; | ||
while ( i-- ) { | ||
groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + | ||
toSelector( groups[ i ] ); | ||
} | ||
newSelector = groups.join( "," ); | ||
} | ||
try { | ||
push.apply( results, | ||
newContext.querySelectorAll( newSelector ) | ||
); | ||
return results; | ||
} catch ( qsaError ) { | ||
nonnativeSelectorCache( selector, true ); | ||
} finally { | ||
if ( nid === expando ) { | ||
context.removeAttribute( "id" ); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
// All others | ||
return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); | ||
} | ||
/** | ||
* Create key-value caches of limited size | ||
* @returns {function(string, object)} Returns the Object data after storing it on itself with | ||
* property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) | ||
* deleting the oldest entry | ||
*/ | ||
function createCache() { | ||
var keys = []; | ||
function cache( key, value ) { | ||
// Use (key + " ") to avoid collision with native prototype properties | ||
// (see https://github.com/jquery/sizzle/issues/157) | ||
if ( keys.push( key + " " ) > Expr.cacheLength ) { | ||
// Only keep the most recent entries | ||
delete cache[ keys.shift() ]; | ||
} | ||
return ( cache[ key + " " ] = value ); | ||
} | ||
return cache; | ||
} | ||
/** | ||
* Mark a function for special use by jQuery selector module | ||
* @param {Function} fn The function to mark | ||
*/ | ||
function markFunction( fn ) { | ||
fn[ expando ] = true; | ||
return fn; | ||
} | ||
/** | ||
* Support testing using an element | ||
* @param {Function} fn Passed the created element and returns a boolean result | ||
*/ | ||
function assert( fn ) { | ||
var el = document.createElement( "fieldset" ); | ||
try { | ||
return !!fn( el ); | ||
} catch ( e ) { | ||
return false; | ||
} finally { | ||
// Remove from its parent by default | ||
if ( el.parentNode ) { | ||
el.parentNode.removeChild( el ); | ||
} | ||
// release memory in IE | ||
el = null; | ||
} | ||
} | ||
/** | ||
* Returns a function to use in pseudos for input types | ||
* @param {String} type | ||
*/ | ||
function createInputPseudo( type ) { | ||
return function( elem ) { | ||
return nodeName( elem, "input" ) && elem.type === type; | ||
}; | ||
} | ||
/** | ||
* Returns a function to use in pseudos for buttons | ||
* @param {String} type | ||
*/ | ||
function createButtonPseudo( type ) { | ||
return function( elem ) { | ||
return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && | ||
elem.type === type; | ||
}; | ||
} | ||
/** | ||
* Returns a function to use in pseudos for :enabled/:disabled | ||
* @param {Boolean} disabled true for :disabled; false for :enabled | ||
*/ | ||
function createDisabledPseudo( disabled ) { | ||
// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable | ||
return function( elem ) { | ||
// Only certain elements can match :enabled or :disabled | ||
// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled | ||
// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled | ||
if ( "form" in elem ) { | ||
// Check for inherited disabledness on relevant non-disabled elements: | ||
// * listed form-associated elements in a disabled fieldset | ||
// https://html.spec.whatwg.org/multipage/forms.html#category-listed | ||
// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled | ||
// * option elements in a disabled optgroup | ||
// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled | ||
// All such elements have a "form" property. | ||
if ( elem.parentNode && elem.disabled === false ) { | ||
// Option elements defer to a parent optgroup if present | ||
if ( "label" in elem ) { | ||
if ( "label" in elem.parentNode ) { | ||
return elem.parentNode.disabled === disabled; | ||
} else { | ||
return elem.disabled === disabled; | ||
} | ||
} | ||
// Support: IE 6 - 11+ | ||
// Use the isDisabled shortcut property to check for disabled fieldset ancestors | ||
return elem.isDisabled === disabled || | ||
// Where there is no isDisabled, check manually | ||
elem.isDisabled !== !disabled && | ||
inDisabledFieldset( elem ) === disabled; | ||
} | ||
return elem.disabled === disabled; | ||
// Try to winnow out elements that can't be disabled before trusting the disabled property. | ||
// Some victims get caught in our net (label, legend, menu, track), but it shouldn't | ||
// even exist on them, let alone have a boolean value. | ||
} else if ( "label" in elem ) { | ||
return elem.disabled === disabled; | ||
} | ||
// Remaining elements are neither :enabled nor :disabled | ||
return false; | ||
}; | ||
} | ||
/** | ||
* Returns a function to use in pseudos for positionals | ||
* @param {Function} fn | ||
*/ | ||
function createPositionalPseudo( fn ) { | ||
return markFunction( function( argument ) { | ||
argument = +argument; | ||
return markFunction( function( seed, matches ) { | ||
var j, | ||
matchIndexes = fn( [], seed.length, argument ), | ||
i = matchIndexes.length; | ||
// Match elements found at the specified indexes | ||
while ( i-- ) { | ||
if ( seed[ ( j = matchIndexes[ i ] ) ] ) { | ||
seed[ j ] = !( matches[ j ] = seed[ j ] ); | ||
} | ||
} | ||
} ); | ||
} ); | ||
} | ||
/** | ||
* Checks a node for validity as a jQuery selector context | ||
* @param {Element|Object=} context | ||
* @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value | ||
*/ | ||
function testContext( context ) { | ||
return context && typeof context.getElementsByTagName !== "undefined" && context; | ||
} | ||
/** | ||
* Sets document-related variables once based on the current document | ||
* @param {Element|Object} [node] An element or document object to use to set the document | ||
* @returns {Object} Returns the current document | ||
*/ | ||
function setDocument( node ) { | ||
var subWindow, | ||
doc = node ? node.ownerDocument || node : preferredDoc; | ||
// Return early if doc is invalid or already selected | ||
// Support: IE 11+, Edge 17 - 18+ | ||
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing | ||
// two documents; shallow comparisons work. | ||
// eslint-disable-next-line eqeqeq | ||
if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { | ||
return document; | ||
} | ||
// Update global variables | ||
document = doc; | ||
documentElement = document.documentElement; | ||
documentIsHTML = !jQuery.isXMLDoc( document ); | ||
// Support: iOS 7 only, IE 9 - 11+ | ||
// Older browsers didn't support unprefixed `matches`. | ||
matches = documentElement.matches || | ||
documentElement.webkitMatchesSelector || | ||
documentElement.msMatchesSelector; | ||
// Support: IE 9 - 11+, Edge 12 - 18+ | ||
// Accessing iframe documents after unload throws "permission denied" errors (see trac-13936) | ||
// Support: IE 11+, Edge 17 - 18+ | ||
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing | ||
// two documents; shallow comparisons work. | ||
// eslint-disable-next-line eqeqeq | ||
if ( preferredDoc != document && | ||
( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { | ||
// Support: IE 9 - 11+, Edge 12 - 18+ | ||
subWindow.addEventListener( "unload", unloadHandler ); | ||
} | ||
// Support: IE <10 | ||
// Check if getElementById returns elements by name | ||
// The broken getElementById methods don't pick up programmatically-set names, | ||
// so use a roundabout getElementsByName test | ||
support.getById = assert( function( el ) { | ||
documentElement.appendChild( el ).id = jQuery.expando; | ||
return !document.getElementsByName || | ||
!document.getElementsByName( jQuery.expando ).length; | ||
} ); | ||
// Support: IE 9 only | ||
// Check to see if it's possible to do matchesSelector | ||
// on a disconnected node. | ||
support.disconnectedMatch = assert( function( el ) { | ||
return matches.call( el, "*" ); | ||
} ); | ||
// Support: IE 9 - 11+, Edge 12 - 18+ | ||
// IE/Edge don't support the :scope pseudo-class. | ||
support.scope = assert( function() { | ||
return document.querySelectorAll( ":scope" ); | ||
} ); | ||
// Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only | ||
// Make sure the `:has()` argument is parsed unforgivingly. | ||
// We include `*` in the test to detect buggy implementations that are | ||
// _selectively_ forgiving (specifically when the list includes at least | ||
// one valid selector). | ||
// Note that we treat complete lack of support for `:has()` as if it were | ||
// spec-compliant support, which is fine because use of `:has()` in such | ||
// environments will fail in the qSA path and fall back to jQuery traversal | ||
// anyway. | ||
support.cssHas = assert( function() { | ||
try { | ||
document.querySelector( ":has(*,:jqfake)" ); | ||
return false; | ||
} catch ( e ) { | ||
return true; | ||
} | ||
} ); | ||
// ID filter and find | ||
if ( support.getById ) { | ||
Expr.filter.ID = function( id ) { | ||
var attrId = id.replace( runescape, funescape ); | ||
return function( elem ) { | ||
return elem.getAttribute( "id" ) === attrId; | ||
}; | ||
}; | ||
Expr.find.ID = function( id, context ) { | ||
if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { | ||
var elem = context.getElementById( id ); | ||
return elem ? [ elem ] : []; | ||
} | ||
}; | ||
} else { | ||
Expr.filter.ID = function( id ) { | ||
var attrId = id.replace( runescape, funescape ); | ||
return function( elem ) { | ||
var node = typeof elem.getAttributeNode !== "undefined" && | ||
elem.getAttributeNode( "id" ); | ||
return node && node.value === attrId; | ||
}; | ||
}; | ||
// Support: IE 6 - 7 only | ||
// getElementById is not reliable as a find shortcut | ||
Expr.find.ID = function( id, context ) { | ||
if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { | ||
var node, i, elems, | ||
elem = context.getElementById( id ); | ||
if ( elem ) { | ||
// Verify the id attribute | ||
node = elem.getAttributeNode( "id" ); | ||
if ( node && node.value === id ) { | ||
return [ elem ]; | ||
} | ||
// Fall back on getElementsByName | ||
elems = context.getElementsByName( id ); | ||
i = 0; | ||
while ( ( elem = elems[ i++ ] ) ) { | ||
node = elem.getAttributeNode( "id" ); | ||
if ( node && node.value === id ) { | ||
return [ elem ]; | ||
} | ||
} | ||
} | ||
return []; | ||
} | ||
}; | ||
} | ||
// Tag | ||
Expr.find.TAG = function( tag, context ) { | ||
if ( typeof context.getElementsByTagName !== "undefined" ) { | ||
return context.getElementsByTagName( tag ); | ||
// DocumentFragment nodes don't have gEBTN | ||
} else { | ||
return context.querySelectorAll( tag ); | ||
} | ||
}; | ||
// Class | ||
Expr.find.CLASS = function( className, context ) { | ||
if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { | ||
return context.getElementsByClassName( className ); | ||
} | ||
}; | ||
/* QSA/matchesSelector | ||
---------------------------------------------------------------------- */ | ||
// QSA and matchesSelector support | ||
rbuggyQSA = []; | ||
// Build QSA regex | ||
// Regex strategy adopted from Diego Perini | ||
assert( function( el ) { | ||
var input; | ||
documentElement.appendChild( el ).innerHTML = | ||
"<a id='" + expando + "' href='' disabled='disabled'></a>" + | ||
"<select id='" + expando + "-\r\\' disabled='disabled'>" + | ||
"<option selected=''></option></select>"; | ||
// Support: iOS <=7 - 8 only | ||
// Boolean attributes and "value" are not treated correctly in some XML documents | ||
if ( !el.querySelectorAll( "[selected]" ).length ) { | ||
rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); | ||
} | ||
// Support: iOS <=7 - 8 only | ||
if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { | ||
rbuggyQSA.push( "~=" ); | ||
} | ||
// Support: iOS 8 only | ||
// https://bugs.webkit.org/show_bug.cgi?id=136851 | ||
// In-page `selector#id sibling-combinator selector` fails | ||
if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { | ||
rbuggyQSA.push( ".#.+[+~]" ); | ||
} | ||
// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ | ||
// In some of the document kinds, these selectors wouldn't work natively. | ||
// This is probably OK but for backwards compatibility we want to maintain | ||
// handling them through jQuery traversal in jQuery 3.x. | ||
if ( !el.querySelectorAll( ":checked" ).length ) { | ||
rbuggyQSA.push( ":checked" ); | ||
} | ||
// Support: Windows 8 Native Apps | ||
// The type and name attributes are restricted during .innerHTML assignment | ||
input = document.createElement( "input" ); | ||
input.setAttribute( "type", "hidden" ); | ||
el.appendChild( input ).setAttribute( "name", "D" ); | ||
// Support: IE 9 - 11+ | ||
// IE's :disabled selector does not pick up the children of disabled fieldsets | ||
// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ | ||
// In some of the document kinds, these selectors wouldn't work natively. | ||
// This is probably OK but for backwards compatibility we want to maintain | ||
// handling them through jQuery traversal in jQuery 3.x. | ||
documentElement.appendChild( el ).disabled = true; | ||
if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { | ||
rbuggyQSA.push( ":enabled", ":disabled" ); | ||
} | ||
// Support: IE 11+, Edge 15 - 18+ | ||
// IE 11/Edge don't find elements on a `[name='']` query in some cases. | ||
// Adding a temporary attribute to the document before the selection works | ||
// around the issue. | ||
// Interestingly, IE 10 & older don't seem to have the issue. | ||
input = document.createElement( "input" ); | ||
input.setAttribute( "name", "" ); | ||
el.appendChild( input ); | ||
if ( !el.querySelectorAll( "[name='']" ).length ) { | ||
rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + | ||
whitespace + "*(?:''|\"\")" ); | ||
} | ||
} ); | ||
if ( !support.cssHas ) { | ||
// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ | ||
// Our regular `try-catch` mechanism fails to detect natively-unsupported | ||
// pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) | ||
// in browsers that parse the `:has()` argument as a forgiving selector list. | ||
// https://drafts.csswg.org/selectors/#relational now requires the argument | ||
// to be parsed unforgivingly, but browsers have not yet fully adjusted. | ||
rbuggyQSA.push( ":has" ); | ||
} | ||
rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); | ||
/* Sorting | ||
---------------------------------------------------------------------- */ | ||
// Document order sorting | ||
sortOrder = function( 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 | ||
// Support: IE 11+, Edge 17 - 18+ | ||
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing | ||
// two documents; shallow comparisons work. | ||
// eslint-disable-next-line eqeqeq | ||
compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? | ||
a.compareDocumentPosition( b ) : | ||
// Otherwise we know they are disconnected | ||
1; | ||
// Disconnected nodes | ||
if ( compare & 1 || | ||
( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { | ||
// Choose the first element that is related to our preferred document | ||
// Support: IE 11+, Edge 17 - 18+ | ||
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing | ||
// two documents; shallow comparisons work. | ||
// eslint-disable-next-line eqeqeq | ||
if ( a === document || a.ownerDocument == preferredDoc && | ||
find.contains( preferredDoc, a ) ) { | ||
return -1; | ||
} | ||
// Support: IE 11+, Edge 17 - 18+ | ||
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing | ||
// two documents; shallow comparisons work. | ||
// eslint-disable-next-line eqeqeq | ||
if ( b === document || b.ownerDocument == preferredDoc && | ||
find.contains( preferredDoc, b ) ) { | ||
return 1; | ||
} | ||
// Maintain original order | ||
return sortInput ? | ||
( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : | ||
0; | ||
} | ||
return compare & 4 ? -1 : 1; | ||
}; | ||
return document; | ||
} | ||
find.matches = function( expr, elements ) { | ||
return find( expr, null, null, elements ); | ||
}; | ||
find.matchesSelector = function( elem, expr ) { | ||
setDocument( elem ); | ||
if ( documentIsHTML && | ||
!nonnativeSelectorCache[ expr + " " ] && | ||
( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { | ||
try { | ||
var ret = matches.call( elem, expr ); | ||
// IE 9's matchesSelector returns false on disconnected nodes | ||
if ( ret || support.disconnectedMatch || | ||
// As well, disconnected nodes are said to be in a document | ||
// fragment in IE 9 | ||
elem.document && elem.document.nodeType !== 11 ) { | ||
return ret; | ||
} | ||
} catch ( e ) { | ||
nonnativeSelectorCache( expr, true ); | ||
} | ||
} | ||
return find( expr, document, null, [ elem ] ).length > 0; | ||
}; | ||
find.contains = function( context, elem ) { | ||
// Set document vars if needed | ||
// Support: IE 11+, Edge 17 - 18+ | ||
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing | ||
// two documents; shallow comparisons work. | ||
// eslint-disable-next-line eqeqeq | ||
if ( ( context.ownerDocument || context ) != document ) { | ||
setDocument( context ); | ||
} | ||
return jQuery.contains( context, elem ); | ||
}; | ||
find.attr = function( elem, name ) { | ||
// Set document vars if needed | ||
// Support: IE 11+, Edge 17 - 18+ | ||
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing | ||
// two documents; shallow comparisons work. | ||
// eslint-disable-next-line eqeqeq | ||
if ( ( elem.ownerDocument || elem ) != document ) { | ||
setDocument( elem ); | ||
} | ||
var fn = Expr.attrHandle[ name.toLowerCase() ], | ||
// Don't get fooled by Object.prototype properties (see trac-13807) | ||
val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? | ||
fn( elem, name, !documentIsHTML ) : | ||
undefined; | ||
if ( val !== undefined ) { | ||
return val; | ||
} | ||
return elem.getAttribute( name ); | ||
}; | ||
find.error = function( msg ) { | ||
throw new Error( "Syntax error, unrecognized expression: " + msg ); | ||
}; | ||
/** | ||
* Document sorting and removing duplicates | ||
* @param {ArrayLike} results | ||
*/ | ||
jQuery.uniqueSort = function( results ) { | ||
var elem, | ||
duplicates = [], | ||
j = 0, | ||
i = 0; | ||
// Unless we *know* we can detect duplicates, assume their presence | ||
// | ||
// Support: Android <=4.0+ | ||
// Testing for detecting duplicates is unpredictable so instead assume we can't | ||
// depend on duplicate detection in all browsers without a stable sort. | ||
hasDuplicate = !support.sortStable; | ||
sortInput = !support.sortStable && slice.call( results, 0 ); | ||
sort.call( results, sortOrder ); | ||
if ( hasDuplicate ) { | ||
while ( ( elem = results[ i++ ] ) ) { | ||
if ( elem === results[ i ] ) { | ||
j = duplicates.push( i ); | ||
} | ||
} | ||
while ( j-- ) { | ||
splice.call( results, duplicates[ j ], 1 ); | ||
} | ||
} | ||
// Clear input after sorting to release objects | ||
// See https://github.com/jquery/sizzle/pull/225 | ||
sortInput = null; | ||
return results; | ||
}; | ||
jQuery.fn.uniqueSort = function() { | ||
return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); | ||
}; | ||
Expr = jQuery.expr = { | ||
// Can be adjusted by the user | ||
cacheLength: 50, | ||
createPseudo: markFunction, | ||
match: matchExpr, | ||
attrHandle: {}, | ||
find: {}, | ||
relative: { | ||
">": { dir: "parentNode", first: true }, | ||
" ": { dir: "parentNode" }, | ||
"+": { dir: "previousSibling", first: true }, | ||
"~": { dir: "previousSibling" } | ||
}, | ||
preFilter: { | ||
ATTR: function( match ) { | ||
match[ 1 ] = match[ 1 ].replace( runescape, funescape ); | ||
// Move the given value to match[3] whether quoted or unquoted | ||
match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ) | ||
.replace( runescape, funescape ); | ||
if ( match[ 2 ] === "~=" ) { | ||
match[ 3 ] = " " + match[ 3 ] + " "; | ||
} | ||
return match.slice( 0, 4 ); | ||
}, | ||
CHILD: function( match ) { | ||
/* matches from matchExpr["CHILD"] | ||
1 type (only|nth|...) | ||
2 what (child|of-type) | ||
3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) | ||
4 xn-component of xn+y argument ([+-]?\d*n|) | ||
5 sign of xn-component | ||
6 x of xn-component | ||
7 sign of y-component | ||
8 y of y-component | ||
*/ | ||
match[ 1 ] = match[ 1 ].toLowerCase(); | ||
if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { | ||
// nth-* requires argument | ||
if ( !match[ 3 ] ) { | ||
find.error( match[ 0 ] ); | ||
} | ||
// numeric x and y parameters for Expr.filter.CHILD | ||
// remember that false/true cast respectively to 0/1 | ||
match[ 4 ] = +( match[ 4 ] ? | ||
match[ 5 ] + ( match[ 6 ] || 1 ) : | ||
2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) | ||
); | ||
match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); | ||
// other types prohibit arguments | ||
} else if ( match[ 3 ] ) { | ||
find.error( match[ 0 ] ); | ||
} | ||
return match; | ||
}, | ||
PSEUDO: function( match ) { | ||
var excess, | ||
unquoted = !match[ 6 ] && match[ 2 ]; | ||
if ( matchExpr.CHILD.test( match[ 0 ] ) ) { | ||
return null; | ||
} | ||
// Accept quoted arguments as-is | ||
if ( match[ 3 ] ) { | ||
match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; | ||
// Strip excess characters from unquoted arguments | ||
} else if ( unquoted && rpseudo.test( unquoted ) && | ||
// Get excess from tokenize (recursively) | ||
( excess = tokenize( unquoted, true ) ) && | ||
// advance to the next closing parenthesis | ||
( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { | ||
// excess is a negative index | ||
match[ 0 ] = match[ 0 ].slice( 0, excess ); | ||
match[ 2 ] = unquoted.slice( 0, excess ); | ||
} | ||
// Return only captures needed by the pseudo filter method (type and argument) | ||
return match.slice( 0, 3 ); | ||
} | ||
}, | ||
filter: { | ||
TAG: function( nodeNameSelector ) { | ||
var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); | ||
return nodeNameSelector === "*" ? | ||
function() { | ||
return true; | ||
} : | ||
function( elem ) { | ||
return nodeName( elem, expectedNodeName ); | ||
}; | ||
}, | ||
CLASS: function( className ) { | ||
var pattern = classCache[ className + " " ]; | ||
return pattern || | ||
( pattern = new RegExp( "(^|" + whitespace + ")" + className + | ||
"(" + whitespace + "|$)" ) ) && | ||
classCache( className, function( elem ) { | ||
return pattern.test( | ||
typeof elem.className === "string" && elem.className || | ||
typeof elem.getAttribute !== "undefined" && | ||
elem.getAttribute( "class" ) || | ||
"" | ||
); | ||
} ); | ||
}, | ||
ATTR: function( name, operator, check ) { | ||
return function( elem ) { | ||
var result = find.attr( elem, name ); | ||
if ( result == null ) { | ||
return operator === "!="; | ||
} | ||
if ( !operator ) { | ||
return true; | ||
} | ||
result += ""; | ||
if ( operator === "=" ) { | ||
return result === check; | ||
} | ||
if ( operator === "!=" ) { | ||
return result !== check; | ||
} | ||
if ( operator === "^=" ) { | ||
return check && result.indexOf( check ) === 0; | ||
} | ||
if ( operator === "*=" ) { | ||
return check && result.indexOf( check ) > -1; | ||
} | ||
if ( operator === "$=" ) { | ||
return check && result.slice( -check.length ) === check; | ||
} | ||
if ( operator === "~=" ) { | ||
return ( " " + result.replace( rwhitespace, " " ) + " " ) | ||
.indexOf( check ) > -1; | ||
} | ||
if ( operator === "|=" ) { | ||
return result === check || result.slice( 0, check.length + 1 ) === check + "-"; | ||
} | ||
return false; | ||
}; | ||
}, | ||
CHILD: function( type, what, _argument, first, last ) { | ||
var simple = type.slice( 0, 3 ) !== "nth", | ||
forward = type.slice( -4 ) !== "last", | ||
ofType = what === "of-type"; | ||
return first === 1 && last === 0 ? | ||
// Shortcut for :nth-*(n) | ||
function( elem ) { | ||
return !!elem.parentNode; | ||
} : | ||
function( elem, _context, xml ) { | ||
var cache, outerCache, node, nodeIndex, start, | ||
dir = simple !== forward ? "nextSibling" : "previousSibling", | ||
parent = elem.parentNode, | ||
name = ofType && elem.nodeName.toLowerCase(), | ||
useCache = !xml && !ofType, | ||
diff = false; | ||
if ( parent ) { | ||
// :(first|last|only)-(child|of-type) | ||
if ( simple ) { | ||
while ( dir ) { | ||
node = elem; | ||
while ( ( node = node[ dir ] ) ) { | ||
if ( ofType ? | ||
nodeName( node, name ) : | ||
node.nodeType === 1 ) { | ||
return false; | ||
} | ||
} | ||
// Reverse direction for :only-* (if we haven't yet done so) | ||
start = dir = type === "only" && !start && "nextSibling"; | ||
} | ||
return true; | ||
} | ||
start = [ forward ? parent.firstChild : parent.lastChild ]; | ||
// non-xml :nth-child(...) stores cache data on `parent` | ||
if ( forward && useCache ) { | ||
// Seek `elem` from a previously-cached index | ||
outerCache = parent[ expando ] || ( parent[ expando ] = {} ); | ||
cache = outerCache[ type ] || []; | ||
nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; | ||
diff = nodeIndex && cache[ 2 ]; | ||
node = nodeIndex && parent.childNodes[ nodeIndex ]; | ||
while ( ( node = ++nodeIndex && node && node[ dir ] || | ||
// Fallback to seeking `elem` from the start | ||
( diff = nodeIndex = 0 ) || start.pop() ) ) { | ||
// When found, cache indexes on `parent` and break | ||
if ( node.nodeType === 1 && ++diff && node === elem ) { | ||
outerCache[ type ] = [ dirruns, nodeIndex, diff ]; | ||
break; | ||
} | ||
} | ||
} else { | ||
// Use previously-cached element index if available | ||
if ( useCache ) { | ||
outerCache = elem[ expando ] || ( elem[ expando ] = {} ); | ||
cache = outerCache[ type ] || []; | ||
nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; | ||
diff = nodeIndex; | ||
} | ||
// xml :nth-child(...) | ||
// or :nth-last-child(...) or :nth(-last)?-of-type(...) | ||
if ( diff === false ) { | ||
// Use the same loop as above to seek `elem` from the start | ||
while ( ( node = ++nodeIndex && node && node[ dir ] || | ||
( diff = nodeIndex = 0 ) || start.pop() ) ) { | ||
if ( ( ofType ? | ||
nodeName( node, name ) : | ||
node.nodeType === 1 ) && | ||
++diff ) { | ||
// Cache the index of each encountered element | ||
if ( useCache ) { | ||
outerCache = node[ expando ] || | ||
( node[ expando ] = {} ); | ||
outerCache[ type ] = [ dirruns, diff ]; | ||
} | ||
if ( node === elem ) { | ||
break; | ||
} | ||
} | ||
} | ||
} | ||
} | ||
// Incorporate the offset, then check against cycle size | ||
diff -= last; | ||
return diff === first || ( diff % first === 0 && diff / first >= 0 ); | ||
} | ||
}; | ||
}, | ||
PSEUDO: function( pseudo, argument ) { | ||
// pseudo-class names are case-insensitive | ||
// https://www.w3.org/TR/selectors/#pseudo-classes | ||
// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters | ||
// Remember that setFilters inherits from pseudos | ||
var args, | ||
fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || | ||
find.error( "unsupported pseudo: " + pseudo ); | ||
// The user may use createPseudo to indicate that | ||
// arguments are needed to create the filter function | ||
// just as jQuery does | ||
if ( fn[ expando ] ) { | ||
return fn( argument ); | ||
} | ||
// But maintain support for old signatures | ||
if ( fn.length > 1 ) { | ||
args = [ pseudo, pseudo, "", argument ]; | ||
return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? | ||
markFunction( function( seed, matches ) { | ||
var idx, | ||
matched = fn( seed, argument ), | ||
i = matched.length; | ||
while ( i-- ) { | ||
idx = indexOf.call( seed, matched[ i ] ); | ||
seed[ idx ] = !( matches[ idx ] = matched[ i ] ); | ||
} | ||
} ) : | ||
function( elem ) { | ||
return fn( elem, 0, args ); | ||
}; | ||
} | ||
return fn; | ||
} | ||
}, | ||
pseudos: { | ||
// Potentially complex pseudos | ||
not: markFunction( function( selector ) { | ||
// Trim the selector passed to compile | ||
// to avoid treating leading and trailing | ||
// spaces as combinators | ||
var input = [], | ||
results = [], | ||
matcher = compile( selector.replace( rtrimCSS, "$1" ) ); | ||
return matcher[ expando ] ? | ||
markFunction( function( seed, matches, _context, xml ) { | ||
var elem, | ||
unmatched = matcher( seed, null, xml, [] ), | ||
i = seed.length; | ||
// Match elements unmatched by `matcher` | ||
while ( i-- ) { | ||
if ( ( elem = unmatched[ i ] ) ) { | ||
seed[ i ] = !( matches[ i ] = elem ); | ||
} | ||
} | ||
} ) : | ||
function( elem, _context, xml ) { | ||
input[ 0 ] = elem; | ||
matcher( input, null, xml, results ); | ||
// Don't keep the element | ||
// (see https://github.com/jquery/sizzle/issues/299) | ||
input[ 0 ] = null; | ||
return !results.pop(); | ||
}; | ||
} ), | ||
has: markFunction( function( selector ) { | ||
return function( elem ) { | ||
return find( selector, elem ).length > 0; | ||
}; | ||
} ), | ||
contains: markFunction( function( text ) { | ||
text = text.replace( runescape, funescape ); | ||
return function( elem ) { | ||
return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; | ||
}; | ||
} ), | ||
// "Whether an element is represented by a :lang() selector | ||
// is based solely on the element's language value | ||
// being equal to the identifier C, | ||
// or beginning with the identifier C immediately followed by "-". | ||
// The matching of C against the element's language value is performed case-insensitively. | ||
// The identifier C does not have to be a valid language name." | ||
// https://www.w3.org/TR/selectors/#lang-pseudo | ||
lang: markFunction( function( lang ) { | ||
// lang value must be a valid identifier | ||
if ( !ridentifier.test( lang || "" ) ) { | ||
find.error( "unsupported lang: " + lang ); | ||
} | ||
lang = lang.replace( runescape, funescape ).toLowerCase(); | ||
return function( elem ) { | ||
var elemLang; | ||
do { | ||
if ( ( elemLang = documentIsHTML ? | ||
elem.lang : | ||
elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { | ||
elemLang = elemLang.toLowerCase(); | ||
return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; | ||
} | ||
} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); | ||
return false; | ||
}; | ||
} ), | ||
// Miscellaneous | ||
target: function( elem ) { | ||
var hash = window.location && window.location.hash; | ||
return hash && hash.slice( 1 ) === elem.id; | ||
}, | ||
root: function( elem ) { | ||
return elem === documentElement; | ||
}, | ||
focus: function( elem ) { | ||
return elem === safeActiveElement() && | ||
document.hasFocus() && | ||
!!( elem.type || elem.href || ~elem.tabIndex ); | ||
}, | ||
// Boolean properties | ||
enabled: createDisabledPseudo( false ), | ||
disabled: createDisabledPseudo( true ), | ||
checked: function( elem ) { | ||
// In CSS3, :checked should return both checked and selected elements | ||
// https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked | ||
return ( nodeName( elem, "input" ) && !!elem.checked ) || | ||
( nodeName( elem, "option" ) && !!elem.selected ); | ||
}, | ||
selected: function( elem ) { | ||
// Support: IE <=11+ | ||
// Accessing the selectedIndex property | ||
// forces the browser to treat the default option as | ||
// selected when in an optgroup. | ||
if ( elem.parentNode ) { | ||
// eslint-disable-next-line no-unused-expressions | ||
elem.parentNode.selectedIndex; | ||
} | ||
return elem.selected === true; | ||
}, | ||
// Contents | ||
empty: function( elem ) { | ||
// https://www.w3.org/TR/selectors/#empty-pseudo | ||
// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), | ||
// but not by others (comment: 8; processing instruction: 7; etc.) | ||
// nodeType < 6 works because attributes (2) do not appear as children | ||
for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { | ||
if ( elem.nodeType < 6 ) { | ||
return false; | ||
} | ||
} | ||
return true; | ||
}, | ||
parent: function( elem ) { | ||
return !Expr.pseudos.empty( elem ); | ||
}, | ||
// Element/input types | ||
header: function( elem ) { | ||
return rheader.test( elem.nodeName ); | ||
}, | ||
input: function( elem ) { | ||
return rinputs.test( elem.nodeName ); | ||
}, | ||
button: function( elem ) { | ||
return nodeName( elem, "input" ) && elem.type === "button" || | ||
nodeName( elem, "button" ); | ||
}, | ||
text: function( elem ) { | ||
var attr; | ||
return nodeName( elem, "input" ) && elem.type === "text" && | ||
// Support: IE <10 only | ||
// New HTML5 attribute values (e.g., "search") appear | ||
// with elem.type === "text" | ||
( ( attr = elem.getAttribute( "type" ) ) == null || | ||
attr.toLowerCase() === "text" ); | ||
}, | ||
// Position-in-collection | ||
first: createPositionalPseudo( function() { | ||
return [ 0 ]; | ||
} ), | ||
last: createPositionalPseudo( function( _matchIndexes, length ) { | ||
return [ length - 1 ]; | ||
} ), | ||
eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { | ||
return [ argument < 0 ? argument + length : argument ]; | ||
} ), | ||
even: createPositionalPseudo( function( matchIndexes, length ) { | ||
var i = 0; | ||
for ( ; i < length; i += 2 ) { | ||
matchIndexes.push( i ); | ||
} | ||
return matchIndexes; | ||
} ), | ||
odd: createPositionalPseudo( function( matchIndexes, length ) { | ||
var i = 1; | ||
for ( ; i < length; i += 2 ) { | ||
matchIndexes.push( i ); | ||
} | ||
return matchIndexes; | ||
} ), | ||
lt: createPositionalPseudo( function( matchIndexes, length, argument ) { | ||
var i; | ||
if ( argument < 0 ) { | ||
i = argument + length; | ||
} else if ( argument > length ) { | ||
i = length; | ||
} else { | ||
i = argument; | ||
} | ||
for ( ; --i >= 0; ) { | ||
matchIndexes.push( i ); | ||
} | ||
return matchIndexes; | ||
} ), | ||
gt: createPositionalPseudo( function( matchIndexes, length, argument ) { | ||
var i = argument < 0 ? argument + length : argument; | ||
for ( ; ++i < length; ) { | ||
matchIndexes.push( i ); | ||
} | ||
return matchIndexes; | ||
} ) | ||
} | ||
}; | ||
Expr.pseudos.nth = Expr.pseudos.eq; | ||
// Add button/input type pseudos | ||
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { | ||
Expr.pseudos[ i ] = createInputPseudo( i ); | ||
} | ||
for ( i in { submit: true, reset: true } ) { | ||
Expr.pseudos[ i ] = createButtonPseudo( i ); | ||
} | ||
// Easy API for creating new setFilters | ||
function setFilters() {} | ||
setFilters.prototype = Expr.filters = Expr.pseudos; | ||
Expr.setFilters = new setFilters(); | ||
function tokenize( selector, parseOnly ) { | ||
var matched, match, tokens, type, | ||
soFar, groups, preFilters, | ||
cached = tokenCache[ selector + " " ]; | ||
if ( cached ) { | ||
return parseOnly ? 0 : cached.slice( 0 ); | ||
} | ||
soFar = selector; | ||
groups = []; | ||
preFilters = Expr.preFilter; | ||
while ( soFar ) { | ||
// Comma and first run | ||
if ( !matched || ( match = rcomma.exec( soFar ) ) ) { | ||
if ( match ) { | ||
// Don't consume trailing commas as valid | ||
soFar = soFar.slice( match[ 0 ].length ) || soFar; | ||
} | ||
groups.push( ( tokens = [] ) ); | ||
} | ||
matched = false; | ||
// Combinators | ||
if ( ( match = rleadingCombinator.exec( soFar ) ) ) { | ||
matched = match.shift(); | ||
tokens.push( { | ||
value: matched, | ||
// Cast descendant combinators to space | ||
type: match[ 0 ].replace( rtrimCSS, " " ) | ||
} ); | ||
soFar = soFar.slice( matched.length ); | ||
} | ||
// Filters | ||
for ( type in Expr.filter ) { | ||
if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || | ||
( match = preFilters[ type ]( match ) ) ) ) { | ||
matched = match.shift(); | ||
tokens.push( { | ||
value: matched, | ||
type: type, | ||
matches: match | ||
} ); | ||
soFar = soFar.slice( matched.length ); | ||
} | ||
} | ||
if ( !matched ) { | ||
break; | ||
} | ||
} | ||
// Return the length of the invalid excess | ||
// if we're just parsing | ||
// Otherwise, throw an error or return tokens | ||
if ( parseOnly ) { | ||
return soFar.length; | ||
} | ||
return soFar ? | ||
find.error( selector ) : | ||
// Cache the tokens | ||
tokenCache( selector, groups ).slice( 0 ); | ||
} | ||
function toSelector( tokens ) { | ||
var i = 0, | ||
len = tokens.length, | ||
selector = ""; | ||
for ( ; i < len; i++ ) { | ||
selector += tokens[ i ].value; | ||
} | ||
return selector; | ||
} | ||
function addCombinator( matcher, combinator, base ) { | ||
var dir = combinator.dir, | ||
skip = combinator.next, | ||
key = skip || dir, | ||
checkNonElements = base && key === "parentNode", | ||
doneName = done++; | ||
return combinator.first ? | ||
// Check against closest ancestor/preceding element | ||
function( elem, context, xml ) { | ||
while ( ( elem = elem[ dir ] ) ) { | ||
if ( elem.nodeType === 1 || checkNonElements ) { | ||
return matcher( elem, context, xml ); | ||
} | ||
} | ||
return false; | ||
} : | ||
// Check against all ancestor/preceding elements | ||
function( elem, context, xml ) { | ||
var oldCache, outerCache, | ||
newCache = [ dirruns, doneName ]; | ||
// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching | ||
if ( xml ) { | ||
while ( ( elem = elem[ dir ] ) ) { | ||
if ( elem.nodeType === 1 || checkNonElements ) { | ||
if ( matcher( elem, context, xml ) ) { | ||
return true; | ||
} | ||
} | ||
} | ||
} else { | ||
while ( ( elem = elem[ dir ] ) ) { | ||
if ( elem.nodeType === 1 || checkNonElements ) { | ||
outerCache = elem[ expando ] || ( elem[ expando ] = {} ); | ||
if ( skip && nodeName( elem, skip ) ) { | ||
elem = elem[ dir ] || elem; | ||
} else if ( ( oldCache = outerCache[ key ] ) && | ||
oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { | ||
// Assign to newCache so results back-propagate to previous elements | ||
return ( newCache[ 2 ] = oldCache[ 2 ] ); | ||
} else { | ||
// Reuse newcache so results back-propagate to previous elements | ||
outerCache[ key ] = newCache; | ||
// A match means we're done; a fail means we have to keep checking | ||
if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { | ||
return true; | ||
} | ||
} | ||
} | ||
} | ||
} | ||
return false; | ||
}; | ||
} | ||
function elementMatcher( matchers ) { | ||
return matchers.length > 1 ? | ||
function( elem, context, xml ) { | ||
var i = matchers.length; | ||
while ( i-- ) { | ||
if ( !matchers[ i ]( elem, context, xml ) ) { | ||
return false; | ||
} | ||
} | ||
return true; | ||
} : | ||
matchers[ 0 ]; | ||
} | ||
function multipleContexts( selector, contexts, results ) { | ||
var i = 0, | ||
len = contexts.length; | ||
for ( ; i < len; i++ ) { | ||
find( selector, contexts[ i ], results ); | ||
} | ||
return results; | ||
} | ||
function condense( unmatched, map, filter, context, xml ) { | ||
var elem, | ||
newUnmatched = [], | ||
i = 0, | ||
len = unmatched.length, | ||
mapped = map != null; | ||
for ( ; i < len; i++ ) { | ||
if ( ( elem = unmatched[ i ] ) ) { | ||
if ( !filter || filter( elem, context, xml ) ) { | ||
newUnmatched.push( elem ); | ||
if ( mapped ) { | ||
map.push( i ); | ||
} | ||
} | ||
} | ||
} | ||
return newUnmatched; | ||
} | ||
function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { | ||
if ( postFilter && !postFilter[ expando ] ) { | ||
postFilter = setMatcher( postFilter ); | ||
} | ||
if ( postFinder && !postFinder[ expando ] ) { | ||
postFinder = setMatcher( postFinder, postSelector ); | ||
} | ||
return markFunction( function( seed, results, context, xml ) { | ||
var temp, i, elem, matcherOut, | ||
preMap = [], | ||
postMap = [], | ||
preexisting = results.length, | ||
// Get initial elements from seed or context | ||
elems = seed || | ||
multipleContexts( selector || "*", | ||
context.nodeType ? [ context ] : context, [] ), | ||
// Prefilter to get matcher input, preserving a map for seed-results synchronization | ||
matcherIn = preFilter && ( seed || !selector ) ? | ||
condense( elems, preMap, preFilter, context, xml ) : | ||
elems; | ||
if ( matcher ) { | ||
// If we have a postFinder, or filtered seed, or non-seed postFilter | ||
// or preexisting results, | ||
matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? | ||
// ...intermediate processing is necessary | ||
[] : | ||
// ...otherwise use results directly | ||
results; | ||
// Find primary matches | ||
matcher( matcherIn, matcherOut, context, xml ); | ||
} else { | ||
matcherOut = matcherIn; | ||
} | ||
// Apply postFilter | ||
if ( postFilter ) { | ||
temp = condense( matcherOut, postMap ); | ||
postFilter( temp, [], context, xml ); | ||
// Un-match failing elements by moving them back to matcherIn | ||
i = temp.length; | ||
while ( i-- ) { | ||
if ( ( elem = temp[ i ] ) ) { | ||
matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); | ||
} | ||
} | ||
} | ||
if ( seed ) { | ||
if ( postFinder || preFilter ) { | ||
if ( postFinder ) { | ||
// Get the final matcherOut by condensing this intermediate into postFinder contexts | ||
temp = []; | ||
i = matcherOut.length; | ||
while ( i-- ) { | ||
if ( ( elem = matcherOut[ i ] ) ) { | ||
// Restore matcherIn since elem is not yet a final match | ||
temp.push( ( matcherIn[ i ] = elem ) ); | ||
} | ||
} | ||
postFinder( null, ( matcherOut = [] ), temp, xml ); | ||
} | ||
// Move matched elements from seed to results to keep them synchronized | ||
i = matcherOut.length; | ||
while ( i-- ) { | ||
if ( ( elem = matcherOut[ i ] ) && | ||
( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { | ||
seed[ temp ] = !( results[ temp ] = elem ); | ||
} | ||
} | ||
} | ||
// Add elements to results, through postFinder if defined | ||
} else { | ||
matcherOut = condense( | ||
matcherOut === results ? | ||
matcherOut.splice( preexisting, matcherOut.length ) : | ||
matcherOut | ||
); | ||
if ( postFinder ) { | ||
postFinder( null, results, matcherOut, xml ); | ||
} else { | ||
push.apply( results, matcherOut ); | ||
} | ||
} | ||
} ); | ||
} | ||
function matcherFromTokens( tokens ) { | ||
var checkContext, matcher, j, | ||
len = tokens.length, | ||
leadingRelative = Expr.relative[ tokens[ 0 ].type ], | ||
implicitRelative = leadingRelative || Expr.relative[ " " ], | ||
i = leadingRelative ? 1 : 0, | ||
// The foundational matcher ensures that elements are reachable from top-level context(s) | ||
matchContext = addCombinator( function( elem ) { | ||
return elem === checkContext; | ||
}, implicitRelative, true ), | ||
matchAnyContext = addCombinator( function( elem ) { | ||
return indexOf.call( checkContext, elem ) > -1; | ||
}, implicitRelative, true ), | ||
matchers = [ function( elem, context, xml ) { | ||
// Support: IE 11+, Edge 17 - 18+ | ||
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing | ||
// two documents; shallow comparisons work. | ||
// eslint-disable-next-line eqeqeq | ||
var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( | ||
( checkContext = context ).nodeType ? | ||
matchContext( elem, context, xml ) : | ||
matchAnyContext( elem, context, xml ) ); | ||
// Avoid hanging onto element | ||
// (see https://github.com/jquery/sizzle/issues/299) | ||
checkContext = null; | ||
return ret; | ||
} ]; | ||
for ( ; i < len; i++ ) { | ||
if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { | ||
matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; | ||
} else { | ||
matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); | ||
// Return special upon seeing a positional matcher | ||
if ( matcher[ expando ] ) { | ||
// Find the next relative operator (if any) for proper handling | ||
j = ++i; | ||
for ( ; j < len; j++ ) { | ||
if ( Expr.relative[ tokens[ j ].type ] ) { | ||
break; | ||
} | ||
} | ||
return setMatcher( | ||
i > 1 && elementMatcher( matchers ), | ||
i > 1 && toSelector( | ||
// If the preceding token was a descendant combinator, insert an implicit any-element `*` | ||
tokens.slice( 0, i - 1 ) | ||
.concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) | ||
).replace( rtrimCSS, "$1" ), | ||
matcher, | ||
i < j && matcherFromTokens( tokens.slice( i, j ) ), | ||
j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), | ||
j < len && toSelector( tokens ) | ||
); | ||
} | ||
matchers.push( matcher ); | ||
} | ||
} | ||
return elementMatcher( matchers ); | ||
} | ||
function matcherFromGroupMatchers( elementMatchers, setMatchers ) { | ||
var bySet = setMatchers.length > 0, | ||
byElement = elementMatchers.length > 0, | ||
superMatcher = function( seed, context, xml, results, outermost ) { | ||
var elem, j, matcher, | ||
matchedCount = 0, | ||
i = "0", | ||
unmatched = seed && [], | ||
setMatched = [], | ||
contextBackup = outermostContext, | ||
// We must always have either seed elements or outermost context | ||
elems = seed || byElement && Expr.find.TAG( "*", outermost ), | ||
// Use integer dirruns iff this is the outermost matcher | ||
dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), | ||
len = elems.length; | ||
if ( outermost ) { | ||
// Support: IE 11+, Edge 17 - 18+ | ||
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing | ||
// two documents; shallow comparisons work. | ||
// eslint-disable-next-line eqeqeq | ||
outermostContext = context == document || context || outermost; | ||
} | ||
// Add elements passing elementMatchers directly to results | ||
// Support: iOS <=7 - 9 only | ||
// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching | ||
// elements by id. (see trac-14142) | ||
for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { | ||
if ( byElement && elem ) { | ||
j = 0; | ||
// Support: IE 11+, Edge 17 - 18+ | ||
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing | ||
// two documents; shallow comparisons work. | ||
// eslint-disable-next-line eqeqeq | ||
if ( !context && elem.ownerDocument != document ) { | ||
setDocument( elem ); | ||
xml = !documentIsHTML; | ||
} | ||
while ( ( matcher = elementMatchers[ j++ ] ) ) { | ||
if ( matcher( elem, context || document, xml ) ) { | ||
push.call( results, elem ); | ||
break; | ||
} | ||
} | ||
if ( outermost ) { | ||
dirruns = dirrunsUnique; | ||
} | ||
} | ||
// Track unmatched elements for set filters | ||
if ( bySet ) { | ||
// They will have gone through all possible matchers | ||
if ( ( elem = !matcher && elem ) ) { | ||
matchedCount--; | ||
} | ||
// Lengthen the array for every element, matched or not | ||
if ( seed ) { | ||
unmatched.push( elem ); | ||
} | ||
} | ||
} | ||
// `i` is now the count of elements visited above, and adding it to `matchedCount` | ||
// makes the latter nonnegative. | ||
matchedCount += i; | ||
// Apply set filters to unmatched elements | ||
// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` | ||
// equals `i`), unless we didn't visit _any_ elements in the above loop because we have | ||
// no element matchers and no seed. | ||
// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that | ||
// case, which will result in a "00" `matchedCount` that differs from `i` but is also | ||
// numerically zero. | ||
if ( bySet && i !== matchedCount ) { | ||
j = 0; | ||
while ( ( matcher = setMatchers[ j++ ] ) ) { | ||
matcher( unmatched, setMatched, context, xml ); | ||
} | ||
if ( seed ) { | ||
// Reintegrate element matches to eliminate the need for sorting | ||
if ( matchedCount > 0 ) { | ||
while ( i-- ) { | ||
if ( !( unmatched[ i ] || setMatched[ i ] ) ) { | ||
setMatched[ i ] = pop.call( results ); | ||
} | ||
} | ||
} | ||
// Discard index placeholder values to get only actual matches | ||
setMatched = condense( setMatched ); | ||
} | ||
// Add matches to results | ||
push.apply( results, setMatched ); | ||
// Seedless set matches succeeding multiple successful matchers stipulate sorting | ||
if ( outermost && !seed && setMatched.length > 0 && | ||
( matchedCount + setMatchers.length ) > 1 ) { | ||
jQuery.uniqueSort( results ); | ||
} | ||
} | ||
// Override manipulation of globals by nested matchers | ||
if ( outermost ) { | ||
dirruns = dirrunsUnique; | ||
outermostContext = contextBackup; | ||
} | ||
return unmatched; | ||
}; | ||
return bySet ? | ||
markFunction( superMatcher ) : | ||
superMatcher; | ||
} | ||
function compile( selector, match /* Internal Use Only */ ) { | ||
var i, | ||
setMatchers = [], | ||
elementMatchers = [], | ||
cached = compilerCache[ selector + " " ]; | ||
if ( !cached ) { | ||
// Generate a function of recursive functions that can be used to check each element | ||
if ( !match ) { | ||
match = tokenize( selector ); | ||
} | ||
i = match.length; | ||
while ( i-- ) { | ||
cached = matcherFromTokens( match[ i ] ); | ||
if ( cached[ expando ] ) { | ||
setMatchers.push( cached ); | ||
} else { | ||
elementMatchers.push( cached ); | ||
} | ||
} | ||
// Cache the compiled function | ||
cached = compilerCache( selector, | ||
matcherFromGroupMatchers( elementMatchers, setMatchers ) ); | ||
// Save selector and tokenization | ||
cached.selector = selector; | ||
} | ||
return cached; | ||
} | ||
/** | ||
* A low-level selection function that works with jQuery's compiled | ||
* selector functions | ||
* @param {String|Function} selector A selector or a pre-compiled | ||
* selector function built with jQuery selector compile | ||
* @param {Element} context | ||
* @param {Array} [results] | ||
* @param {Array} [seed] A set of elements to match against | ||
*/ | ||
function select( selector, context, results, seed ) { | ||
var i, tokens, token, type, find, | ||
compiled = typeof selector === "function" && selector, | ||
match = !seed && tokenize( ( selector = compiled.selector || selector ) ); | ||
results = results || []; | ||
// Try to minimize operations if there is only one selector in the list and no seed | ||
// (the latter of which guarantees us context) | ||
if ( match.length === 1 ) { | ||
// Reduce context if the leading compound selector is an ID | ||
tokens = match[ 0 ] = match[ 0 ].slice( 0 ); | ||
if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && | ||
context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { | ||
context = ( Expr.find.ID( | ||
token.matches[ 0 ].replace( runescape, funescape ), | ||
context | ||
) || [] )[ 0 ]; | ||
if ( !context ) { | ||
return results; | ||
// Precompiled matchers will still verify ancestry, so step up a level | ||
} else if ( compiled ) { | ||
context = context.parentNode; | ||
} | ||
selector = selector.slice( tokens.shift().value.length ); | ||
} | ||
// Fetch a seed set for right-to-left matching | ||
i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; | ||
while ( i-- ) { | ||
token = tokens[ i ]; | ||
// Abort if we hit a combinator | ||
if ( Expr.relative[ ( type = token.type ) ] ) { | ||
break; | ||
} | ||
if ( ( find = Expr.find[ type ] ) ) { | ||
// Search, expanding context for leading sibling combinators | ||
if ( ( seed = find( | ||
token.matches[ 0 ].replace( runescape, funescape ), | ||
rsibling.test( tokens[ 0 ].type ) && | ||
testContext( context.parentNode ) || context | ||
) ) ) { | ||
// If seed is empty or no tokens remain, we can return early | ||
tokens.splice( i, 1 ); | ||
selector = seed.length && toSelector( tokens ); | ||
if ( !selector ) { | ||
push.apply( results, seed ); | ||
return results; | ||
} | ||
break; | ||
} | ||
} | ||
} | ||
} | ||
// Compile and execute a filtering function if one is not provided | ||
// Provide `match` to avoid retokenization if we modified the selector above | ||
( compiled || compile( selector, match ) )( | ||
seed, | ||
context, | ||
!documentIsHTML, | ||
results, | ||
!context || rsibling.test( selector ) && testContext( context.parentNode ) || context | ||
); | ||
return results; | ||
} | ||
// One-time assignments | ||
// Support: Android <=4.0 - 4.1+ | ||
// Sort stability | ||
support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; | ||
// Initialize against the default document | ||
setDocument(); | ||
// Support: Android <=4.0 - 4.1+ | ||
// Detached nodes confoundingly follow *each other* | ||
support.sortDetached = assert( function( el ) { | ||
// Should return 1, but returns 4 (following) | ||
return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; | ||
} ); | ||
jQuery.find = find; | ||
// Deprecated | ||
jQuery.expr[ ":" ] = jQuery.expr.pseudos; | ||
jQuery.unique = jQuery.uniqueSort; | ||
// These have always been private, but they used to be documented | ||
// as part of Sizzle so let's maintain them in the 3.x line | ||
// for backwards compatibility purposes. | ||
find.compile = compile; | ||
find.select = select; | ||
find.setDocument = setDocument; | ||
find.escape = jQuery.escapeSelector; | ||
find.getText = jQuery.text; | ||
find.isXML = jQuery.isXMLDoc; | ||
find.selectors = jQuery.expr; | ||
find.support = jQuery.support; | ||
find.uniqueSort = jQuery.uniqueSort; | ||
/* eslint-enable */ | ||
} )(); | ||
} ); |
@@ -58,3 +58,3 @@ define( [ | ||
// Don't pass non-elements to Sizzle | ||
// Don't pass non-elements to jQuery#find | ||
cur.nodeType === 1 && | ||
@@ -61,0 +61,0 @@ jQuery.find.matchesSelector( cur, selectors ) ) ) { |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Unidentified License
License(Experimental) Something that seems like a license was found, but its contents could not be matched with a known license
Found 1 instance in 1 package
0
100
1245008
41
125
25922