Aller au contenu
jQuery 4.0.0 : la première major depuis près de 10 ans, et ce que ça change vraiment
Aminata Diallo
Aminata Diallo 19 January 2026 · 2 min de lecture

jQuery 4.0.0 : la première major depuis près de 10 ans, et ce que ça change vraiment

Le 14 janvier 2006, John Resig présentait jQuery au BarCamp de New York. Vingt ans plus tard, l’équipe jQuery publie la version finale jQuery 4.0.0 (annonce du 17 janvier 2026), après un cycle de développement long et plusieurs pré-releases. C’est la première version majeure depuis presque une décennie : il y a donc des breaking changes, mais l’équipe s’attend à ce que la plupart des projets puissent migrer avec peu d’ajustements.

L’idée générale de cette major est assez claire : enlever du code legacy, supprimer des APIs déjà dépréciées, nettoyer certains paramètres internes exposés « par accident » dans des fonctions publiques, et arrêter quelques comportements « magiques » devenus trop complexes à maintenir.

Pour accompagner la transition, deux outils sont mis en avant : le guide de migration https://jquery.com/upgrade-guide/4.0/ et la nouvelle release du plugin jQuery Migrate https://github.com/jquery/jquery-migrate/. Et si tu tombes sur un souci en upgrade, le canal recommandé reste les issues GitHub : https://github.com/jquery/jquery/issues.

Disponibilité : CDN officiel et npm (les CDN tiers suivront)

jQuery 4.0.0 est disponible sur le CDN officiel (et comme d’habitude aussi via npm). Les CDN tiers devraient se mettre à jour, mais leurs délais restent indépendants de l’équipe jQuery.

Fin du support IE<11 (IE11 visé en deux étapes)

