jQuery 4.0: что нового и как перейти с версии 3.x
Опубликовано: 26.09.2026 · Обновлено: 26.09.2026 · Актуально для jQuery 3.7.1 и 4.0.0
17 января 2026 года вышел jQuery 4.0.0 — первый мажорный релиз почти за десять лет, приуроченный к 20-летию библиотеки. Из ядра убрали методы, которые дублируют возможности современного JavaScript (jQuery.isArray, jQuery.parseJSON, jQuery.trim и другие), прекратили поддержку IE 10 и старше, Edge Legacy и устаревших мобильных браузеров, изменили поведение Ajax, CSS и .data(). Для большинства сайтов на jQuery 3.7.1 переход на 4.0 проходит без больших переделок — если сначала прогнать код через jQuery Migrate и разобрать предупреждения в консоли.
Коротко: что изменилось
- Прекращена поддержка IE 10 и старше и Edge Legacy (не-Chromium); из современных версий IE остаётся только IE 11.
- Из ядра удалены утилиты-дублёры нативного JS:
jQuery.isArray, jQuery.isFunction, jQuery.isNumeric, jQuery.isWindow, jQuery.parseJSON, jQuery.trim, jQuery.type, jQuery.now, jQuery.nodeName, jQuery.camelCase, jQuery.cssProps, jQuery.fx.interval и другие.
$.ajax() больше не превращает dataType: "json" в JSONP автоматически и не выполняет полученные скрипты без явного dataType: "script".
.css() добавляет px к числу без единиц только для размеров, отступов, рамок и координат — для остальных свойств единицу нужно указывать явно.
- Удалена сигнатура
.toggleClass(булево) без имени класса — только с указанием класса.
.data() возвращает объект без прототипа: hasOwnProperty у него может не быть.
- Slim-сборка больше не включает
Deferred, Callbacks и очереди (queue) — для них нужна полная сборка.
- Исходный код переведён с AMD на ES-модули, появился
package.json#exports, для Node без DOM нужен отдельный вход jquery/factory.
- Добавлена поддержка Trusted Types и правки для CSP: асинхронная загрузка скриптов через
$.ajax() теперь всегда идёт через тег <script>.
- Событие
focusin/focusout больше не эмулируется вручную — порядок событий теперь соответствует спецификации W3C.
Дальше — подробно: что и почему сломалось, и как перейти без сюрпризов.
Хронология версий
Наш справочник изначально описывает jQuery в редакции 1.4 — это стоит держать в голове, читая страницы раздела API: часть методов, показанных там «как есть», к 2026 году уже устарела или удалена. Вот основные вехи:
| Версия | Когда вышла | Что важно знать |
| 1.x | 2006 (1.0 — август 2006) | Поддерживала IE 6+; ветка, которую описывают исторические страницы этого справочника (jQuery 1.4). |
| 2.x | с 2013 | Тот же API, что и 1.x, но без поддержки IE 6–8 — для проектов, которым старые IE не нужны. |
| 3.0 | 2016 | Первая большая чистка API: удалены .andSelf(), .size(), .context, .selector, событийные шорткаты .load()/.unload()/.error(); методы .bind()/.delegate() объявлены нежелательными (deprecated). |
| 3.5 | 2020 | Патч безопасности: закрыты XSS-уязвимости в обработке HTML-строк (htmlPrefilter), связанные с CVE-2020-11022 и CVE-2020-11023. Актуально для любых старых копий 1.x/2.x/3.0–3.4, которые ещё встречаются на легаси-проектах. |
| 3.7.1 | 2023 | Последний релиз ветки 3.x на сегодня; стабильный вариант для проектов, которым рано на 4.0. |
| 4.0.0 | 17.01.2026 | Первый мажорный релиз почти за 10 лет, приурочен к 20-летию jQuery; удаление устаревших API и смена минимальных требований к браузерам. |
Если сайт до сих пор работает на jQuery 1.x или 2.x без обновлений — переход на 4.0 «одним шагом» невозможен и не нужен: сначала стоит закрыть уязвимости, подключив хотя бы 3.7.1 (см. раздел «Как обновиться с 1.x/2.x»).
Поддержка браузеров в 4.0
jQuery 4.0 сузил список поддерживаемых браузеров — это самое чувствительное изменение для сайтов с возрастной аудиторией (госсектор, корпоративные интранеты, регионы с медленным обновлением техники).
| Браузер | Поддержка в jQuery 4.0 |
| Internet Explorer | только версия 11; IE 10 и старше — не поддерживаются |
| Edge Legacy (не на Chromium) | не поддерживается |
| Chrome, Edge (Chromium), Firefox, Safari (десктоп) | текущая версия и предыдущая (current и current−1) |
| Safari на iOS | текущая версия и две предыдущие (current, current−1, current−2) |
| Android (браузер по умолчанию) | текущая версия и предыдущая (current и current−1) |
Команда jQuery прямо написала в анонсе релиза, что поддержка IE будет сворачиваться поэтапно и следующим шагом станет её полное удаление в jQuery 5.0 — но конкретной даты выхода 5.0 пока нет, поэтому ориентироваться на неё рано.
Удалённые методы и чем их заменить
Это главная причина, по которой старый код может перестать работать после обновления версии в теге <script>. В таблице — методы, убранные именно в 4.0, и их замена нативными средствами JavaScript.
| Удалено в 4.0 | Чем заменить |
jQuery.isArray(x) | Array.isArray(x) |
jQuery.isFunction(x) | typeof x === "function" |
jQuery.isNumeric(x) | Number.isFinite(x) (или своя проверка, если нужна поддержка строк вида "3.14") |
jQuery.isWindow(x) | x != null && x === x.window |
jQuery.nodeName(elem, name) | elem.nodeName.toLowerCase() === name |
jQuery.now() | Date.now() |
jQuery.parseJSON(str) | JSON.parse(str) |
jQuery.trim(str) | str.trim() |
jQuery.type(x) | typeof x, Array.isArray(x), instanceof или Object.prototype.toString.call(x) — по ситуации |
jQuery.unique(arr) | jQuery.uniqueSort(arr) (переименован ещё раньше, старое имя работало до 4.0) |
jQuery.camelCase(str) | не документировался, использовался только внутри jQuery — своей реализации обычно не требуется |
jQuery.cssProps | внутренняя таблица имён CSS-свойств, в современных браузерах не нужна |
jQuery.fx.interval | убран как несовместимый с requestAnimationFrame; способа задать интервал вручную больше нет |
jQuery.Deferred.getStackHook | jQuery.Deferred.getErrorHook (новое имя того же хука) |
методы push, sort, splice на прототипе jQuery | не документировались; вместо перебора коллекции jQuery как массива используйте .toArray() или .get() |
Что убрали ещё в 3.0 (и почему это важно сейчас)
Часть API, которую наши исторические страницы (в редакции jQuery 1.4) описывают как рабочую, была удалена ещё в jQuery 3.0 — то есть не работает уже несколько лет, независимо от перехода на 4.0:
- .andSelf() — убран, используйте
.addBack();
- событийные шорткаты
.load(), .unload(), .error() — убраны как способ навесить обработчик события; вместо них — .on("load", …), .on("unload", …), .on("error", …). Метод .load() как способ подгрузить HTML через Ajax никуда не делся, это другая функция с тем же именем;
.size() — убран, используйте свойство .length;
- .context и
.selector — убраны, для отладки используйте DOM-инспектор или собственные обёртки.
А вот .bind(), .unbind(), .delegate(), .undelegate() в 4.0 не удалены — они помечены нежелательными (deprecated) ещё в 3.0 и продолжают работать, но в jQuery Migrate 4.0 по ним выводится предупреждение, а команда jQuery не исключает их удаление в одном из следующих мажорных релизов. Менять их на .on() и .off() стоит уже сейчас: у .bind() и .on() аргументы совпадают, а у .delegate(селектор, событие, обработчик) при переходе на .on(событие, селектор, обработчик) меняется порядок первых двух аргументов.
Изменения поведения
Эти изменения не всегда видны сразу — код не падает с ошибкой, а начинает вести себя иначе. Их сложнее поймать, чем удалённый метод, который сразу бросит TypeError.
Ajax
В jQuery.ajax() убрано автоматическое превращение JSON-запроса в JSONP по наличию параметра jsonp — это было источником скрытого выполнения чужого кода, если сервер отвечал неожиданным образом.
// было (jQuery 3.x) — при наличии параметра jsonp тип мог смениться на JSONP автоматически
$.ajax({
url: "https://api.example.com/data",
dataType: "json",
jsonp: "callback"
});
// стало (jQuery 4.0) — JSONP нужно указывать явно
$.ajax({
url: "https://api.example.com/data",
dataType: "jsonp"
});
Второе изменение: скрипты, полученные через Ajax, больше не выполняются автоматически без явного dataType: "script" — раньше это касалось только междоменных запросов, теперь распространяется и на запросы к своему домену.
// стало (jQuery 4.0) — без dataType скрипт будет загружен, но не выполнен
$.ajax({
url: "/static/widget.js",
dataType: "script"
});
// либо короче, через отдельный метод
$.getScript("/static/widget.js");
Ещё одно следствие изменений вокруг CSP: асинхронные запросы скриптов (dataType: "script", $.getScript()) теперь всегда выполняются через вставку тега <script src>, а не через XHR с последующим выполнением текста — если на сайте настроена жёсткая Content Security Policy, стоит перепроверить её после обновления. Из плюсов — $.ajax() корректнее работает с FormData и бинарными данными в теле запроса.
CSS: единицы измерения
В jQuery 3.x .css() дописывал px к любому числу, если свойство не было в списке «безразмерных» (jQuery.cssNumber: opacity, z-index, line-height и т. п.). В 4.0 логика перевёрнута: px добавляется только к фиксированному набору свойств — width/height (и их min-/max- варианты), margin*, padding*, border*-width, top/right/bottom/left. Для всех остальных свойств число передаётся как есть.
// работает одинаково в 3.x и 4.0 — для width px добавляется автоматически
$("div").css("width", 100); // width: 100px
// было (jQuery 3.x)
$("p").css("font-size", 18); // font-size: 18px
// стало (jQuery 4.0) — font-size не входит в список «автоматических px»
$("p").css("font-size", 18); // "18" — невалидное значение, стиль не применится
$("p").css("font-size", "18px"); // единицу нужно указывать явно
Чаще всего это задевает font-size, letter-spacing, gap, border-radius, flex-basis и пользовательские свойства — ищите в коде вызовы .css() и .animate() с числами для таких свойств.
Заодно убран отдельный CSS-хук для opacity: чтение .css("opacity") у элемента, не подключённого к документу, в современных браузерах теперь возвращает пустую строку, а не "1", как раньше.
toggleClass() без имени класса
Сигнатура .toggleClass(булево) — без указания класса, только с флагом true/false/undefined — была нежелательной с 3.0 и в 4.0 удалена: слишком часто она приводила к тому, что при значении undefined у элемента неожиданно снимались вообще все классы.
// было (jQuery 3.x) — если isActive === undefined, снимались ВСЕ классы элемента
$el.toggleClass(isActive);
// стало (jQuery 4.0) — нужно явно указать класс(ы) или разветвить логику
$el.toggleClass("active", isActive);
// если isActive реально может быть undefined и нужно поведение "просто переключить"
if (isActive === undefined) {
$el.toggleClass("active");
} else {
$el.toggleClass("active", isActive);
}
Порядок событий focus/blur/focusin/focusout
Раньше jQuery вручную эмулировал всплытие focusin/focusout там, где браузер делал это иначе или не делал вовсе. В 4.0 эта эмуляция убрана, и порядок событий теперь соответствует тому, что выдаёт сам браузер по спецификации W3C: blur, focusout, focus, focusin. В части браузеров (в первую очередь старых версий IE) это может немного изменить порядок срабатывания обработчиков — стоит перепроверить код, если логика завязана именно на порядке, а не на факте события.
.data() и объект без прототипа
Метод .data() теперь возвращает объект, созданный без прототипа Object.prototype. Это защищает от коллизий, если ключ данных случайно совпадает с именем встроенного свойства объекта (например, constructor или toString), но ломает вызов hasOwnProperty напрямую на результате — такого метода у объекта без прототипа просто нет.
// было (jQuery 3.x)
if ($el.data().hasOwnProperty("userId")) {
// ...
}
// стало (jQuery 4.0) — используйте один из вариантов
if ("userId" in $el.data()) {
// ...
}
if (Object.hasOwn($el.data(), "userId")) {
// ...
}
По той же причине аккуратнее нужно вызывать методы объекта (например, toString) на результате .data() — их там тоже не будет, если явно не задать через .data("toString", …).
Селекторы
Относительные селекторы вида .find("> *") (с ведущим комбинатором) в 4.0 работают и через нативный querySelectorAll, а не только в собственном движке селекторов jQuery — раньше в некоторых случаях это приводило к ошибке. Заодно убрана поддержка нестандартных пользовательских псевдоклассов старого образца, которые не соответствуют спецификации CSS Selectors — если сайт использует сторонние плагины с такими селекторами, их нужно проверить отдельно.
Slim-сборка
Slim-сборка (jquery.slim.js) в 4.0 стала ещё легче: кроме Ajax и эффектов (их в slim не было и раньше) из неё убрали модули Deferred, Callbacks и очередей (.queue()). Если код где-то вызывает $.Deferred(), $.when() или .promise(), со slim-сборкой он перестанет работать — нужна обычная (полная) сборка либо переход на нативные Promise.
ES-модули и Node.js
Исходный код jQuery переведён с формата AMD на ES-модули, а сборка теперь идёт через Rollup вместо RequireJS. Сам файл jquery.js, который подключают на сайт, по-прежнему собран в универсальном UMD-формате и работает как раньше через обычный <script> или как AMD-модуль. Но если jQuery используется в Node.js без DOM (например, вместе с jsdom), нужен отдельный входной файл:
// было (jQuery 3.x)
const $ = require("jquery")(window);
// стало (jQuery 4.0)
const $ = require("jquery/factory")(window);
// для slim-сборки — require("jquery/factory-slim")
// как ES-модуль
import $ from "jquery";
Trusted Types и CSP
jQuery 4.0 умеет принимать HTML, обёрнутый в TrustedHTML, в методах вставки разметки (.html(), .append() и похожих) — это нужно для сайтов, которые включают браузерный механизм Trusted Types через заголовок Content-Security-Policy. Если Trusted Types на сайте не используется, это изменение никак не проявляется.
Пошаговое обновление с 3.x
-
Обновиться до 3.7.1 (последний релиз ветки 3.x) и почистить предупреждения jQuery Migrate 3.x, если он ещё подключён. Это уже уберёт часть проблем, не трогая мажорную версию.
-
Подключить jQuery 4.0 вместе с jQuery Migrate 4.0 — сначала на тестовом стенде, не на проде. Порядок тегов важен: сначала jQuery, затем Migrate.
<script src="https://code.jquery.com/jquery-4.0.0.js"></script>
<script src="https://code.jquery.com/jquery-migrate-4.0.2.js"></script>
Для отладки используйте development-версию Migrate (без .min в имени файла) — она пишет в консоль подробные предупреждения с указанием, какой код устарел и чем его заменить.
-
Пройти по ключевым страницам сайта с открытой консолью разработчика и собрать все предупреждения Migrate — это фактически список мест, которые нужно поправить перед отключением Migrate. При необходимости управлять выводом:
jQuery.migrateMute = true; // не выводить предупреждения в консоль, поведение при этом всё равно восстанавливается
jQuery.migrateTrace = false; // отключить трассировку стека для каждого предупреждения (ускоряет работу)
-
Исправить код по таблице удалённых методов и разделу «Изменения поведения» выше — начиная с мест, где предупреждения появляются чаще всего (обычно это утилиты вроде jQuery.trim/jQuery.isFunction и обработчики .bind()/.delegate()).
-
Проверить сторонние плагины и библиотеки, которые тянут jQuery как зависимость. jQuery UI начиная с версии 1.14.2 (январь 2026) прогнан против jQuery 4.0.0 и не даёт предупреждений Migrate, кроме служебного при инициализации, — более старые версии jQuery UI стоит обновить. Bootstrap 4 и многие лёгкие плагины, написанные под jQuery 1.x–3.x, обычно работают без изменений, если не используют удалённые в 4.0 утилиты, — но каждый стоит перепроверить отдельно, единого списка совместимости не существует.
-
Убрать jQuery Migrate, когда предупреждения на всех проверенных страницах закончились. Оставлять Migrate на проде «на всякий случай» не стоит — это лишний файл, который ничего не даёт, если код уже не использует устаревший API.
Как обновиться с 1.x/2.x
Прыгать сразу с jQuery 1.x или 2.x на 4.0 не получится — слишком много промежуточных изменений. Практичный путь — через 3.x:
- Подключить jQuery 3.7.1 вместе с jQuery Migrate 3.x (не 4.x — версии Migrate привязаны к целевой мажорной версии jQuery).
- Разобрать предупреждения Migrate 3.x — на этом шаге обычно всплывают самые старые проблемы: использование
.live() (убран в 1.9, замена — .on()), .size(), глобального объекта jQuery.browser (убран в 1.9, замена — feature-детекция вместо определения браузера), путаница между .attr() и .prop() при работе с checked/selected/disabled (в современных версиях для таких свойств нужен .prop()).
- Только после того как сайт стабильно работает на 3.7.1 без предупреждений Migrate 3.x, повторить основной сценарий обновления до 4.0, описанный выше.
Страницы нашего справочника по конкретным устаревшим методам этого периода: .bind(), .die(), jQuery.browser — в каждой указано, чем метод заменить сейчас.
Стоит ли обновляться прямо сейчас
| Ситуация | Рекомендация |
| Живой проект на jQuery 3.7.1, код пишете сами | Можно обновляться: пройдите Migrate 4.0, исправьте предупреждения, обновляйте на тестовом стенде. |
| Сайт на WordPress | Не подменяйте версию jQuery, которую поставляет ядро WordPress, вручную без причины — это может сломать админку и плагины, которые рассчитывают на конкретную версию. Дождитесь, пока само ядро WordPress перейдёт на новую версию, либо обновляйте jQuery только для собственного кода темы через отдельное подключение, не трогая wp-includes/js/jquery. |
| Легаси-проект на jQuery 1.x/2.x, который никто не поддерживает активно | В первую очередь — вопрос безопасности, а не новых возможностей: убедитесь, что используется хотя бы 3.7.1 (закрыты известные XSS в обработке HTML-строк), и только потом думайте про 4.0. |
| Много сторонних плагинов без активной поддержки | Обновляться осторожно, по одному плагину: проверять каждый на предупреждения Migrate, часть, возможно, придётся заменить. |
| Новый проект «с нуля» | Стоит сначала спросить, нужен ли вообще jQuery — часть его типовых задач современный JavaScript и CSS решают без библиотеки, см. разбор замен на чистом JavaScript. Если jQuery всё же нужен (например, ради экосистемы плагинов) — начинайте сразу с 4.0. |
Чек-лист перед выкладкой
- Подключены jQuery 4.0.0 (или новее) и, на время перехода, jQuery Migrate 4.0.x — в правильном порядке тегов.
- Все предупреждения Migrate на ключевых страницах разобраны, а не просто заглушены через
jQuery.migrateMute.
- Проверены вызовы удалённых утилит:
jQuery.isArray, jQuery.isFunction, jQuery.trim, jQuery.parseJSON, jQuery.type, jQuery.now и другие из таблицы выше.
- Проверены Ajax-запросы, которые полагались на автоматический JSONP или на автозапуск полученных скриптов без
dataType.
- Проверены вызовы
.css()/.animate() с числами без единиц для свойств, отличных от размеров, отступов и координат.
- Проверены вызовы
.toggleClass() с булевым аргументом без имени класса.
- Проверены обращения к
.data().hasOwnProperty(...).
- Если используется slim-сборка — проверено, не вызывается ли где-то
$.Deferred(), $.when() или очереди анимаций.
- Обновлены или проверены на совместимость ключевые плагины (jQuery UI, календари, слайдеры, валидация форм).
- После стабильной работы без предупреждений — jQuery Migrate убран с продакшена.
Частые вопросы
Когда вышел jQuery 4.0?
jQuery 4.0.0 вышел 17 января 2026 года — это первый мажорный релиз jQuery почти за десять лет, приуроченный к 20-летию библиотеки (библиотека была представлена 14 января 2006 года). Параллельно продолжает поддерживаться ветка 3.x, последний релиз в ней — 3.7.1.
Работает ли jQuery 4 в IE11?
Да, jQuery 4.0 ещё поддерживает Internet Explorer 11 — единственную версию IE, оставшуюся в списке поддерживаемых браузеров. Команда jQuery объявила, что будет убирать поддержку IE поэтапно, и следующий шаг запланирован на jQuery 5.0, но точной даты релиза 5.0 пока нет.
Сломается ли сайт при замене 3.7.1 на 4.0?
Зависит от кода. Сама по себе смена номера версии в теге <script> ничего не ломает, но если код использует удалённые методы (jQuery.isArray, jQuery.trim, старую сигнатуру .toggleClass(bool) и т. п.) или полагается на автопревращение JSON-запроса в JSONP — эти места перестанут работать. Надёжный способ проверить — подключить jQuery Migrate 4.0 и посмотреть предупреждения в консоли на реальных страницах.
Нужен ли jQuery Migrate на проде?
На время перехода — да: он временно возвращает часть удалённого поведения и пишет предупреждения о том, что нужно поправить. Для постоянной эксплуатации Migrate не нужен: как только код исправлен и предупреждения не появляются, его стоит убрать, чтобы не тянуть лишний файл. Продакшен-сборка Migrate предупреждений не пишет, только восстанавливает поведение.
Что делать, если плагин не работает с jQuery 4?
Сначала проверить консоль на предупреждения Migrate — частая причина отказа старых плагинов: использование jQuery.isFunction, jQuery.trim, старой сигнатуры .toggleClass() или устаревших событийных шорткатов. Если у плагина есть свежая версия — обновить её. Если плагин заброшен, стоит поискать замену или временно оставить проблемную страницу на jQuery 3.7.1, не смешивая версии на одной странице.
Где скачать jQuery 4 и как подключить с CDN?
Файлы есть на jquery.com/download и на официальном CDN code.jquery.com — достаточно подключить <script src="https://code.jquery.com/jquery-4.0.0.js"></script> до своих скриптов. Также jQuery ставится через npm (npm install jquery@4.0.0) и доступен как ES-модуль: import $ from "jquery".
[ наверх ]