Към съдържанието
jQuery 4.0.0: 20 години по-късно библиотеката става по-модерна (и малко по-строга)
Георги Петров
Георги Петров 19 January 2026 · 5 мин. четене

jQuery 4.0.0: 20 години по-късно библиотеката става по-модерна (и малко по-строга)

На 14 януари 2006 г. John Resig представя jQuery на BarCamp в Ню Йорк. Двадесет години по-късно екипът пуска финалния jQuery 4.0.0 – първата major версия от почти 10 години насам. Релийзът идва след дълъг цикъл на разработка и няколко pre-release издания и носи сериозна доза модернизация, но и breaking промени.

Добрата новина: очакването е, че повечето проекти ще минат към 4.0 с минимални корекции. Лошата (или просто реалистичната): в тази версия има промени, които екипът е искал да направи от години, но не е могъл да си позволи в patch/minor релийзи – премахнат е legacy код, изчистени са отдавна deprecated API-та, махнати са недокументирани вътрешни параметри от публични функции и са ограничени някои „магически“ поведения, които усложняваха библиотеката.

Преди да ъпгрейднеш

Ползвай официалния upgrade guide и jQuery Migrate плъгина за прехода към 4.0. Ако удариш проблем, репортвай го в GitHub issues на проекта.

Официалните помощни ресурси за миграция са тук: Upgrade guide и jQuery Migrate plugin release. А за бъгове/регресии: jQuery issues.

Как да го вземеш: CDN и npm (включително slim билд)

jQuery 4.0.0 е наличен в официалния CDN и в npm. Вероятно ще се появи и в third‑party CDN-и, но там графикът не зависи от екипа на jQuery и е нормално да има закъснение.

CDN линкове (пълния билд)

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

Инсталация от npm

npm install jquery@4.0.0

Slim билд (без ajax, effects, Deferreds и Callbacks)

jQuery 4.0.0 продължава да предлага „slim“ вариант за случаи, в които не ти трябват ajax модулите или предпочиташ отделна библиотека за заявки, както и когато анимациите са решени чрез CSS и манипулация на класове. Новото тук е, че slim билдът става още по-малък – с премахването на Deferreds и Callbacks е около 19.5k bytes gzipped.

Deferreds отдавна покриват стандарта Promises A+, така че в повечето случаи можеш да преминеш към native Promises. Те са налични във всички поддържани от jQuery браузъри с изключение на IE11. Deferreds имат и екстри, които native Promises не покриват, но масовите сценарии обикновено се мигрират сравнително директно към Promise API.

Ако още поддържаш IE11

За проекти с IE11 е по-безопасно да останеш на main build-а на jQuery или да добавиш polyfill за native Promises, ако държиш на slim.

Slim файловете са налични и в npm пакета, и в CDN:

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

Всички официални начини за доставка са описани на: https://jquery.com/download/.

Основните промени в jQuery 4.0.0 (и защо са важни)

1) Поддръжката за IE < 11 е премахната

jQuery 4.0 изцяло спира поддръжката за IE10 и по-старите версии. Логичният въпрос е „защо не и IE11?“. Планът е това да стане на етапи – следващата стъпка е планирана за jQuery 5.0 (виж: https://github.com/jquery/jquery/pull/5077). Засега от кода са изчистени специалните обходни решения за IE версии по-стари от 11.

Паралелно с това екипът спира поддръжка и за други много стари браузъри: Edge Legacy, iOS версии по-стари от последните 3, Firefox версии по-стари от последните 2 (с изключение на Firefox ESR) и Android Browser.

Трябва ли да променяш нещо?

Според релийза не би трябвало да са нужни промени при отпадането на тези стари браузъри. Ако обаче проектът ти реално трябва да ги поддържа, остани на jQuery 3.x.

2) Trusted Types и CSP: по-малко главоболия със сигурността

jQuery 4.0 добавя поддръжка за Trusted Types – механизъм, който помага да се ограничат XSS клас атаки чрез контрол върху това как се подават „опасни“ string стойности към DOM sink-ове. На практика това означава, че HTML, обвит в TrustedHTML, може да се подава към методи за DOM манипулация на jQuery, без да нарушава CSP директивата require-trusted-types-for.

Има и важна промяна в AJAX поведението при зареждане на скриптове: част от async script заявките вече по подразбиране минават през <script> тагове, вместо inline scripts, за да се избегнат CSP грешки. Преди някои заявки вече използваха <script> тагове, за да се запазят атрибути като crossdomain, но в 4.0 подходът е разширен – „когато е възможно“, jQuery избира <script> таг.

