{"id":184,"date":"2026-01-19T00:00:00","date_gmt":"2026-01-18T23:00:00","guid":{"rendered":"https:\/\/helloblog.io\/nl\/jquery-4-0-0-is-uit-dit-is-er-nieuw-en-dit-kan-je-upgrade-breken\/"},"modified":"2026-01-19T00:00:00","modified_gmt":"2026-01-18T23:00:00","slug":"jquery-4-0-0-is-uit-dit-is-er-nieuw-en-dit-kan-je-upgrade-breken","status":"publish","type":"post","link":"https:\/\/helloblog.io\/nl\/jquery-4-0-0-is-uit-dit-is-er-nieuw-en-dit-kan-je-upgrade-breken\/","title":{"rendered":"jQuery 4.0.0 is uit: dit is er nieuw (en dit kan je upgrade breken)"},"content":{"rendered":"\n<p>Twintig jaar nadat John Resig jQuery in 2006 op BarCamp NYC introduceerde, is jQuery 4.0.0 nu officieel uit. Dit is de eerste grote versie-sprong in bijna tien jaar en hij komt met een duidelijke boodschap: minder legacy, meer moderne browser- en security-realiteit. Dat betekent ook dat er breaking changes in zitten-maar volgens het jQuery-team kunnen de meeste projecten met minimale aanpassingen over.<\/p>\n\n\n\n<p>Belangrijk voor je upgrade-pad: er is een offici\u00eble <a href=\"https:\/\/jquery.com\/upgrade-guide\/4.0\/\">upgrade guide<\/a> en er staat een verse <a href=\"https:\/\/github.com\/jquery\/jquery-migrate\/\">jQuery Migrate plugin release<\/a> klaar om incompatibiliteiten te detecteren en (waar mogelijk) te overbruggen. Issues kun je melden via de <a href=\"https:\/\/github.com\/jquery\/jquery\/issues\">jQuery issue tracker<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wat is de insteek van jQuery 4.0.0?<\/h2>\n\n\n\n<p>De grote lijn: het team heeft eindelijk opruimwerk kunnen doen dat in patch- en minor-releases niet wenselijk is. Concreet gaat het om het wegknippen van legacy-code, het verwijderen van eerder gedepricieerde API\u2019s, het schrappen van interne parameters die ooit per ongeluk \u201cpubliek\u201d werden, en het stoppen met bepaalde \u201cmagic\u201d gedragingen die te complex of te moeilijk te onderhouden waren.<\/p>\n\n\n\n<p>Een leuke bijvangst: door het combineren van (1) het verwijderen van oude IE-ondersteuning en (2) het weghalen van deprecated API\u2019s is de library <strong>meer dan 3k bytes kleiner (gzipped)<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Breaking change #1: IE < 11 is niet meer ondersteund<\/h2>\n\n\n\n<p>jQuery 4.0 laat ondersteuning voor <strong>IE 10 en ouder<\/strong> vallen. Waarom niet meteen IE 11? Dat gebeurt gefaseerd: de volgende stap-het weghalen van IE 11-ondersteuning-staat gepland voor <strong>jQuery 5.0<\/strong> (volgens de verwijzing in de release notes: <a href=\"https:\/\/github.com\/jquery\/jquery\/pull\/5077\">pull request #5077<\/a>). Voor nu is de winst vooral dat alle speciale paden voor IE<11 uit de code kunnen.<\/p>\n\n\n\n<p>Daarnaast verdwijnen ook een paar andere \u201cheel oude\u201d browserdoelen uit de support matrix:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Edge Legacy (de niet-Chromium Microsoft Edge)<\/li>\n\n\n<li>iOS-versies ouder dan de laatste 3<\/li>\n\n\n<li>Firefox-versies ouder dan de laatste 2 (met uitzondering van Firefox ESR)<\/li>\n\n\n<li>Android Browser<\/li>\n\n<\/ul>\n\n\n\n<p>Volgens het jQuery-team hoef je hier meestal niets voor te doen. Maar als jouw product w\u00e9l nog op deze browsers moet draaien, dan is het advies simpel: <strong>blijf op jQuery 3.x<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Security: Trusted Types en beter gedrag onder CSP<\/h2>\n\n\n\n<p>jQuery 4.0 voegt ondersteuning toe voor <strong>Trusted Types<\/strong>. Trusted Types is een browsermechanisme dat helpt om DOM XSS te voorkomen door te eisen dat \u201cgevaarlijke\u201d sinks (zoals <code>innerHTML<\/code>) alleen waarden accepteren die expliciet als veilig zijn aangemerkt-bijvoorbeeld via <code>TrustedHTML<\/code>. In jQuery 4.0 kun je HTML die verpakt is in <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/TrustedHTML\"><code>TrustedHTML<\/code><\/a> gebruiken als input voor jQuery-manipulatiemethodes, zonder dat je botst met de <code>require-trusted-types-for<\/code> directive in je Content Security Policy (CSP). Meer context: de release verwijst ook naar <a href=\"https:\/\/twitter.com\/kkotowicz\/status\/1445713282128515074\">Trusted Types<\/a>.<\/p>\n\n\n\n<p>Daarnaast is er een praktische CSP-verbetering rondom script-loads via AJAX. Waar jQuery al in sommige gevallen <code>&lt;script&gt;<\/code>-tags gebruikte (om attributes zoals <code>crossdomain<\/code> te behouden), is dit nu breder doorgevoerd: <strong>de meeste asynchrone script requests gebruiken nu <code>&lt;script&gt;<\/code> tags<\/strong> om CSP-problemen door inline scripts te vermijden (zie <a href=\"https:\/\/github.com\/jquery\/jquery\/pull\/4763\">PR #4763<\/a>).<\/p>\n\n\n\n<p>Er blijven uitzonderingen waar alsnog XHR wordt gebruikt voor async script requests. De release noemt expliciet het geval waarin je de <code>&quot;headers&quot;<\/code> optie meegeeft; in die situatie kun je beter <code>scriptAttrs<\/code> gebruiken in plaats van <code>headers<\/code>. In alle andere gevallen probeert jQuery nu \u201cwaar mogelijk\u201d een <code>&lt;script&gt;<\/code>-tag te gebruiken.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">De broncode is gemigreerd naar ES modules (en dat merk je in moderne tooling)<\/h2>\n\n\n\n<p>Een fundamentele modernisering is de migratie van de jQuery-broncode op de <code>main<\/code> branch van <strong>AMD<\/strong> naar <strong>ES modules<\/strong>. Historisch werd de source wel gepubliceerd (npm en GitHub), maar je kon die niet rechtstreeks importeren als modules zonder <strong>RequireJS<\/strong>, dat lang de build tool van keuze was.<\/p>\n\n\n\n<p>In jQuery 4.0 is de packaging verschoven naar <strong>Rollup<\/strong> en worden de ES modules ook apart getest. Dat maakt jQuery beter compatibel met moderne bundlers en workflows, en ook direct bruikbaar in browsers via <code>&lt;script type=module&gt;<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deprecated API\u2019s zijn verwijderd (vervang ze door native alternatieven)<\/h2>\n\n\n\n<p>In een major release hoort opruimen-en dat is precies wat er gebeurd is. Een reeks functies die al meerdere versies als deprecated gemarkeerd waren, is nu echt verwijderd. Dit waren ofwel interne helpers die ooit per ongeluk \u201cpubliek\u201d werden, of helpers die inmiddels native equivalents hebben in alle ondersteunde browsers.<\/p>\n\n\n\n<p>Dit zijn de verwijderde functies (zoals in de release opgesomd): <code>jQuery.isArray<\/code>, <code>jQuery.parseJSON<\/code>, <code>jQuery.trim<\/code>, <code>jQuery.type<\/code>, <code>jQuery.now<\/code>, <code>jQuery.isNumeric<\/code>, <code>jQuery.isFunction<\/code>, <code>jQuery.isWindow<\/code>, <code>jQuery.camelCase<\/code>, <code>jQuery.nodeName<\/code>, <code>jQuery.cssNumber<\/code>, <code>jQuery.cssProps<\/code> en <code>jQuery.fx.interval<\/code>.<\/p>\n\n\n\n<p>Vervang ze door native varianten waar dat kan, bijvoorbeeld:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>Array.isArray()<\/code> i.p.v. <code>jQuery.isArray<\/code><\/li>\n\n\n<li><code>JSON.parse()<\/code> i.p.v. <code>jQuery.parseJSON<\/code><\/li>\n\n\n<li><code>String.prototype.trim()<\/code> i.p.v. <code>jQuery.trim<\/code><\/li>\n\n\n<li><code>Date.now()<\/code> i.p.v. <code>jQuery.now<\/code><\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Breaking change #2: interne Array-methodes zijn uit de jQuery prototype gehaald<\/h2>\n\n\n\n<p>De jQuery prototype had al lang een paar Array-methodes hangen die nooit echt jQuery-achtig aanvoelden en bedoeld waren voor intern gebruik: <code>push<\/code>, <code>sort<\/code> en <code>splice<\/code>. In jQuery 4.0 zijn deze methodes <strong>verwijderd<\/strong> van de prototype.<\/p>\n\n\n\n<p>Als je ze toch gebruikte (bewust of onbewust), dan moet je overstappen op de echte Array-varianten. Het team geeft dit voorbeeld:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Oud (jQuery 3.x werkte dit soms, maar het was nooit de bedoeling)\n$elems.push(elem);\n\n\/\/ Nieuw: gebruik de Array-methode expliciet\n[].push.call($elems, elem);\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#6A737D\">\/\/ Oud (jQuery 3.x werkte dit soms, maar het was nooit de bedoeling)<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">$elems.<\/span><span style=\"color:#B392F0\">push<\/span><span style=\"color:#E1E4E8\">(elem);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\">\/\/ Nieuw: gebruik de Array-methode expliciet<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">[].push.<\/span><span style=\"color:#B392F0\">call<\/span><span style=\"color:#E1E4E8\">($elems, elem);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Breaking change #3: focus\/blur event-volgorde volgt nu de W3C spec<\/h2>\n\n\n\n<p>Focus-events zijn berucht omdat browsers lang niet eensgezind waren over de volgorde van <code>focusin<\/code>, <code>focusout<\/code>, <code>focus<\/code> en <code>blur<\/code>. Inmiddels zijn de nieuwste versies van alle browsers die jQuery 4.0 ondersteunt naar dezelfde volgorde geconvergeerd-alleen is dat n\u00edet de volgorde die jQuery jaren geleden als \u201cconsistent\u201d had gekozen.<\/p>\n\n\n\n<p>Vanaf jQuery 4.0 overschrijft jQuery het native gedrag niet meer. Dat betekent: alle browsers behalve IE volgen nu de huidige W3C-specificatie, in deze volgorde:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>blur<\/li>\n\n\n<li>focusout<\/li>\n\n\n<li>focus<\/li>\n\n\n<li>focusin<\/li>\n\n<\/ol>\n\n\n\n<p>Ter vergelijking: in vorige jQuery-versies was de volgorde: <code>focusout<\/code>, <code>blur<\/code>, <code>focusin<\/code>, <code>focus<\/code>. Een ironisch detail uit de release notes: de enige browser die de oude W3C spec (voordat die in 2023 werd aangepast) ooit volgde, was Internet Explorer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Slim build: n\u00f3g kleiner, maar nu zonder Deferreds en Callbacks<\/h2>\n\n\n\n<p>De <strong>slim build<\/strong> is in jQuery 4.0.0 opnieuw afgeslankt: <strong>Deferreds en Callbacks zijn eruit gehaald<\/strong>. De slim build komt daarmee uit op ongeveer <strong>19,5k bytes gzipped<\/strong>.<\/p>\n\n\n\n<p>Deferreds ondersteunden al lang de <a href=\"https:\/\/promisesaplus.com\/\">Promises A+ standaard<\/a>, en in de meeste moderne cases kun je dus overstappen op native Promises. Let op: jQuery noemt ook dat Deferreds extra features hebben die native Promises niet hebben, maar dat het merendeel van het gebruik prima migreert naar Promise-methodes.<\/p>\n\n\n\n<p>Compatibiliteitskanttekening: native Promises zijn beschikbaar in alle browsers die jQuery ondersteunt, <strong>behalve IE11<\/strong>. Moet je IE11 nog ondersteunen, gebruik dan liever de main build of voeg een Promise polyfill toe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Downloaden en installeren (CDN + npm)<\/h2>\n\n\n\n<p>jQuery 4.0.0 is beschikbaar via de offici\u00eble jQuery CDN en via npm. Derde partijen (andere CDNs) volgen doorgaans later; daar heeft het jQuery-team geen controle over.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>CDN (unminified): https:\/\/code.jquery.com\/jquery-4.0.0.js<\/li>\n\n\n<li>CDN (minified): https:\/\/code.jquery.com\/jquery-4.0.0.min.js<\/li>\n\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>npm install jquery@4.0.0\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#B392F0\">npm<\/span><span style=\"color:#9ECBFF\"> install<\/span><span style=\"color:#9ECBFF\"> jquery@4.0.0<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Slim build (zonder ajax, Deferreds en Callbacks)<\/h3>\n\n\n\n<p>De slim build is handig als je geen AJAX nodig hebt (of liever een gespecialiseerde fetch\/HTTP-library gebruikt), animaties vooral met CSS\/class toggles doet, en voor Promises gewoon native support gebruikt.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>CDN (slim, unminified): https:\/\/code.jquery.com\/jquery-4.0.0.slim.js<\/li>\n\n\n<li>CDN (slim, minified): https:\/\/code.jquery.com\/jquery-4.0.0.slim.min.js<\/li>\n\n<\/ul>\n\n\n\n<p>Alle opties om jQuery te verkrijgen staan ook op de offici\u00eble downloadpagina: https:\/\/jquery.com\/download\/.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Praktisch upgraden: Migrate + upgrade guide<\/h2>\n\n\n\n<p>Omdat 4.0.0 bewust schoon schip maakt, is het verstandig om je upgrade te benaderen als een normale major migratie: eerst scannen, dan repareren, dan pas uitrollen. De twee \u201coffici\u00eble\u201d hulpmiddelen zijn:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Upgrade guide: https:\/\/jquery.com\/upgrade-guide\/4.0\/<\/li>\n\n\n<li>jQuery Migrate plugin: https:\/\/github.com\/jquery\/jquery-migrate\/<\/li>\n\n<\/ul>\n\n\n\n<p>Loop je tijdens het testen tegen regressies of edge cases aan, dan vraagt het team expliciet om dat te melden via: https:\/\/github.com\/jquery\/jquery\/issues.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Changelog: waar je (als dev) vaak direct iets van merkt<\/h2>\n\n\n\n<p>De release notes bevatten een uitgebreide changelog; de volledige vergelijking staat hier: <strong>Full changelog:<\/strong> <a href=\"https:\/\/github.com\/jquery\/jquery\/compare\/3.7.1...4.0.0\">4.0.0<\/a>. Hieronder een aantal opvallende thema\u2019s uit de lijst die in de praktijk vaak impact hebben:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ajax: strakker, veiliger rondom scripts, en beter met binary\/FormData<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Binary data (incl. FormData) wordt ondersteund, met ook <code>processData: true<\/code> mogelijk voor binary data.<\/li>\n\n\n<li>Array data wordt niet meer als binary behandeld.<\/li>\n\n\n<li>Scripts worden niet automatisch uitgevoerd tenzij een <code>dataType<\/code> is meegegeven (<a href=\"https:\/\/github.com\/jquery\/jquery\/issues\/4822\">#4822<\/a>, <a href=\"https:\/\/github.com\/jquery\/jquery\/commit\/025da4dd343e6734f3d3c1b4785b1548498115d8\">025da4dd<\/a>).<\/li>\n\n\n<li>CSP-gedoe rondom async script transport is aangepakt (<a href=\"https:\/\/github.com\/jquery\/jquery\/issues\/3969\">#3969<\/a>, <a href=\"https:\/\/github.com\/jquery\/jquery\/commit\/07a8e4a177550025c1a08d7ac754839733943f55\">07a8e4a1<\/a>).<\/li>\n\n\n<li>JSON\u2192JSONP auto-promotion logica is gedropt (<a href=\"https:\/\/github.com\/jquery\/jquery\/issues\/1799\">#1799<\/a>, <a href=\"https:\/\/github.com\/jquery\/jquery\/issues\/3376\">#3376<\/a>).<\/li>\n\n\n<li><code>headers<\/code> voor script transport wordt ondersteund, ook cross-domain (<a href=\"https:\/\/github.com\/jquery\/jquery\/issues\/5142\">#5142<\/a>).<\/li>\n\n\n<li>Scripts worden niet uitgevoerd bij onsuccesvolle HTTP responses (<a href=\"https:\/\/github.com\/jquery\/jquery\/issues\/4250\">#4250<\/a>).<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Attributes &#038; classes: kleine API-schoonmaak en edge cases gladgestreken<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>.attr(name, false)<\/code> verwijdert nu voor alle niet-ARIA attributes (<a href=\"https:\/\/github.com\/jquery\/jquery\/issues\/5388\">#5388<\/a>).<\/li>\n\n\n<li>Attributes worden niet meer \u2018stringified\u2019 in de setter (<a href=\"https:\/\/github.com\/jquery\/jquery\/issues\/4948\">#4948<\/a>).<\/li>\n\n\n<li>De <code>toggleClass(boolean|undefined)<\/code> signature is verwijderd (<a href=\"https:\/\/github.com\/jquery\/jquery\/issues\/3388\">#3388<\/a>).<\/li>\n\n\n<li><code>val()<\/code> is gerefactord; IE-workarounds zijn ge\u00efsoleerd.<\/li>\n\n\n<li>Buiten IE wordt de type attr hook niet meer gezet.<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">CSS: minder magisch \u201cpx\u201d, fixes rond tabellen en custom properties<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Afmetingen van table <code>&lt;col&gt;<\/code> elements zijn gefixt (<a href=\"https:\/\/github.com\/jquery\/jquery\/issues\/5628\">#5628<\/a>).<\/li>\n\n\n<li>Tests zijn bijgewerkt en draaien ook onder CSS Zoom (<a href=\"https:\/\/github.com\/jquery\/jquery\/issues\/5489\">#5489<\/a>).<\/li>\n\n\n<li>Negatieve margins worden meegenomen in <code>offsetHeight(true)<\/code>-achtige berekeningen (<a href=\"https:\/\/github.com\/jquery\/jquery\/issues\/3982\">#3982<\/a>).<\/li>\n\n\n<li>Whitespace handling voor CSS Custom Properties is aangescherpt (<a href=\"https:\/\/github.com\/jquery\/jquery\/issues\/4926\">#4926<\/a>, <a href=\"https:\/\/github.com\/jquery\/jquery\/issues\/5105\">#5105<\/a>).<\/li>\n\n\n<li><code>show<\/code>, <code>hide<\/code> en <code>toggle<\/code> zitten nu ook in de jQuery slim build.<\/li>\n\n\n<li>Opacity CSS hook is verwijderd.<\/li>\n\n\n<li>jQuery voegt niet meer automatisch overal <code>px<\/code> toe, met een paar uitzonderingen (<a href=\"https:\/\/github.com\/jquery\/jquery\/issues\/2795\">#2795<\/a>).<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Core\/Selector: ESM, exports, en selector-opschoning<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>$.parseHTML<\/code> gebruikt nu <code>DOMParser<\/code> i.p.v. <code>document.implementation<\/code>.<\/li>\n\n\n<li>Exports zijn aangepast zodat bundlers beter werken met ESM \u00e9n CommonJS (<a href=\"https:\/\/github.com\/jquery\/jquery\/issues\/5416\">#5416<\/a>).<\/li>\n\n\n<li>De <code>root<\/code> parameter van <code>jQuery.fn.init<\/code> is verwijderd.<\/li>\n\n\n<li><code>.even()<\/code> en <code>.odd()<\/code> zijn ge\u00efmplementeerd als vervanging voor POS <code>:even<\/code> en <code>:odd<\/code>.<\/li>\n\n\n<li>Sizzle is inline gehaald in de selector module; selector-structuur is opgeschoond en er is werk gedaan rond <code>:has<\/code> en <code>:scope<\/code>.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">20 jaar jQuery (en een reunion-foto)<\/h2>\n\n\n\n<p>Leuk detail: de release is gepost terwijl een deel van het team samen was voor een reunion in Dallas; John Resig sloot zelfs via Zoom aan. In de originele blogpost staat ook een groepsfoto.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1804\" height=\"1359\" src=\"https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/jquery-reunion-group-edited.jpeg\" alt=\"Groepsfoto van de jQuery-reunion in Dallas\" class=\"wp-image-183\" srcset=\"https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/jquery-reunion-group-edited.jpeg 1804w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/jquery-reunion-group-edited-300x226.jpeg 300w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/jquery-reunion-group-edited-1024x771.jpeg 1024w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/jquery-reunion-group-edited-768x579.jpeg 768w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/jquery-reunion-group-edited-1536x1157.jpeg 1536w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/jquery-reunion-group-edited-400x301.jpeg 400w\" sizes=\"auto, (max-width: 1804px) 100vw, 1804px\" \/><figcaption class=\"wp-element-caption\">. \u2014 <em>Forr\u00e1s: blog.jquery.com<\/em><\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Samenvatting: dit moet je onthouden voor je upgrade<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>jQuery 4.0.0 is de eerste major release in ~10 jaar en bevat breaking changes.<\/li>\n\n\n<li>Support voor IE10 en ouder is verwijderd; IE11 wordt pas in jQuery 5.0 aangepakt (gefaseerde aanpak).<\/li>\n\n\n<li>Trusted Types en CSP-verbeteringen maken DOM-manipulatie en async scripts veiliger\/strakker.<\/li>\n\n\n<li>De source is gemigreerd van AMD naar ES modules; packaging gebeurt met Rollup.<\/li>\n\n\n<li>Deprecated API\u2019s zoals <code>jQuery.trim<\/code> en <code>jQuery.parseJSON<\/code> zijn verwijderd; stap over op native equivalents.<\/li>\n\n\n<li><code>push<\/code>, <code>sort<\/code>, <code>splice<\/code> zijn uit de jQuery prototype gehaald.<\/li>\n\n\n<li>Focus\/blur event-volgorde volgt nu de W3C spec (breaking change).<\/li>\n\n\n<li>Slim build is kleiner en bevat geen Deferreds\/Callbacks meer; let op IE11 m.b.t. native Promises.<\/li>\n\n\n<li>Gebruik de upgrade guide en jQuery Migrate om veilig te migreren.<\/li>\n\n<\/ul>\n\n\n<div class=\"references-section\">\n                <h2>Referenties \/ Bronnen<\/h2>\n                <ul class=\"references-list\"><li><a href=\"https:\/\/blog.jquery.com\/2026\/01\/17\/jquery-4-0-0\/\" target=\"_blank\" rel=\"noopener noreferrer\">jQuery 4.0.0<\/a><\/li><li><a href=\"https:\/\/jquery.com\/upgrade-guide\/4.0\/\" target=\"_blank\" rel=\"noopener noreferrer\">jQuery Upgrade Guide 4.0<\/a><\/li><li><a href=\"https:\/\/github.com\/jquery\/jquery-migrate\/\" target=\"_blank\" rel=\"noopener noreferrer\">jquery\/jquery-migrate<\/a><\/li><li><a href=\"https:\/\/github.com\/jquery\/jquery\/compare\/3.7.1...4.0.0\" target=\"_blank\" rel=\"noopener noreferrer\">Full changelog: 4.0.0 (compare 3.7.1&#8230;4.0.0)<\/a><\/li><li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/TrustedHTML\" target=\"_blank\" rel=\"noopener noreferrer\">TrustedHTML &#8211; MDN Web Docs<\/a><\/li><li><a href=\"https:\/\/promisesaplus.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Promises\/A+<\/a><\/li><li><a href=\"https:\/\/jquery.com\/download\/\" target=\"_blank\" rel=\"noopener noreferrer\">jQuery CDN downloads<\/a><\/li><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>Na een lange ontwikkelcyclus is jQuery 4.0.0 definitief uitgebracht. Het is de eerste major release in bijna 10 jaar, met modernisaties \u00e9n een paar bewuste breaking changes die je v\u00f3\u00f3r een upgrade wilt checken.<\/p>\n","protected":false},"author":22,"featured_media":182,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[88],"tags":[91,93,90,89,92],"class_list":["post-184","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programmeertalen","tag-csp","tag-front-end","tag-javascript","tag-jquery","tag-trusted-types"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/posts\/184","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/users\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/comments?post=184"}],"version-history":[{"count":0,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/posts\/184\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/media\/182"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/media?parent=184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/categories?post=184"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/tags?post=184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}