www.jQueryBook.ru - jQuery документация

 

 

 

 



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.x2006 (1.0 — август 2006)Поддерживала IE 6+; ветка, которую описывают исторические страницы этого справочника (jQuery 1.4).
2.xс 2013Тот же API, что и 1.x, но без поддержки IE 6–8 — для проектов, которым старые IE не нужны.
3.02016Первая большая чистка API: удалены .andSelf(), .size(), .context, .selector, событийные шорткаты .load()/.unload()/.error(); методы .bind()/.delegate() объявлены нежелательными (deprecated).
3.52020Патч безопасности: закрыты XSS-уязвимости в обработке HTML-строк (htmlPrefilter), связанные с CVE-2020-11022 и CVE-2020-11023. Актуально для любых старых копий 1.x/2.x/3.0–3.4, которые ещё встречаются на легаси-проектах.
3.7.12023Последний релиз ветки 3.x на сегодня; стабильный вариант для проектов, которым рано на 4.0.
4.0.017.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.getStackHookjQuery.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

  1. Обновиться до 3.7.1 (последний релиз ветки 3.x) и почистить предупреждения jQuery Migrate 3.x, если он ещё подключён. Это уже уберёт часть проблем, не трогая мажорную версию.

  2. Подключить 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 в имени файла) — она пишет в консоль подробные предупреждения с указанием, какой код устарел и чем его заменить.

  3. Пройти по ключевым страницам сайта с открытой консолью разработчика и собрать все предупреждения Migrate — это фактически список мест, которые нужно поправить перед отключением Migrate. При необходимости управлять выводом:

    jQuery.migrateMute = true;  // не выводить предупреждения в консоль, поведение при этом всё равно восстанавливается
    jQuery.migrateTrace = false; // отключить трассировку стека для каждого предупреждения (ускоряет работу)
  4. Исправить код по таблице удалённых методов и разделу «Изменения поведения» выше — начиная с мест, где предупреждения появляются чаще всего (обычно это утилиты вроде jQuery.trim/jQuery.isFunction и обработчики .bind()/.delegate()).

  5. Проверить сторонние плагины и библиотеки, которые тянут jQuery как зависимость. jQuery UI начиная с версии 1.14.2 (январь 2026) прогнан против jQuery 4.0.0 и не даёт предупреждений Migrate, кроме служебного при инициализации, — более старые версии jQuery UI стоит обновить. Bootstrap 4 и многие лёгкие плагины, написанные под jQuery 1.x–3.x, обычно работают без изменений, если не используют удалённые в 4.0 утилиты, — но каждый стоит перепроверить отдельно, единого списка совместимости не существует.

  6. Убрать jQuery Migrate, когда предупреждения на всех проверенных страницах закончились. Оставлять Migrate на проде «на всякий случай» не стоит — это лишний файл, который ничего не даёт, если код уже не использует устаревший API.

Как обновиться с 1.x/2.x

Прыгать сразу с jQuery 1.x или 2.x на 4.0 не получится — слишком много промежуточных изменений. Практичный путь — через 3.x:

  1. Подключить jQuery 3.7.1 вместе с jQuery Migrate 3.x (не 4.x — версии Migrate привязаны к целевой мажорной версии jQuery).
  2. Разобрать предупреждения Migrate 3.x — на этом шаге обычно всплывают самые старые проблемы: использование .live() (убран в 1.9, замена — .on()), .size(), глобального объекта jQuery.browser (убран в 1.9, замена — feature-детекция вместо определения браузера), путаница между .attr() и .prop() при работе с checked/selected/disabled (в современных версиях для таких свойств нужен .prop()).
  3. Только после того как сайт стабильно работает на 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".

[ наверх ]









 




Справочник по jQuery JavaScript API на русском языке