Все пак остават случаи, в които се ползва XHR за async script request – например когато е подадена опцията "headers". В този сценарий препоръката е да използваш scriptAttrs вместо headers.

3) Изходният код на jQuery премина към ES modules

Една от най-съществените „инженерни“ промени: сорсът на jQuery в main branch вече е мигриран от AMD към ES modules. Исторически jQuery публикуваше сорса си в npm и GitHub, но директният import като модули не беше практичен без RequireJS – build инструментът, който jQuery ползваше дълго време.

Сега пакетиране се прави с Rollup, а тестовете се пускат отделно и върху ES module вариантите. Реалният ефект за нас като разработчици е по-добра съвместимост с модерни bundler-и и workflow-и, както и възможност за употреба през <script type=module> в браузъра.

4) Махнати deprecated API-та (време беше)

jQuery 4.0 маха функции, които са били deprecated през няколко версии назад – или защото винаги са били мислени като вътрешни, или защото вече имат native еквиваленти във всички поддържани браузъри. Списъкът на премахнатите API-та включва:

  • 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

Типичните заместители са native методи като Array.isArray(), JSON.parse(), String.prototype.trim() и Date.now().

Комбинацията от премахнатите deprecated API-та и изчистването на IE-legacy кода води до намаляване на размера с над 3k bytes gzipped.

5) Премахнати internal-only методи от jQuery prototype

jQuery прототипът от години съдържаше Array методи, които не се държаха като останалите jQuery методи и реално са били предназначени само за вътрешна употреба: push, sort и splice. В 4.0 те са махнати.

Ако някъде разчиташ на нещо от типа $elems.push( elem ), еквивалентът е да извикаш array метода върху jQuery колекцията чрез call:

// Преди (вече не в jQuery 4.0)
// $elems.push(elem);

// Сега
[].push.call($elems, elem);

6) Редът на focus събитията вече следва W3C спецификацията

Дълго време браузърите не бяха на едно мнение за реда на focus/blur събитията (включително focusin, focusout, focus, blur). При последните версии на браузърите, които jQuery 4.0 поддържа, има конвергенция към общ ред. Проблемът: този ред се различава от последователността, която jQuery беше наложил преди години, което прави промяната breaking.

От jQuery 4.0 библиотеката вече не override-ва native поведението. Така всички браузъри (с изключение на IE) следват текущата W3C спецификация със следния ред:

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

В предишните версии на jQuery редът беше: focusout, blur, focusin, focus. Иронично – единственият браузър, който някога е следвал старата W3C спецификация (преди обновяването ѝ през 2023), е бил Internet Explorer.

7) Slim билдът е обновен и още по-малък

Освен че 4.0 slim билдът премахва Deferreds и Callbacks (и стига ~19.5k bytes gzipped), релийзът подчертава, че днес размерът на jQuery рядко е ключов performance проблем. Все пак slim вариантът е около 8k gzipped bytes по-малък от regular build-а, което е приятно за проекти, които търсят минимална доставка.

Changelog: какво се е променило по модул (пълен списък)

По-долу е пълният changelog, структуриран по области. За сравнение на таговете и всички комити виж: Full changelog: 4.0.0.

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)

jQuery 4.0.0 като „практичен“ ъпгрейд

Ако поддържаш WordPress теми/плъгини, legacy admin интерфейси, стари корпоративни проекти или просто код, който от години разчита на jQuery, 4.0 е релийзът, който най-накрая вкарва библиотеката изцяло в 2026: по-малко поддръжка на ретро браузъри, по-добро поведение при CSP, ES modules в сорса и премахване на API-та, които отдавна имат native алтернатива.

Ключовото е да планираш ъпгрейда като малка миграция, а не като „drop-in“ подмяна: прегледай изрично focus/blur логиката, провери дали някъде използваш премахнати API-та или prototype array методи, и ако още имаш клиенти с IE<11 – остани на 3.x.

20 години jQuery: среща на екипа

Покрай 20-годишнината много хора от общността и свързаните проекти са се събрали на reunion в Далас, а John Resig се е включил по Zoom. Публикуването на 4.0.0 съвпада с тази среща.

Групова снимка от reunion срещата на jQuery общността
Forrás: Official jQuery Blog

Присъединете се към общността на HelloWP!

Разговаряйте с нас за WordPress и уеб разработка и споделяйте опит с други разработчици.

- членове
- онлайн
Присъединяване

Използваме бисквитки, за да подобрим вашето изживяване. Продължавайки, вие се съгласявате с нашата Политика за бисквитки.