{"id":171,"date":"2026-01-19T00:00:00","date_gmt":"2026-01-18T23:00:00","guid":{"rendered":"https:\/\/helloblog.io\/ro\/jquery-4-0-0-release-final-ce-se-schimba\/"},"modified":"2026-01-19T00:00:00","modified_gmt":"2026-01-18T23:00:00","slug":"jquery-4-0-0-release-final-ce-se-schimba","status":"publish","type":"post","link":"https:\/\/helloblog.io\/ro\/jquery-4-0-0-release-final-ce-se-schimba\/","title":{"rendered":"jQuery 4.0.0 a ajuns la release final: ce se schimb\u0103 dup\u0103 aproape 10 ani"},"content":{"rendered":"\n<p>Pe 14 ianuarie 2006, John Resig prezenta pentru prima dat\u0103 jQuery la BarCamp, \u00een New York. La 20 de ani distan\u021b\u0103, echipa jQuery a publicat <strong>release-ul final jQuery 4.0.0<\/strong>, dup\u0103 un ciclu lung de dezvoltare \u0219i mai multe pre-release-uri. Este primul major release \u00een aproape 10 ani \u0219i, inevitabil, aduce \u0219i breaking changes &#8211; dar obiectivul declarat r\u0103m\u00e2ne acela\u0219i: pentru majoritatea proiectelor, upgrade-ul ar trebui s\u0103 fie posibil cu modific\u0103ri minime.<\/p>\n\n\n\n<p>\u00cen jQuery 4.0.0 se simte clar o cur\u0103\u021benie de \u201ebagaj istoric\u201d: cod legacy t\u0103iat, API-uri deprecate eliminate, parametri interni care ajunseser\u0103 (neoficial) \u00een public sco\u0219i din semn\u0103turi, plus renun\u021barea la unele comportamente \u201emagice\u201d care complicau inutil lucrurile.<\/p>\n\n\n\n<p>Pentru tranzi\u021bie exist\u0103 dou\u0103 resurse oficiale importante: <strong>upgrade guide<\/strong> la https:\/\/jquery.com\/upgrade-guide\/4.0\/ \u0219i release-ul pentru <strong>jQuery Migrate plugin<\/strong> la https:\/\/github.com\/jquery\/jquery-migrate\/. Dac\u0103 g\u0103se\u0219ti probleme dup\u0103 upgrade, raportarea se face \u00een tracker-ul de issues: https:\/\/github.com\/jquery\/jquery\/issues.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cum \u00eel instalezi: CDN \u0219i npm (inclusiv varianta slim)<\/h2>\n\n\n\n<p>jQuery 4.0.0 este disponibil pe CDN-ul oficial \u0219i \u00een npm. Pentru CDN, ai link direct c\u0103tre build-urile standard:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>https:\/\/code.jquery.com\/jquery-4.0.0.js<\/li>\n\n\n<li>https:\/\/code.jquery.com\/jquery-4.0.0.min.js<\/li>\n\n<\/ul>\n\n\n\n<p>\u00cen npm \u00eel instalezi cu:<\/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>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: mai mic \u0219i mai \u201emodern\u201d ca filosofie<\/h3>\n\n\n\n<p>Pe l\u00e2ng\u0103 build-ul complet, exist\u0103 \u0219i un <strong>slim build<\/strong> pentru cazurile \u00een care nu ai nevoie de ajax sau preferi libr\u0103rii dedicate pentru request-uri \u0219i pentru situa\u021bii \u00een care anima\u021biile pot fi rezolvate simplu cu CSS + manipulare de clase. \u00cen jQuery 4.0.0, slim build devine \u0219i mai mic deoarece au fost eliminate <strong>Deferreds<\/strong> \u0219i <strong>Callbacks<\/strong> (ajung\u00e2nd la ~19.5k bytes gzipped).<\/p>\n\n\n\n<p>Deferreds suportau de mult standardul <a href=\"https:\/\/promisesaplus.com\/\">Promises A+<\/a>, iar \u00een browserele suportate (cu excep\u021bia IE11) exist\u0103 Promises native, deci \u00een majoritatea proiectelor po\u021bi migra c\u0103tre <code>Promise<\/code> \u0219i metodele aferente. Deferreds au \u0219i capabilit\u0103\u021bi suplimentare fa\u021b\u0103 de Promises native, dar pentru cea mai mare parte din use-case-uri migrarea e fezabil\u0103.<\/p>\n\n\n\n<p>Dac\u0103 trebuie s\u0103 supor\u021bi IE11, recomandarea este s\u0103 r\u0103m\u00e2i pe build-ul complet sau s\u0103 adaugi un polyfill pentru Promises.<\/p>\n\n\n\n<p>Fi\u0219ierele slim sunt disponibile \u0219i pe CDN:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>https:\/\/code.jquery.com\/jquery-4.0.0.slim.js<\/li>\n\n\n<li>https:\/\/code.jquery.com\/jquery-4.0.0.slim.min.js<\/li>\n\n<\/ul>\n\n\n\n<p>Conform anun\u021bului, aceste update-uri sunt deja disponibile ca versiuni curente \u00een npm \u0219i Bower. Pentru restul CDN-urilor publice, distribu\u021bia poate dura c\u00e2teva zile (nu \u021bine de echipa jQuery), iar pentru pornire rapid\u0103 e preferabil CDN-ul oficial: https:\/\/jquery.com\/download\/.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Breaking changes majore \u0219i moderniz\u0103ri importante \u00een jQuery 4.0.0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1) Suport IE <11 eliminat (\u0219i alte browsere foarte vechi)<\/h3>\n\n\n\n<p>jQuery 4.0 renun\u021b\u0103 la suportul pentru <strong>Internet Explorer 10 \u0219i mai vechi<\/strong>. O \u00eentrebare fireasc\u0103 este: de ce nu dispare \u0219i IE11? Planul este o eliminare \u00een etape, iar urm\u0103torul pas este anun\u021bat pentru <strong>jQuery 5.0<\/strong> (men\u021bionat \u00een PR: https:\/\/github.com\/jquery\/jquery\/pull\/5077). \u00cen 4.0, focusul este pe eliminarea codului dedicat strict versiunilor IE mai vechi de 11.<\/p>\n\n\n\n<p>\u00cen plus, au fost eliminate \u0219i alte compatibilit\u0103\u021bi cu browsere foarte vechi, inclusiv:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Edge Legacy (versiunea non-Chromium)<\/li>\n\n\n<li>iOS mai vechi dec\u00e2t ultimele 3 versiuni<\/li>\n\n\n<li>Firefox mai vechi dec\u00e2t ultimele 2 versiuni (cu excep\u021bia Firefox ESR)<\/li>\n\n\n<li>Android Browser<\/li>\n\n<\/ul>\n\n\n\n<p>Conform echipei, \u00een mod normal nu ar trebui s\u0103 fie nevoie de schimb\u0103ri \u00een codul t\u0103u doar din cauza acestei reduceri de suport. Totu\u0219i, dac\u0103 ai cerin\u021be de compatibilitate pentru oricare dintre aceste browsere, recomandarea este s\u0103 r\u0103m\u00e2i pe <strong>jQuery 3.x<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2) Trusted Types \u0219i Content Security Policy (CSP)<\/h3>\n\n\n\n<p>jQuery 4.0 adaug\u0103 suport pentru <strong>Trusted Types<\/strong>, astfel \u00eenc\u00e2t HTML \u00eempachetat \u00een <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/TrustedHTML\">TrustedHTML<\/a> s\u0103 poat\u0103 fi folosit ca input \u00een metodele de manipulare DOM din jQuery f\u0103r\u0103 s\u0103 \u00eencalce directiva CSP <code>require-trusted-types-for<\/code>.<\/p>\n\n\n\n<p>\u00cen paralel, pentru a evita erori CSP asociate cu scripturi inline, echipa a schimbat comportamentul pentru \u00eenc\u0103rcarea asincron\u0103 de scripturi: dac\u0103 anterior unele request-uri AJAX foloseau deja tag-uri <code>&lt;script&gt;<\/code> (ca s\u0103 p\u0103streze atribute precum <code>crossdomain<\/code>), acum <strong>majoritatea request-urilor asincrone de tip script<\/strong> sunt f\u0103cute prin inserarea de <code>&lt;script&gt;<\/code> tags (detalii \u00een PR: https:\/\/github.com\/jquery\/jquery\/pull\/4763).<\/p>\n\n\n\n<p>Exist\u0103 totu\u0219i situa\u021bii \u00een care se folose\u0219te \u00een continuare XHR pentru request-uri asincrone de script &#8211; de exemplu c\u00e2nd este trecut\u0103 op\u021biunea <code>&quot;headers&quot;<\/code> (cu nota explicit\u0103: folose\u0219te <code>scriptAttrs<\/code> \u00een loc). Dar regula general\u0103 \u00een 4.0 este: <strong>folosim <code>&lt;script&gt;<\/code> c\u00e2nd se poate<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3) Sursa jQuery migrat\u0103 de la AMD la ES modules<\/h3>\n\n\n\n<p>Unul dintre cele mai importante upgrade-uri \u201estructurale\u201d este migrarea sursei de pe branch-ul <code>main<\/code> de la <a href=\"https:\/\/requirejs.org\/docs\/whyamd.html\">AMD<\/a> la <strong>ES modules<\/strong> (PR: https:\/\/github.com\/jquery\/jquery\/pull\/4541). Sursa a fost publicat\u0103 de mult pe npm \u0219i GitHub, dar importul direct ca module era complicat f\u0103r\u0103 <a href=\"https:\/\/requirejs.org\/\">RequireJS<\/a>, care fusese \u0219i build tool-ul preferat.<\/p>\n\n\n\n<p>\u00cen jQuery 4.x, procesul de packaging trece la <a href=\"https:\/\/rollupjs.org\/introduction\/\">Rollup<\/a>, iar testele sunt rulate separat \u0219i pentru varianta ES modules. Rezultatul: jQuery devine mai compatibil cu toolchain-uri moderne, cu fluxuri actuale de development \u0219i chiar cu utilizarea direct\u0103 \u00een browser prin <code>&lt;script type=module&gt;<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4) API-uri deprecate eliminate (\u00een sf\u00e2r\u0219it)<\/h3>\n\n\n\n<p>O majoritate de breaking changes vin din eliminarea unor func\u021bii care erau marcate ca deprecated de mai multe versiuni. Unele erau g\u00e2ndite s\u0103 r\u0103m\u00e2n\u0103 doar interne, altele au echivalente native \u00een toate browserele suportate acum de jQuery 4.0.<\/p>\n\n\n\n<p>Lista func\u021biilor eliminate include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>jQuery.isArray<\/code><\/li>\n\n\n<li><code>jQuery.parseJSON<\/code><\/li>\n\n\n<li><code>jQuery.trim<\/code><\/li>\n\n\n<li><code>jQuery.type<\/code><\/li>\n\n\n<li><code>jQuery.now<\/code><\/li>\n\n\n<li><code>jQuery.isNumeric<\/code><\/li>\n\n\n<li><code>jQuery.isFunction<\/code><\/li>\n\n\n<li><code>jQuery.isWindow<\/code><\/li>\n\n\n<li><code>jQuery.camelCase<\/code><\/li>\n\n\n<li><code>jQuery.nodeName<\/code><\/li>\n\n\n<li><code>jQuery.cssNumber<\/code><\/li>\n\n\n<li><code>jQuery.cssProps<\/code><\/li>\n\n\n<li><code>jQuery.fx.interval<\/code><\/li>\n\n<\/ul>\n\n\n\n<p>\u00cen locul lor, se recomand\u0103 echivalentele native precum <code>Array.isArray()<\/code>, <code>JSON.parse()<\/code>, <code>String.prototype.trim()<\/code> \u0219i <code>Date.now()<\/code>.<\/p>\n\n\n\n<p>Efectul combinat dintre eliminarea API-urilor deprecate \u0219i t\u0103ierea codului pentru IE vechi a dus la o reducere de dimensiune de <strong>peste 3k bytes gzipped<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5) Metode interne scoase din prototype: <code>push<\/code>, <code>sort<\/code>, <code>splice<\/code><\/h3>\n\n\n\n<p>Pe <code>jQuery.prototype<\/code> existau de mult ni\u0219te metode de tip Array (<code>push<\/code>, <code>sort<\/code>, <code>splice<\/code>) care nu se comportau ca metodele jQuery obi\u0219nuite \u0219i erau destinate strict uzului intern. \u00cen 4.0 au fost eliminate.<\/p>\n\n\n\n<p>Dac\u0103 (din gre\u0219eal\u0103 sau inten\u021bionat) le foloseai \u00een cod, exemplul oferit este foarte clar: \u00een loc de <code>$elems.push( elem )<\/code>, folose\u0219ti apelul explicit pe Array:<\/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>[].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:#E1E4E8\">[].push.<\/span><span style=\"color:#B392F0\">call<\/span><span style=\"color:#E1E4E8\">( $elems, elem );<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">6) Ordinea evenimentelor de focus\/blur urmeaz\u0103 acum specifica\u021bia W3C<\/h3>\n\n\n\n<p>Istoric, browserele nu au fost de acord asupra ordinii evenimentelor de focus \u0219i blur (<code>focusin<\/code>, <code>focusout<\/code>, <code>focus<\/code>, <code>blur<\/code>). \u00cen cele din urm\u0103, versiunile moderne ale browserelor suportate de jQuery 4.0 au convergent c\u0103tre o ordine comun\u0103, dar aceasta difer\u0103 de ordinea consistent\u0103 pe care jQuery o impusese cu ani \u00een urm\u0103 &#8211; deci da, este un breaking change.<\/p>\n\n\n\n<p>\u00cencep\u00e2nd cu jQuery 4.0, biblioteca nu mai suprascrie comportamentul nativ. Asta \u00eenseamn\u0103 c\u0103 toate browserele (\u00een afar\u0103 de IE) urmeaz\u0103 specifica\u021bia W3C curent\u0103, \u00een aceast\u0103 ordine:<\/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>\u00cen versiunile anterioare, ordinea jQuery era: <code>focusout<\/code>, <code>blur<\/code>, <code>focusin<\/code>, <code>focus<\/code>. Un detaliu interesant: singurul browser care a urmat vechiul W3C spec (\u00eenainte de update-ul din 2023) a fost Internet Explorer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ce e nou pe zona de securitate \u0219i request-uri: note din changelog (Ajax)<\/h2>\n\n\n\n<p>Pe l\u00e2ng\u0103 headline-urile de mai sus, changelog-ul 4.0.0 are o serie de ajust\u0103ri relevante, mai ales \u00een <code>$.ajax<\/code> \u0219i transportul de scripturi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Array-urile din <code>data<\/code> nu mai sunt tratate ca binary (commit: 992a1911)<\/li>\n\n\n<li><code>processData: true<\/code> e permis chiar \u0219i pentru binary data (ce264e07)<\/li>\n\n\n<li>Suport pentru binary data (inclusiv FormData) (a7ed9a7b)<\/li>\n\n\n<li>Suport pentru <code>headers<\/code> \u00een script transport chiar \u0219i cross-domain (#5142, 6d136443)<\/li>\n\n\n<li><code>null<\/code> acceptat ca success function \u00een <code>jQuery.get<\/code> (#4989, 74978b7e)<\/li>\n\n\n<li>Scripturile nu mai sunt auto-executate dac\u0103 nu specifici <code>dataType<\/code> (#4822, 025da4dd)<\/li>\n\n\n<li><code>responseJSON<\/code> func\u021bioneaz\u0103 pentru request-uri JSONP same-domain eronate (68b4ec59)<\/li>\n\n\n<li>Executarea r\u0103spunsurilor de eroare JSONP care sunt script (#4771, a1e619b0)<\/li>\n\n\n<li>Evitarea erorilor CSP \u00een script transport pentru request-uri async (#3969, 07a8e4a1)<\/li>\n\n\n<li>Eliminarea logicii de auto-promovare json -> jsonp (#1799, #3376, e7b3bc48)<\/li>\n\n\n<li>Suprascrierea <code>s.contentType<\/code> cu header-ul content-type dac\u0103 exist\u0103 (#4119, 7fb90a6b)<\/li>\n\n\n<li>Deprecarea alias-urilor de evenimente AJAX; mutarea inline \u00een zona de deprecated (23d53928)<\/li>\n\n\n<li>Nu se execut\u0103 scripturi pentru r\u0103spunsuri HTTP nereu\u0219ite (#4250, 50871a5a)<\/li>\n\n\n<li>Simplificarea <code>jQuery.ajaxSettings.xhr<\/code> (#1967, abdc89ac)<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Alte modific\u0103ri punctuale care pot conta \u00een proiecte mari<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Attributes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>.attr( name, false )<\/code> elimin\u0103 atributul pentru toate atributele non-ARIA (#5388, 063831b6)<\/li>\n\n\n<li>Optimiz\u0103ri mici de dimensiune (b40a4807)<\/li>\n\n\n<li>Setter-ul nu mai face stringify automat pentru atribute (#4948, 4250b628)<\/li>\n\n\n<li>Eliminat semn\u0103tura <code>toggleClass(boolean|undefined)<\/code> (#3388, a4421101)<\/li>\n\n\n<li><code>val()<\/code> refactorizat: nu mai elimin\u0103 carriage return, iar workaround-urile IE sunt izolate (ff281991)<\/li>\n\n\n<li>Hook-ul pentru atributul <code>type<\/code> nu mai este setat \u00een afara IE (9e66fe9a)<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">CSS<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Fix pentru dimensiunile elementelor <code>&lt;col&gt;<\/code> din tabele (#5628, eca2a564)<\/li>\n\n\n<li>Eliminarea cache-ului \u00een <code>finalPropName<\/code> (640d5825)<\/li>\n\n\n<li>Teste reparate + suport pentru teste sub CSS Zoom (#5489, 071f6dba)<\/li>\n\n\n<li>Fix pentru <code>reliableTrDimensions<\/code> c\u00e2nd iframe-urile sunt ini\u021bial ascunse (b1e66a5f)<\/li>\n\n\n<li>Selector: aliniere cu 3.x, eliminat wrapper-ul extern <code>selector.js<\/code> (53cf7244)<\/li>\n\n\n<li><code>reliableTrDimensions<\/code> func\u021bioneaz\u0103 \u0219i cu Bootstrap CSS (#5270, 65b85031)<\/li>\n\n\n<li><code>offsetHeight( true )<\/code> etc. includ marginile negative (#3982, bce13b72)<\/li>\n\n\n<li>Valori whitespace-only pentru CSS variables returneaz\u0103 <code>undefined<\/code> (#5120, 7eb00196)<\/li>\n\n\n<li>Nu se mai face trim pe custom property <code>undefined<\/code> (#5105, ed306c02)<\/li>\n\n\n<li><code>addClass( array )<\/code>: valori falsy sunt ignorate (compress) (#4998, a338b407)<\/li>\n\n\n<li>Justificare \u0219i p\u0103strare <code>rtrim<\/code> pe valori CSS (655c0ed5)<\/li>\n\n\n<li>Trim pentru whitespace \u00een jurul CSS Custom Properties (#4926, efadfe99)<\/li>\n\n\n<li>\u00cen slim build sunt incluse metodele <code>show<\/code>, <code>hide<\/code> \u0219i <code>toggle<\/code> (297d18dd)<\/li>\n\n\n<li>Eliminat opacity CSS hook (865469f5)<\/li>\n\n\n<li>Workaround pentru getComputedStyle problematic pe table rows \u00een IE\/Edge (#4490, 26415e08)<\/li>\n\n\n<li>Nu se mai adaug\u0103 automat <code>px<\/code> la propriet\u0103\u021bi, cu c\u00e2teva excep\u021bii (#2795, 00a9c2e5)<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Core<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Eliminate workaround-uri obsolete, update la comentariile de suport (e2fe97b7)<\/li>\n\n\n<li><code>$.parseHTML<\/code> trece de la <code>document.implementation<\/code> la <code>DOMParser<\/code> (0e123509)<\/li>\n\n\n<li>Fix exports pentru bundlers, compatibilitate ESM &#038; CommonJS (#5416, 60f11b58)<\/li>\n\n\n<li>Mai multe detalii despre named exports (5f869590)<\/li>\n\n\n<li>Cod simplificat dup\u0103 reducerea suportului de browsere (93ca49e6)<\/li>\n\n\n<li>Factory mutat \u00een exports separate (46f6e3da)<\/li>\n\n\n<li>Named exports \u00een <code>src\/<\/code> (#5262, f75daab0)<\/li>\n\n\n<li>Fix regresie \u00een <code>jQuery.text()<\/code> pe obiecte HTMLDocument (#5264, a75d6b52)<\/li>\n\n\n<li><code>jQuery.contains<\/code> mutat din selector \u00een core (024d8719)<\/li>\n\n\n<li>Eliminat parametrul <code>root<\/code> din <code>jQuery.fn.init<\/code> (d2436df3)<\/li>\n\n\n<li>Nu se mai bazeaz\u0103 pe existen\u021ba lui <code>splice<\/code> pe input (9c6f64c7)<\/li>\n\n\n<li>Manipulation: suport de baz\u0103 TrustedHTML (#4409, de5398a6)<\/li>\n\n\n<li>Raportarea erorilor browserului \u00een <code>parseXML<\/code> (#4784, 89697325)<\/li>\n\n\n<li><code>jQuery.isXMLDoc<\/code> accept\u0103 input falsy (#4782, fd421097)<\/li>\n\n\n<li>Eliminat suportul pentru Edge Legacy (#4568, e35fb62d)<\/li>\n\n\n<li>Iframe script ruleaz\u0103 \u00een contextul lui; <code>globalEval<\/code> prime\u0219te param doc (#4518, 4592595b)<\/li>\n\n\n<li>Excluderea modulelor callbacks &#038; deferred \u0219i din slim build (fbc44f52)<\/li>\n\n\n<li>Migrarea AMD -> ES modules (d0ce00cd)<\/li>\n\n\n<li>Folose\u0219te <code>Array.prototype.flat<\/code> unde e suportat (#4320, 9df4f1de)<\/li>\n\n\n<li>Elimin\u0103 copii private de <code>push<\/code>, <code>sort<\/code>, <code>splice<\/code> din prototype (b59107f5)<\/li>\n\n\n<li>Introduce <code>.even()<\/code> &#038; <code>.odd()<\/code> ca \u00eenlocuitor pentru pseudo <code>:even<\/code> &#038; <code>:odd<\/code> (78420d42)<\/li>\n\n\n<li>Deprecarea <code>jQuery.trim<\/code> (\u00eenainte de eliminare) (#4363, 5ea59460)<\/li>\n\n\n<li>Elimin\u0103 IE-specific support tests, se bazeaz\u0103 pe <code>document.documentMode<\/code> (#4386, 3527a384)<\/li>\n\n\n<li>Elimin\u0103 suport IE <11, iOS <11, Firefox <65, Android Browser &#038; PhantomJS (#3950, #4299, cf84696f)<\/li>\n\n\n<li>Elimin\u0103 API-urile deprecate jQuery (#4056, 58f0c00b)<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Data<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Refactor pentru reducerea dimensiunii (805cdb43)<\/li>\n\n\n<li>Event\/Manipulation: prevenirea coliziunilor cu <code>Object.prototype<\/code> (#3256, 9d76c0b1)<\/li>\n\n\n<li>Separ\u0103 implement\u0103rile camelCase pentru data &#038; css\/effects (#3355, 8fae2120)<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Deferred<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>getStackHook<\/code> redenumit \u00een <code>getErrorHook<\/code> (#5201, 258ca1ec)<\/li>\n\n\n<li><code>jQuery.Deferred.exceptionHook<\/code> respect\u0103 source maps (#3179, 0b9c5037)<\/li>\n\n\n<li>Rename master -> primary (a32cf632)<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Deprecated<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>.hover()<\/code> definit folosind metode non-deprecate (fd6ffc5e)<\/li>\n\n\n<li>Elimin\u0103 <code>jQuery.trim<\/code> (0b676ae1)<\/li>\n\n\n<li>Fix pentru ordinea parametrilor AMD (f810080e)<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Dimensions<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Fallback <code>offset<\/code> \u00een Firefox pentru dimensiuni TR nesigure (#4529, 3bbbc111)<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Effect \/ Effects<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Fix pentru un conditional inutil \u00een <code>.stop()<\/code> (#4374, 110802c7)<\/li>\n\n\n<li>Elimin\u0103 <code>jQuery.fx.interval<\/code> (6c2c7362)<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Event<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Folose\u0219te <code>.preventDefault()<\/code> \u00een <code>beforeunload<\/code> (7c123dec)<\/li>\n\n\n<li>Robuste\u021be crescut\u0103 pentru un inner native event \u00een <code>leverageNative<\/code> (#5459, 527fb3dc)<\/li>\n\n\n<li>Evit\u0103 coliziuni \u00eentre <code>jQuery.event.special<\/code> \u0219i <code>Object.prototype<\/code> (bcaeb000)<\/li>\n\n\n<li>Simplific\u0103 verificarea pentru saved data \u00een <code>leverageNative<\/code> (dfe212d5)<\/li>\n\n\n<li><code>trigger(focus\/blur\/click)<\/code> func\u021bioneaz\u0103 cu native handlers (#5015, 6ad3651d)<\/li>\n\n\n<li>Simuleaz\u0103 focus\/blur \u00een IE via focusin\/focusout (#4856, #4859, #4950, ce60d318)<\/li>\n\n\n<li>Fix: trigger focus nu se rupe dup\u0103 <code>.on(focus).off(focus)<\/code> (#4867, e539bac7)<\/li>\n\n\n<li>Fix: re-trigger focus nu refocus-eaz\u0103 elementul original (#4382, dbcffb39)<\/li>\n\n\n<li>Nu mai face crash dac\u0103 un element e eliminat pe blur (#4417, 5c2d0870)<\/li>\n\n\n<li>Elimin\u0103 shim-ul pentru <code>event.which<\/code> (#3235, 1a5fff4c)<\/li>\n\n\n<li>Elimin\u0103 <code>jQuery.event.global<\/code> (18db8717)<\/li>\n\n\n<li>Ata\u0219eaz\u0103 events doar la obiecte care accept\u0103 data (pe bune) (#4397, d5c505e3)<\/li>\n\n\n<li>Nu mai shimmuie\u0219te focusin\/focusout (#4300, 8a741376)<\/li>\n\n\n<li>Previne duplicate dummy handlers \u00een <code>leverageNative<\/code> (eb6c0a7c)<\/li>\n\n\n<li>Fix pentru multiple async focus events (#4350, ddfa8376)<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Manipulation<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>jQuery.cleanData<\/code> nu mai sare elemente \u00een timpul cleanup (#5214, 3cad5c43)<\/li>\n\n\n<li>Generalizeaz\u0103 un test pentru suport IE (88690ebf)<\/li>\n\n\n<li>Suport pentru <code>$el.html(selfRemovingScript)<\/code> (#5378 \/ #5377, 937923d9)<\/li>\n\n\n<li>Extract <code>domManip<\/code> \u00eentr-un fi\u0219ier separat (ee6e8740)<\/li>\n\n\n<li>Nu mai elimin\u0103 HTML comments din scripts (#4904, 2f8f39e4)<\/li>\n\n\n<li>Respect\u0103 atributul <code>crossorigin<\/code> pe script \u00een DOM manipulation (#4542, 15ae3614)<\/li>\n\n\n<li>Evit\u0103 concatenarea de stringuri \u00een <code>buildFragment<\/code> (9c98e4e8)<\/li>\n\n\n<li><code>jQuery.htmlPrefilter<\/code> devine identity function (90fed4b4)<\/li>\n\n\n<li>Selector: folose\u0219te utilitarul <code>nodeName<\/code> unde e posibil pentru a salva dimensiune (4504fc3d)<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Offset<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Cre\u0219te search depth c\u00e2nd g\u0103se\u0219te \u201ereal\u201d offset parent (556eaf4a)<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Selector<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Elimin\u0103 workaround pentru <code>:has<\/code>; teste pe iPhone &#038; iPad (65e35450)<\/li>\n\n\n<li>Depreciaz\u0103 corect <code>jQuery.expr[ &quot;:&quot; ]<\/code>\/<code>jQuery.expr.filters<\/code> (329661fd)<\/li>\n\n\n<li><code>selector.js<\/code> depinde de <code>attributes\/attr.js<\/code> (#5379, e06ff088)<\/li>\n\n\n<li>Elimin\u0103 dependen\u021be <code>selector.js<\/code> din diverse module (e8b7db4b)<\/li>\n\n\n<li>Re-expune <code>jQuery.find.{tokenize,select,compile,setDocument}<\/code> (#5259, 338de359)<\/li>\n\n\n<li>Nu mai depinde de <code>CSS.supports( &quot;selector(...)&quot; )<\/code> (#5194, 68aa2ef7)<\/li>\n\n\n<li>Backport logic\u0103 de context de selec\u021bie c\u0103tre selector-native (#5185, 2e644e84)<\/li>\n\n\n<li>Selector lists func\u021bioneaz\u0103 din nou cu <code>qSA<\/code> (#5177, 09d988b7)<\/li>\n\n\n<li>Metoda chainable <code>uniqueSort<\/code> (#5166, 5266f23c)<\/li>\n\n\n<li>Re-introduce <code>selector-native.js<\/code> (4c1171f2)<\/li>\n\n\n<li>Fix DOM manip \u00een <code>template<\/code> contents (#5147, 3299236c)<\/li>\n\n\n<li>Elimin\u0103 suport pentru legacy pseudos; testeaz\u0103 custom pseudos (8c7da22c)<\/li>\n\n\n<li>Folose\u0219te <code>:has<\/code> din jQuery dac\u0103 <code>CSS.supports(selector(...))<\/code> e non-compliant (#5098, d153c375)<\/li>\n\n\n<li>Elimin\u0103 workaround-ul pentru <code>a:enabled<\/code> \u00een Chrome <=77 (c1ee33ad)<\/li>\n\n\n<li>Fix: empty attribute selectors func\u021bioneaz\u0103 din nou \u00een IE (#4435, 05184cc4)<\/li>\n\n\n<li>Compar\u0103 documente shallow \u00een <code>uniqueSort<\/code> (#4441, 15750b0a)<\/li>\n\n\n<li>Test pentru aruncare pe selectori invalizi post-virgul\u0103 (6eee5f7f)<\/li>\n\n\n<li>Selectorii cu leading combinators folosesc din nou <code>qSA<\/code> (ed66d5a2)<\/li>\n\n\n<li>Compar\u0103ri shallow pentru a evita crash-uri IE\/Edge (#4441, aa6344ba)<\/li>\n\n\n<li>Reduce dimensiunea, simplific\u0103 <code>setDocument<\/code> (29a9544a)<\/li>\n\n\n<li>Folose\u0219te pseudo-clasa <code>:scope<\/code> unde e posibil (#4453, df6a7f7f)<\/li>\n\n\n<li>Readuce shortcut-ul <code>querySelectorAll<\/code> (cef4b731)<\/li>\n\n\n<li>Inline Sizzle \u00een selector module (47835965)<\/li>\n\n\n<li>Port Sizzle tests la jQuery (79b74e04)<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Support<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Se asigur\u0103 c\u0103 display e setat la block pentru support div (#4832, 09f25436)<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Traversing<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Fix <code>contents()<\/code> pe <code>&lt;object&gt;<\/code> cu copii \u00een IE (ccbd6b93)<\/li>\n\n\n<li>Fix <code>contents()<\/code> pe <code>&lt;object&gt;<\/code> cu copii (#4384, 4d865d96)<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Moment aniversar: 20 de ani de jQuery<\/h2>\n\n\n\n<p>Lansarea 4.0.0 vine \u0219i cu o not\u0103 de \u201ereuniune\u201d: echipa men\u021bioneaz\u0103 c\u0103 mul\u021bi contributori s-au \u00eent\u00e2lnit \u00een Dallas pentru un reunion, iar John Resig a intrat chiar \u0219i prin Zoom. Postarea despre release a fost publicat\u0103 \u00een timp ce erau \u00eempreun\u0103.<\/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\/10\/2026\/01\/jquery-reunion-group-edited.jpeg\" alt=\"Fotografie de grup de la reuniunea jQuery (20 de ani)\" class=\"wp-image-170\" srcset=\"https:\/\/helloblog.io\/app\/uploads\/sites\/10\/2026\/01\/jquery-reunion-group-edited.jpeg 1804w, https:\/\/helloblog.io\/app\/uploads\/sites\/10\/2026\/01\/jquery-reunion-group-edited-300x226.jpeg 300w, https:\/\/helloblog.io\/app\/uploads\/sites\/10\/2026\/01\/jquery-reunion-group-edited-1024x771.jpeg 1024w, https:\/\/helloblog.io\/app\/uploads\/sites\/10\/2026\/01\/jquery-reunion-group-edited-768x579.jpeg 768w, https:\/\/helloblog.io\/app\/uploads\/sites\/10\/2026\/01\/jquery-reunion-group-edited-1536x1157.jpeg 1536w, https:\/\/helloblog.io\/app\/uploads\/sites\/10\/2026\/01\/jquery-reunion-group-edited-400x301.jpeg 400w\" sizes=\"auto, (max-width: 1804px) 100vw, 1804px\" \/><figcaption class=\"wp-element-caption\"><em>Forr\u00e1s: blog.jquery.com \/ The jQuery Foundation<\/em><\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Changelog complet \u0219i resurse utile<\/h2>\n\n\n\n<p>Pentru lista complet\u0103 de schimb\u0103ri, compararea oficial\u0103 este aici: <strong>Full changelog: 4.0.0<\/strong> \u2013 https:\/\/github.com\/jquery\/jquery\/compare\/3.7.1&#8230;4.0.0.<\/p>\n\n\n\n<p>Dac\u0103 faci upgrade \u00eentr-un proiect existent, \u00eencepe cu ghidul oficial (https:\/\/jquery.com\/upgrade-guide\/4.0\/) \u0219i ruleaz\u0103 jQuery Migrate (https:\/\/github.com\/jquery\/jquery-migrate\/) ca s\u0103 prinzi rapid API-urile eliminate sau comportamentele care s-au schimbat.<\/p>\n\n\n<div class=\"references-section\">\n                <h2>Referin\u021be \/ Surse<\/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 (3.7.1&#8230;4.0.0)<\/a><\/li><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>jQuery 4.0.0 este primul major release dup\u0103 aproape un deceniu \u0219i vine cu moderniz\u0103ri reale: suport IE <11 eliminat, compatibilitate mai bun\u0103 cu CSP\/Trusted Types \u0219i sursa migrat\u0103 la ES modules.\n<\/p>\n","protected":false},"author":31,"featured_media":169,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[88],"tags":[90,91,92,48,89],"class_list":["post-171","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-limbaje-de-programare","tag-csp","tag-es-modules","tag-front-end","tag-javascript","tag-jquery"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/posts\/171","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/users\/31"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/comments?post=171"}],"version-history":[{"count":0,"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/posts\/171\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/media\/169"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/media?parent=171"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/categories?post=171"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/tags?post=171"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}