Spring til indhold
jQuery 4.0.0 er landet: 20 år senere, og endelig en ny major
Mads Jensen
Mads Jensen 19. January 2026 · 1 min læsetid

jQuery 4.0.0 er landet: 20 år senere, og endelig en ny major

Den 14. januar 2006 præsenterede John Resig jQuery på BarCamp i New York. 20 år senere har jQuery-teamet nu frigivet den endelige version af jQuery 4.0.0 – efter en lang udviklingsperiode med flere pre-releases. Det er første major release i næsten 10 år, og den indeholder (som forventet) en håndfuld breaking changes. Den gode nyhed er, at teamet forventer, at de fleste kan opgradere med minimale ændringer.

Mange af bruddene er præcis den slags ændringer, man ikke har kunnet snige ind i en patch eller minor: der er skåret hårdt i legacy-kode, fjernet tidligere deprecations, ryddet op i interne parametre som aldrig var dokumenteret, og droppet en del “magiske” adfærde som gjorde koden unødigt kompleks.

Hvis du planlægger en opgradering, så brug de officielle hjælpemidler: upgrade guiden og den opdaterede jQuery Migrate plugin release. Finder du problemer, beder teamet om issues på .

jQuery 4.0.0 kan hentes via jQuery’s egen CDN og via npm. Tredjeparts-CDN’er får typisk filerne kort efter, men jQuery-teamet styrer ikke deres releaseplaner.

Highlights i jQuery 4.0.0 (det, der reelt betyder noget ved opgradering)

IE<11 er droppet (men IE11 lever lidt endnu)

Den mest synlige ændring er, at jQuery 4.0 dropper support for IE 10 og ældre. Mange spørger naturligt: hvorfor ikke også IE11? Planen er at udfase i etaper, og næste skridt er planlagt til jQuery 5.0 (se PR’en: ). I 4.0 starter de med at fjerne kode, der specifikt understøtter IE-versioner før 11.

Samtidig er der også ryddet op i understøttelsen af andre meget gamle browsere: Edge Legacy, iOS-versioner tidligere end de sidste 3, Firefox-versioner tidligere end de sidste 2 (med undtagelse af Firefox ESR) samt Android Browser. Ifølge release-noten bør du ikke skulle ændre noget i din kode af den grund – men hvis du skal understøtte de nævnte browsere, er anbefalingen at blive på jQuery 3.x.

Trusted Types og CSP: færre konflikter med moderne sikkerhedspolitikker

jQuery 4.0 tilføjer support for Trusted Types (et browser-sikkerhedskoncept til at begrænse DOM XSS), så HTML indpakket i TrustedHTML kan bruges som input til jQuery-manipulationsmetoder uden at bryde Content Security Policy-direktivet require-trusted-types-for. Baggrund og reference: og MDN om TrustedHTML: .

På AJAX-siden er der også lavet en vigtig CSP-relateret justering: hvor nogle request-typer allerede brugte <script>-tags for at bevare attributter som crossdomain, er teamet nu gået videre og har skiftet de fleste asynkrone script requests til at bruge <script>-tags for at undgå CSP-fejl, der kan opstå ved inline scripts. Ændringen er dokumenteret her: .

Der er dog stadig enkelte situationer, hvor XHR bruges til asynkrone script requests – fx hvis du bruger optionen "headers" (bemærk release-notens anbefaling: brug scriptAttrs i stedet). Men når det er muligt, forsøger jQuery 4.0 nu at bruge et <script>-tag.

jQuery-kilden er migreret til ES modules (farvel AMD/RequireJS i core)

En af de mest langsigtede moderniseringer er, at jQuery’s kildekode på main er migreret fra AMD (Asynchronous Module Definition – typisk brugt via RequireJS) til ES modules. AMD-baggrund: . ES modules-arbejdet: .

Det lyder måske som intern oprydning, men det har praktisk betydning: jQuery’s source har længe været publiceret med releases på npm og GitHub, men kunne ikke importeres direkte som moduler uden RequireJS, som også var jQuery’s foretrukne build tool. Nu er pakken bygget med Rollup () og jQuery-teamet kører tests på ES modules separat. Resultatet er bedre kompatibilitet med moderne build tools og workflows – og mulighed for at bruge jQuery via <script type=module> i browsere, hvor det giver mening.

Fjernede deprecated APIs: mindre overflade, mere native JavaScript

jQuery 4.0 fjerner en række API’er, der har været deprecated i flere versioner. Enten var de tænkt som interne fra starten, eller også findes der nu native alternativer i alle browsere, som jQuery 4.0 understøtter.

De fjernede funktioner er:

  • 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

I praksis er det tid til at gå all-in på native: Array.isArray(), JSON.parse(), String.prototype.trim() og Date.now() er nævnt direkte som eksempler.

Kombinationen af at fjerne deprecated API’er og droppe gammel IE-support har givet en størrelsesreduktion på over 3k bytes gzippet.

Interne Array-metoder er væk fra jQuery prototype