Premier point visible : jQuery 4.0 supprime le support d’IE 10 et plus anciens. La question « pourquoi pas IE11 ? » revient souvent : l’équipe explique procéder par étapes, et annonce que la prochaine étape – la fin d’IE11 – est prévue pour jQuery 5.0 (voir le PR mentionné : https://github.com/jquery/jquery/pull/5077).

Dans la même logique, jQuery 4.0 arrête aussi le support d’autres navigateurs très anciens : Edge Legacy, les versions iOS plus anciennes que les 3 dernières, les versions Firefox plus anciennes que les 2 dernières (hors Firefox ESR), ainsi que Android Browser. L’annonce précise qu’aucun changement ne devrait être requis côté code ; mais si tu dois impérativement supporter ces navigateurs, il faut rester sur jQuery 3.x.

Trusted Types + CSP : jQuery se met au niveau des politiques modernes

jQuery 4.0 ajoute le support des Trusted Types (mécanisme de sécurité côté navigateur) pour que du HTML encapsulé en TrustedHTML (cf. MDN) puisse être fourni aux méthodes de manipulation jQuery sans violer la directive CSP require-trusted-types-for. Référence citée dans l’annonce : https://twitter.com/kkotowicz/status/1445713282128515074 et l’API TrustedHTML : https://developer.mozilla.org/en-US/docs/Web/API/TrustedHTML.

Dans la continuité « CSP-friendly », l’équipe rappelle qu’une partie des requêtes AJAX utilisait déjà des balises <script> pour conserver certains attributs comme crossdomain, mais que jQuery a ensuite basculé la plupart des chargements asynchrones de scripts vers des <script> tags afin d’éviter les erreurs CSP liées à l’exécution d’inline scripts. Le changement est tracé ici : https://github.com/jquery/jquery/pull/4763.

Il reste néanmoins quelques cas où un XHR est encore utilisé pour des requêtes asynchrones de scripts, notamment quand l’option "headers" est passée (l’annonce recommande d’utiliser scriptAttrs à la place). Mais, quand c’est possible, jQuery 4.0 privilégie désormais la balise <script>.

Le code source jQuery passe aux ES modules (adieu AMD côté source)

Changement structurel majeur : le code source de la branche main a migré de AMD (format historiquement associé à RequireJS) vers les ES modules (ESM). Références : AMD expliqué ici https://requirejs.org/docs/whyamd.html et PR de migration https://github.com/jquery/jquery/pull/4541.

Concrètement, jQuery publiait déjà ses sources sur npm et GitHub, mais elles n’étaient pas importables directement sous forme de modules sans RequireJS, qui servait aussi d’outil de build. Désormais, le packaging passe par Rollup (présentation : https://rollupjs.org/introduction/), et les tests sont exécutés spécifiquement sur les modules ESM. Le résultat : une compatibilité plus naturelle avec les toolchains modernes, et la possibilité de fonctionner via <script type=module>.

APIs dépréciées supprimées : ce qui disparaît en 4.0

jQuery 4.0 retire une série d’APIs dépréciées depuis plusieurs versions. Certaines étaient destinées à l’interne, d’autres ont aujourd’hui des équivalents natifs dans tous les navigateurs encore supportés. Liste des fonctions supprimées :

  • jQuery.isArray
  • jQuery.parseJSON
  • jQuery.trim
  • jQuery.type
  • jQuery.now
  • jQuery.isNumeric
  • jQuery.isFunction
  • jQuery.isWindow
  • jQuery.camelCase
  • jQuery.nodeName
  • jQuery.cssNumber
  • jQuery.cssProps
  • jQuery.fx.interval

L’équipe recommande d’utiliser les équivalents natifs tels que Array.isArray(), JSON.parse(), String.prototype.trim() et Date.now().

Un effet collatéral positif : la suppression de ces APIs, combinée à la suppression du code spécifique aux vieux IE, réduit la taille de jQuery de plus de 3 kB en gzip.

Nettoyage du prototype : push/sort/splice retirés

Autre breaking change : le prototype jQuery exposait depuis longtemps des méthodes de type Array qui ne se comportaient pas comme les méthodes jQuery, et qui étaient conçues pour un usage interne : push, sort et splice. Elles sont désormais supprimées du prototype jQuery.

Si tu les utilisais directement (ex. $elems.push(elem)), l’équivalent donné est d’appeler les méthodes natives d’Array en forçant le this :

// Avant (à éviter en jQuery 4.0)
// $elems.push( elem )

// Après
[].push.call( $elems, elem );

Événements focus/blur : l’ordre suit désormais la spec W3C

Pendant longtemps, les navigateurs n’étaient pas d’accord sur l’ordre des événements de focus et blur (focusin, focusout, focus, blur). Les versions modernes des navigateurs supportés par jQuery 4.0 convergent maintenant vers un ordre commun… qui n’est pas celui que jQuery avait rendu « stable » historiquement. C’est donc un breaking change.

À partir de jQuery 4.0, jQuery n’override plus le comportement natif. Résultat : tous les navigateurs sauf IE suivent la spec W3C actuelle, dans cet ordre :

  1. blur
  2. focusout
  3. focus
  4. focusin

À titre de comparaison, l’ordre utilisé par jQuery dans les versions précédentes était : focusout, blur, focusin, focus. Détail intéressant noté dans l’annonce : le seul navigateur à suivre l’ancienne spec W3C (avant la mise à jour de 2023) était Internet Explorer.

Slim build : encore plus léger, sans Deferreds ni Callbacks

Le build slim rétrécit encore en jQuery 4.0.0, notamment avec la suppression de Deferreds et Callbacks (environ 19,5 kB gzip selon l’annonce). Les Deferreds supportaient depuis longtemps la spec Promises/A+ (https://promisesaplus.com/), donc dans beaucoup de cas tu peux migrer vers les Promises natives.

Attention au détail important : les Promises natives sont disponibles dans tous les navigateurs supportés par jQuery… sauf IE11. Si tu dois supporter IE11, l’annonce recommande soit d’utiliser le build principal (non-slim), soit d’ajouter un polyfill de Promises natives.

L’équipe rappelle aussi la philosophie du slim : parfois tu n’as pas besoin d’AJAX, ou tu préfères une lib dédiée ; parfois les animations se font plus simplement via CSS + classes ; et comme la performance de chargement n’est plus aussi souvent une contrainte critique aujourd’hui, le slim reste surtout un choix d’assemblage. Il reste néanmoins environ 8 kB gzip plus petit que le build complet.

Téléchargement : liens directs et installation npm

Les fichiers sont disponibles via le CDN jQuery, avec des liens directs :

  • https://code.jquery.com/jquery-4.0.0.js
  • https://code.jquery.com/jquery-4.0.0.min.js

Installation via npm :

npm install jquery@4.0.0

Slim build : liens directs

Les versions slim (sans certains modules) sont aussi sur le CDN et dans le package npm :

  • https://code.jquery.com/jquery-4.0.0.slim.js
  • https://code.jquery.com/jquery-4.0.0.slim.min.js

Les mises à jour sont annoncées comme déjà disponibles en version courante sur npm et Bower. Pour un panorama de toutes les méthodes d’obtention, la page officielle est : https://jquery.com/download/. Les CDN publics reçoivent leurs copies « aujourd’hui » d’après l’annonce, avec un délai de quelques jours possible avant publication ; en attendant, le CDN officiel est la voie la plus directe.

Anniversaire, remerciements, et photo de réunion

La release s’inscrit dans un contexte symbolique : les 20 ans de jQuery. L’équipe mentionne une réunion à Dallas (avec John Resig en visio via Zoom) et publie une photo de groupe.

Photo de groupe de la réunion des contributeurs jQuery à Dallas
Réunion d’anniversaire des 20 ans : contributeurs et équipe jQuery réunis à Dallas, avec John Resig présent en visioconférence. — Forrás: blog.jquery.com (The jQuery Foundation)

L’annonce remercie explicitement les personnes ayant contribué via patches, bug reports ou tests, dont : Alex, Ahmed S. El-Afifi, fecore1, Dallas Fraser, Richard Gibson, Michał Gołębiowski-Owczarek, Pierre Grimaud, Gabriela Gutierrez, Jonathan, Necmettin Karakaya, Anders Kaseorg, Wonseop Kim, Simon Legner, Shashanka Nataraj, Pat O’Callaghan, Christian Oliff, Dimitri Papadopoulos Orfanos, Wonhyoung Park, Bruno PIERRE, Baoshuo Ren, Beatriz Rezener, Sean Robinson, Ed Sanders, Timo Tijhof, Tom, Christian Wenz, ygj6, ainsi que l’ensemble de l’équipe jQuery.

Changelog complet et points techniques (tous les items listés)

Le changelog complet est disponible ici : 4.0.0 https://github.com/jquery/jquery/compare/3.7.1…4.0.0. Ci-dessous, les items listés dans l’annonce, par rubrique.

Ajax

  • Don’t treat array data as binary (992a1911)
  • Allow processData: true even for binary data (ce264e07)
  • Support binary data (including FormData) (a7ed9a7b)
  • Support headers for script transport even when cross-domain (#5142, 6d136443)
  • Support null as success functions in jQuery.get (#4989, 74978b7e)
  • Don’t auto-execute scripts unless dataType provided (#4822, 025da4dd)
  • Make responseJSON work for erroneous same-domain JSONP requests (68b4ec59)
  • Execute JSONP error script responses (#4771, a1e619b0)
  • Avoid CSP errors in the script transport for async requests (#3969, 07a8e4a1)
  • Drop the json to jsonp auto-promotion logic (#1799, #3376, e7b3bc48)
  • Overwrite s.contentType with content-type header value, if any (#4119, 7fb90a6b)
  • Deprecate AJAX event aliases, inline event/alias into deprecated (23d53928)
  • Do not execute scripts for unsuccessful HTTP responses (#4250, 50871a5a)
  • Simplify jQuery.ajaxSettings.xhr (#1967, abdc89ac)

Attributes

  • Make .attr( name, false ) remove for all non-ARIA attrs (#5388, 063831b6)
  • Shave off a couple of bytes (b40a4807)
  • Don’t stringify attributes in the setter (#4948, 4250b628)
  • Drop the toggleClass(boolean|undefined) signature (#3388, a4421101)
  • Refactor val(): don’t strip carriage return, isolate IE workarounds (ff281991)
  • Don’t set the type attr hook at all outside of IE (9e66fe9a)

CSS

  • Fix dimensions of table <col> elements (#5628, eca2a564)
  • Drop the cache in finalPropName (640d5825)
  • Tests: Fix tests & support tests under CSS Zoom (#5489, 071f6dba)
  • Fix reliableTrDimensions support test for initially hidden iframes (b1e66a5f)
  • Selector: Align with 3.x, remove the outer selector.js wrapper (53cf7244)
  • Make the reliableTrDimensions support test work with Bootstrap CSS (#5270, 65b85031)
  • Make offsetHeight( true ), etc. include negative margins (#3982, bce13b72)
  • Return undefined for whitespace-only CSS variable values (#5120) (7eb00196)
  • Don’t trim whitespace of undefined custom property (#5105, ed306c02)
  • Skip falsy values in addClass( array ), compress code (#4998, a338b407)
  • Justify use of rtrim on CSS property values (655c0ed5)
  • Trim whitespace surrounding CSS Custom Properties values (#4926, efadfe99)
  • Include show, hide & toggle methods in the jQuery slim build (297d18dd)
  • Remove the opacity CSS hook (865469f5)
  • Workaround buggy getComputedStyle on table rows in IE/Edge (#4490, 26415e08)
  • Don’t automatically add “px” to properties with a few exceptions (#2795, 00a9c2e5)

Core

  • Remove obsolete workarounds, update support comments (e2fe97b7)
  • Switch $.parseHTML from document.implementation to DOMParser (0e123509)
  • Fix the exports setup to make bundlers work with ESM & CommonJS (#5416, 60f11b58)
  • Add more info about named exports (5f869590)
  • Simplify code post browser support reduction (93ca49e6)
  • Move the factory to separate exports (46f6e3da)
  • Use named exports in src/ (#5262, f75daab0)
  • Fix regression in jQuery.text() on HTMLDocument objects (#5264, a75d6b52)
  • Selector: Move jQuery.contains from the selector to the core module (024d8719)
  • Drop the root parameter of jQuery.fn.init (d2436df3)
  • Don’t rely on splice being present on input (9c6f64c7)
  • Manipulation: Add basic TrustedHTML support (#4409, de5398a6)
  • Report browser errors in parseXML (#4784, 89697325)
  • Make jQuery.isXMLDoc accept falsy input (#4782, fd421097)
  • Drop support for Edge Legacy (i.e. non-Chromium Microsoft Edge) (#4568, e35fb62d)
  • Fire iframe script in its context, add doc param in globalEval (#4518, 4592595b)
  • Exclude callbacks & deferred modules in the slim build as well (fbc44f52)
  • Migrate from AMD to ES modules 🎉 (d0ce00cd)
  • Use Array.prototype.flat where supported (#4320, 9df4f1de)
  • Remove private copies of push, sort & splice from the jQuery prototype (b59107f5)
  • Implement .even() & .odd() to replace POS :even & :odd (78420d42)
  • Deprecate jQuery.trim (#4363, 5ea59460)
  • Remove IE-specific support tests, rely on document.documentMode (#4386, 3527a384)
  • Drop support for IE <11, iOS <11, Firefox <65, Android Browser & PhantomJS (#3950, #4299, cf84696f)
  • Remove deprecated jQuery APIs (#4056, 58f0c00b)

Data

  • Refactor to reduce size (805cdb43)
  • Event:Manipulation: Prevent collisions with Object.prototype (#3256, 9d76c0b1)
  • Separate data & css/effects camelCase implementations (#3355, 8fae2120)

Deferred

Deprecated

  • Define .hover() using non-deprecated methods (fd6ffc5e)
  • Remove jQuery.trim (0b676ae1)
  • Fix AMD parameter order (f810080e)

Dimensions

  • Add offset prop fallback to FF for unreliable TR dimensions (#4529, 3bbbc111)

Docs

  • Fix some minor issues in comments (e4d4dd81)
  • update herodevs link in README (#5695, 093e63f9)
  • Align CONTRIBUTING.md with 3.x-stable (d9281061)
  • Update CONTRIBUTING.md (4ef25b0d)
  • add version support section to README (cbc2bc1f)
  • Update remaining HTTP URLs to HTTPS (7cdd8374)
  • Fix module links in the package README (ace646f6)
  • update watch task in CONTRIBUTING.md (77d6ad71)
  • Fix typos found by codespell (620870a1)
  • remove stale gitter badge from readme (67cb1af7)
  • Remove the “Grunt build” section from the PR template (988a5684)
  • Remove stale badge from README (bcd9c2bc)
  • Update the README of the published package (edccabf1)
  • Remove git.io from a GitHub Actions comment (016872ff)
  • Update webpack website in README (01819bc3)
  • add link to patchwelcome and help wanted issues (924b7ce8)
  • add link to preview the new CLAs (683ceb8f)
  • Fix incorrect trac-NUMBER references (eb9ceb2f)
  • remove expired links from old jquery source (#4997) (ed066ac7)
  • Remove links to Web Archive from source (#4981, e24f2dcf)
  • Replace #NUMBER Trac issue references with trac-NUMBER (5d5ea015)
  • Update the URL to the latest jQuery build in CONTRIBUTING.md (9bdb16cd)
  • Remove the CLA checkbox in the pull request template (e1248931)
  • update irc to Libera and fix LAMP dead link (175db73e)
  • Update Frequently Reported Issues in the GitHub issue template (7a6fae6a)
  • Change JS Foundation mentions to OpenJS Foundation (11611967)
  • add SECURITY.md, show security email address (2ffe54ca)
  • Fix typos (1a7332ce)
  • Update the link to the jsdom repository (a62309e0)
  • Use https for hyperlinks in README (73415da2)
  • Remove a mention of the event/alias.js module from README (3edfa1bc)
  • Update links to EdgeHTML issues to go through Web Archive (1dad1185)
  • direct users to GitHub docs for cloning the repo (f1c16de2)
  • Change OS X to macOS in README (5a3e0664)
  • Update most URLs to HTTPS (f09d9210)
  • Convert link to Homebrew from HTTP to HTTPS (e0022f23)

Effect

  • Fix a unnecessary conditional statement in .stop() (#4374, 110802c7)

Effects

Event

  • Use .preventDefault() in beforeunload (7c123dec)
  • Increase robustness of an inner native event in leverageNative (#5459, 527fb3dc)
  • Avoid collisions between jQuery.event.special & Object.prototype (bcaeb000)
  • Simplify the check for saved data in leverageNative (dfe212d5)
  • Make trigger(focus/blur/click) work with native handlers (#5015, 6ad3651d)
  • Simulate focus/blur in IE via focusin/focusout (#4856, #4859, #4950, ce60d318)
  • Don’t break focus triggering after .on(focus).off(focus) (#4867, e539bac7)
  • Make focus re-triggering not focus the original element back (#4382, dbcffb39)
  • Don’t crash if an element is removed on blur (#4417, 5c2d0870)
  • Remove the event.which shim (#3235, 1a5fff4c)
  • remove jQuery.event.global (18db8717)
  • Only attach events to objects that accept data — for real (#4397, d5c505e3)
  • Stop shimming focusin & focusout events (#4300, 8a741376)
  • Prevent leverageNative from registering duplicate dummy handlers (eb6c0a7c)
  • Fix handling of multiple async focus events (#4350, ddfa8376)

Manipulation

  • Make jQuery.cleanData not skip elements during cleanup (#5214, 3cad5c43)
  • Generalize a test to support IE (88690ebf)
  • Support $el.html(selfRemovingScript) (#5378) (#5377, 937923d9)
  • Extract domManip to a separate file (ee6e8740)
  • Don’t remove HTML comments from scripts (#4904, 2f8f39e4)
  • Respect script crossorigin attribute in DOM manipulation (#4542, 15ae3614)
  • Avoid concatenating strings in buildFragment (9c98e4e8)
  • Make jQuery.htmlPrefilter an identity function (90fed4b4)
  • Selector: Use the nodeName util where possible to save size (4504fc3d)

Offset

  • Increase search depth when finding the ‘real’ offset parent (556eaf4a)

Release

  • 4.0.0 (4f2fae08)
  • remove dist files from main branch (c838cfb5)
  • 4.0.0-rc.2 (97525193)
  • Update AUTHORS.txt (c128d5d8)
  • Fix release issues uncovered during the 4.0.0-rc.1 release (a5b0c431)
  • remove dist files from main branch (9d06c6dd)
  • 4.0.0-rc.1 (586182f3)
  • Run npm publish in the post-release phase (ff1f0eaa)
  • Only run browserless tests during the release (fb5ab0f5)
  • Temporarily disable running tests on release (3f79644b)
  • publish tmp/release/dist folder when releasing (#5658, a865212d)
  • correct build date in verification; other improvements (53ad94f3)
  • remove dist files from main branch (be048a02)
  • 4.0.0-beta.2 (51fffe9f)
  • ensure builds have the proper version (3e612aee)
  • set preReleaseBase in config file (1fa8df5d)
  • fix running pre/post release scripts in windows (5518b2da)
  • update AUTHORS.txt (862e7a18)
  • migrate release process to release-it (jquery/jquery-release#114, 2646a8b0)
  • add factory files to release distribution (#5411, 1a324b07)
  • use buildDefaultFiles directly and pass version (b507c864)
  • copy dist-module folder as well (63767650)
  • only published versioned files to cdn (3a0ca684)
  • remove scripts and dev deps from dist package.json (7eac932d)
  • update build command in Release.generateArtifacts (3b963a21)
  • add support for md5 sums in windows (f088c366)
  • remove the need to install grunt globally (b2bbaa36)
  • upgrade release dependencies (967af732)
  • Remove an unused chalk dependency (bfb6897c)
  • Use an in-repository dist README fixture (358b769a)
  • Update AUTHORS.txt (1b74660f)
  • update AUTHORS.txt (cf9fe0f6)

Selector

  • Remove the workaround for :has; test both on iPhone & iPad (65e35450)
  • Properly deprecate jQuery.expr[ ":" ]/jQuery.expr.filters (329661fd)
  • Make selector.js module depend on attributes/attr.js (#5379, e06ff088)
  • Eliminate selector.js depenencies from various modules (e8b7db4b)
  • Re-expose jQuery.find.{tokenize,select,compile,setDocument} (#5259, 338de359)
  • Stop relying on CSS.supports( “selector(…)” ) (#5194, 68aa2ef7)
  • Backport jQuery selection context logic to selector-native (#5185, 2e644e84)
  • Make selector lists work with qSA again (#5177, 09d988b7)
  • Implement the uniqueSort chainable method (#5166, 5266f23c)
  • Re-introduce selector-native.js (4c1171f2)
  • Manipulation: Fix DOM manip within template contents (#5147, 3299236c)
  • Drop support for legacy pseudos, test custom pseudos (8c7da22c)
  • Use jQuery :has if CSS.supports(selector(...)) non-compliant (#5098, d153c375)
  • Remove the “a:enabled” workaround for Chrome <=77 (c1ee33ad)
  • Make empty attribute selectors work in IE again (#4435, 05184cc4)
  • Use shallow document comparisons in uniqueSort (#4441, 15750b0a)
  • Add a test for throwing on post-comma invalid selectors (6eee5f7f)
  • Make selectors with leading combinators use qSA again (ed66d5a2)
  • Use shallow document comparisons to avoid IE/Edge crashes (#4441, aa6344ba)
  • reduce size, simplify setDocument (29a9544a)
  • Leverage the :scope pseudo-class where possible (#4453, df6a7f7f)
  • Bring back querySelectorAll shortcut usage (cef4b731)
  • Inline Sizzle into the selector module (47835965)
  • Port Sizzle tests to jQuery (79b74e04)

Support

  • ensure display is set to block for the support div (#4832, 09f25436)

Traversing

  • Fix contents() on <object>s with children in IE (ccbd6b93)
  • Fix contents() on <object>s with children (#4384, 4d865d96)

À retenir avant de passer de jQuery 3.x à 4.0.0

  • Vérifie ton périmètre de support navigateurs : IE10 et antérieurs, Edge Legacy, anciens iOS/Firefox/Android Browser ne sont plus dans la cible (reste sur 3.x si tu en as besoin).
  • Si ton projet est strict sur la sécurité (CSP), les évolutions Trusted Types et le basculement vers des <script> tags pour les chargements asynchrones de scripts sont des changements structurants.
  • Prévois une passe de nettoyage sur les APIs supprimées (ex. jQuery.trim, jQuery.isArray, etc.) et remplace par les équivalents natifs.
  • Si tu relies du code sur l’ordre des événements focus/blur, re-teste : l’ordre suit maintenant la spec W3C (hors IE).
  • Choisis ton build (complet vs slim) en fonction des modules nécessaires et de la contrainte IE11 (Promises natives absentes).
  • Appuie-toi sur le guide officiel et sur jQuery Migrate pour sécuriser l’upgrade.

Rejoignez la communauté HelloWP !

Discutez avec nous de WordPress, du développement web et partagez vos expériences avec d’autres développeurs.

- membres
- en ligne
Rejoindre

Nous utilisons des cookies pour améliorer votre expérience. En continuant, vous acceptez notre Politique relative aux cookies.