jQuery’s prototype har længe haft Array-metoder, der aldrig opførte sig som øvrige jQuery-metoder og altid var tiltænkt intern brug: push, sort og splice. I 4.0 er de fjernet fra jQuery-prototypen.

Hvis du (bevidst eller ubevidst) har brugt dem, peger release-noten på en konkret erstatning: $elems.push( elem ) kan skiftes til [].push.call( $elems, elem ).

Focus/blur-eventrækkefølge følger nu W3C-spec (breaking change)

Historisk har browsere været uenige om rækkefølgen af focus- og blur-events: focusin, focusout, focus og blur. Nu er de nyeste versioner af alle browsere, som jQuery 4.0 understøtter, endelig konvergeret om samme rækkefølge – men den er ikke den rækkefølge, jQuery valgte for mange år siden. Derfor er det en breaking change.

Fra og med jQuery 4.0 overrider jQuery ikke længere browsernes native adfærd. Det betyder, at alle browsere undtagen IE følger den nuværende W3C-specifikation:

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

jQuery’s rækkefølge i tidligere versioner var: focusout, blur, focusin, focus. Som en ironisk detalje nævner teamet, at den eneste browser, der fulgte den gamle W3C-spec (før opdateringen i 2023), var Internet Explorer.

Slim build er opdateret og endnu mindre

Slim build bliver endnu mindre i jQuery 4.0.0, bl.a. ved at fjerne Deferreds og Callbacks. Den ligger nu omkring 19.5k bytes gzippet.

Deferreds har længe understøttet Promises/A+ (), så i de fleste tilfælde kan du skifte til native Promise. Native Promises findes i alle browsere, jQuery understøtter – undtagen IE11. Deferreds har dog nogle ekstra features, som native Promises ikke har, men meget kan flyttes over på almindelige Promise-metoder.

Hvis du skal understøtte IE11, anbefaler release-noten enten at bruge main build, eller at tilføje en polyfill for native Promises.

Download og installation

Du kan hente jQuery 4.0.0 fra jQuery CDN eller linke direkte:

Via npm installerer du sådan her:

npm install jquery@4.0.0

Slim build (når du ikke har brug for det hele)

Slim-varianten er relevant, hvis du fx ikke har brug for ajax (eller hellere vil bruge et dedikeret ajax-bibliotek), og hvis dine animationer i praksis kan klares med CSS plus class-manipulation. Da alle understøttede browsere (igen: undtagen IE11) har native Promises, er Deferreds og Callbacks typisk overflødige for mange setups.

Selvom jQuery sjældent er en reel performance-flaskehals i 2026, er slim build ifølge release-noten ca. 8k gzippede bytes mindre end den normale build. Filerne findes også på CDN og i npm-pakken:

Release-noten nævner også, at disse opdateringer allerede er tilgængelige som current versions på npm og Bower, og at alle måder at hente jQuery på er samlet her: . Offentlige CDNs modtager deres kopier i dag, men det kan tage et par dage, før filerne er publiceret.

Changelog: de vigtigste tekniske ændringer (fuld liste)

Den komplette changelog kan læses som et diff fra 3.7.1 til 4.0.0 her: .

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)

20-års jubilæum og tak til bidragydere

Release-noten sender en tak til alle, der har bidraget med patches, bug reports og test. Der nævnes bl.a. 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 – og hele jQuery-teamet.

Teamet markerede også jQuery’s 20-års fødselsdag med et reunion i Dallas, hvor John Resig deltog via Zoom. Indlægget blev publiceret, mens de var samlet.

Gruppefoto fra jQuery-reunion i Dallas i forbindelse med jQuery 4.0.0 og 20-års jubilæet
Forrás: blog.jquery.com / The jQuery Foundation

Opsummering: hvad du bør tjekke før du går på 4.0

  • Hvis du stadig har brugere på IE10 eller ældre: bliv på jQuery 3.x.
  • Planlæg for at IE11 understøttes nu, men er på vej ud i en senere major (planlagt til jQuery 5.0).
  • Scan kodebasen for fjernede deprecated APIs (fx jQuery.trim, jQuery.parseJSON, jQuery.isArray).
  • Tjek om du (utilsigtet) bruger $elems.push/sort/splice på jQuery-collections.
  • Hvis du har kompleks fokus-/blur-logik eller plugins der afhænger af eventrækkefølge: test fokusflowet grundigt pga. W3C-ændringen.
  • Hvis du kører stram CSP og/eller require-trusted-types-for: jQuery 4.0’s Trusted Types- og script-transportændringer er relevante.
  • Overvej slim build, men husk at Deferreds/Callbacks ikke er med – og at IE11 mangler native Promises uden polyfill.

Bliv en del af HelloWP-communityet!

Chat med os om WordPress og webudvikling, og del erfaringer med andre udviklere.

- medlemmer
- online
Deltag

Vi bruger cookies til at forbedre din oplevelse. Ved at fortsætte accepterer du vores Cookiepolitik.