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

 

 

 

 



Устаревшие и удалённые методы jQuery: что убрали в 1.9, 3.0 и 4.0 и чем заменить

Опубликовано: 26.09.2026 · Обновлено: 26.09.2026 · Актуально для jQuery 3.7.1 и 4.0.0

«Устарел» (deprecated) и «удалён» (removed) — не одно и то же: устаревший метод помечен нежелательным, но ещё выполняется, удалённый бросает TypeError: ... is not a function. Такая ошибка после обновления jQuery значит, что метод убрали из ядра и нужна замена. Предупреждение вида JQMIGRATE: ... значит другое — метод пока работает, но подключён jQuery Migrate, который временно возвращает старое поведение. Ниже — по каким версиям что убрали и чем заменить, от .live() (1.9) до jQuery 4.0.

Как понять, что метод устарел или удалён

Официальный список ведёт сам jQuery — раздел api.jquery.com/category/deprecated/ разбит на подкатегории по версиям («Deprecated 1.7», «Deprecated 3.3» и так далее), там же для каждого метода указана версия, в которой его пометили нежелательным. Это справочник по факту устаревания, а не по факту удаления — метод из подкатегории «Deprecated 1.7» вполне может исполняться и в 4.0, просто с оговоркой «не стоит использовать в новом коде».

Второй источник — предупреждения плагина jQuery Migrate, если он подключён рядом с jQuery. В development-версии файла (без .min в имени) каждое обращение к устаревшему или восстановленному API пишет в консоль строку вида:

JQMIGRATE: jQuery.isArray is deprecated; use Array.isArray
JQMIGRATE: jQuery.fn.bind() is deprecated

Это самый надёжный способ найти реальные проблемные места именно на своих страницах, а не по общему списку: Migrate 3.x подключают вместе с jQuery 3.x, Migrate 4.x — вместе с jQuery 4.0, версии привязаны к целевой мажорной версии jQuery.

Третий признак — сама ошибка в консоли браузера. Если написано TypeError: $(...).live is not a function или подобное — метод не просто устарел, а физически отсутствует в подключённой версии jQuery, и Migrate здесь уже не поможет: библиотека, которая раньше подставляла реализацию, попросту убрала код метода из ядра.

Deprecated (нежелательный) ≠ removed (удалённый). Deprecated-метод работает как раньше, но появится предупреждение и риск, что в одном из будущих мажорных релизов он исчезнет. Removed-метод не существует физически: любой вызов сразу бросает TypeError.

Удалено в jQuery 1.9

jQuery 1.9 (2013 год) — первая крупная чистка API. Все методы ниже физически отсутствуют начиная с этой версии; если сайт всё ещё держит jQuery 1.8 или старше, ошибок пока не будет, но обновление до 1.9+ без правок кода их вызовет.

Убрано в 1.9 (и 1.8)Чем заменитьКомментарий
.live(event, fn)$(document).on(event, selector, fn)Deprecated с 1.7. Возможность вешать обработчик на будущие, ещё не созданные элементы, сохранилась — но через делегирование, а не через .live().
.die().off(event, selector, fn)Снимает обработчик, поставленный через делегирование. Пара к .live().
jQuery.browserfeature detection: CSS.supports(), 'x' in windowDeprecated с 1.3. Определял браузер и версию по строке navigator.userAgent — ненадёжный подход в принципе, не только в jQuery.
jQuery.boxModelне нужен: jQuery не поддерживает quirks modeDeprecated с 1.3, убран уже в 1.8 (в таблице — для полноты, рядом с jQuery.browser); показывал, использует ли браузер W3C box model — актуально было только для очень старых IE.
jQuery.sub()обычно не нужен; при необходимости — плагин jQuery MigrateDeprecated с 1.7. Создавал изолированную копию jQuery для написания плагинов без конфликтов имён — на практике использовался редко.
.toggle(fn1, fn2, ...) — событийная формасвоя переменная-флаг + .on("click", ...)Не путать с .toggle() без аргументов (показать/скрыть элемент) — та форма осталась и работает сейчас. Убрана именно форма «переключать между несколькими обработчиками клика».

Одновременно с 1.9 вышла первая версия jQuery Migrate — она умеет на лету возвращать перечисленные методы, пока идёт правка кода, и предупреждать о каждом вызове в консоли.

Удалено в jQuery 3.0

jQuery 3.0 (2016 год) убрала вторую волну API — в основном то, что было объявлено нежелательным ещё в ветке 1.x, плюс несколько методов объекта jqXHR, которые дублировали более новые методы Promise-интерфейса.

Убрано в 3.0Чем заменитьКомментарий
.andSelf().addBack([selector])Deprecated с 1.8. .addBack() делает то же самое — возвращает в цепочку предыдущий набор элементов — и дополнительно умеет фильтровать его селектором.
.size()свойство .lengthDeprecated с 1.8. Метод всегда просто читал .length — с 3.0 нужно обращаться к свойству напрямую, без скобок.
.contextнет заменыDeprecated с 1.10/2.0. Хранил DOM-узел контекста, переданный в jQuery(), — на практике почти никогда не отражал реальный контекст вычисления, использовался для отладки.
.selectorнет заменыDeprecated с 1.7. Строка с исходным селектором коллекции; была нужна в основном плагинам и .live().
.load(fn), .unload(fn), .error(fn) — как навешивание обработчика события.on("load", fn), .on("unload", fn), .on("error", fn)Deprecated с 1.8. Важно не путать с одноимённым методом .load(url), который подгружает HTML через Ajax, — он никуда не делся, это другая функция с тем же именем.
jqXHR .success().done()Методы объекта, который возвращает $.ajax(). Совпадали по смыслу с Promise-методами, но появились раньше и не поддерживали цепочки как .then().
jqXHR .error().fail()—
jqXHR .complete().always()—
$(document).on("ready", fn) — синтетическое событие ready$(fn)Deprecated с 1.8. Сам метод .ready(fn) не удалён, но с 3.0 рекомендуется только форма $(function () { ... }); остальные варианты записи ($(document).ready(fn) и т. п.) работают, но считаются устаревшими.

Если исторические страницы этого справочника (в редакции jQuery 1.4) показывают .andSelf(), .size() или событие .error() как рабочие — это точное описание версии 1.4 на момент её выхода. К 2026 году все методы этой таблицы удалены уже почти десять лет.

Deprecated в 3.x: работают, но обречены

Эта группа — самая частая причина путаницы: методы объявлены нежелательными в одной из версий 3.x, но физически присутствуют и в 3.7.1, и в jQuery 4.0.0. Ошибки is not a function они не дают — только предупреждение Migrate. Тем не менее откладывать замену не стоит: команда jQuery прямо говорит, что deprecated-статус — кандидат на удаление в одном из следующих мажорных релизов.

.bind() / .delegate() и парная пара к ним

Помечены нежелательными в jQuery 3.0 и не удалены ни в 3.7.1, ни в 4.0 — вопреки частому заблуждению, что «bind давно выпилили». Замена — единый метод .on() и .off(), который с версии 1.7 покрывает обе задачи: и прямое навешивание обработчика, и делегирование.

Метод (deprecated с 3.0)Замена
.bind(event, fn).on(event, fn) — сигнатура не меняется
.unbind(event, fn).off(event, fn)
.delegate(selector, event, fn).on(event, selector, fn) — порядок первых двух аргументов меняется местами
.undelegate(selector, event, fn).off(event, selector, fn)

Событийные сокращения

Методы вида .click(fn), .change(fn), .hover(fn1, fn2) объявлены нежелательными в jQuery 3.3 — и, как и .bind(), в 4.0 они не удалены, продолжают работать без единого предупреждения консоли браузера (только Migrate знает, что они deprecated). Список большой: .click(), .dblclick(), .mousedown(), .mouseup(), .mousemove(), .mouseover(), .mouseout(), .mouseenter(), .mouseleave(), .change(), .keypress(), .keydown(), .keyup(), .focus(), .blur(), .focusin(), .focusout(), .resize(), .scroll(), .select(), .submit(), .hover(), .contextmenu(). Замена везде одна и та же схема — вызов через .on() с именем события первым аргументом:

// deprecated с 3.3, но пока работает
$("button").click(function () {
  console.log("клик");
});

// современный вариант
$("button").on("click", function () {
  console.log("клик");
});

Важная оговорка: то же имя метода без аргументов ($("button").click()) — это не навешивание обработчика, а программный вызов события. Эта форма тоже помечена deprecated в 3.3; её замена — .trigger("click").

Позиционные псевдоклассы-селекторы

Deprecated с jQuery 3.4: :eq(), :first, :gt(), :lt(), :even, :odd, :last. Причина — это собственное расширение jQuery поверх CSS, не входящее в спецификацию CSS Selectors, и оно плохо сочетается с нативным querySelectorAll. В 4.0 они по-прежнему работают, но предпочтительно использовать методы коллекции или стандартный :nth-child():

// работает, но deprecated с 3.4
$("li:eq(2)");
$("li:first");

// предпочтительно
$("li").eq(2);
$("li").first();
$("li:nth-child(3)");        // если действительно нужен CSS-селектор

Утилиты $.isArray, $.trim и соседи

Эти утилиты объявляли нежелательными постепенно: jQuery.isArray() — в 3.2; jQuery.isFunction(), jQuery.isNumeric(), jQuery.isWindow(), jQuery.type() — в 3.3; jQuery.trim() — в 3.5. Не путать с jQuery.inArray() — это другой, не устаревший метод (ищет значение в массиве), просто похожее по звучанию имя. Все шесть методов из списка убраны из ядра в jQuery 4.0 — таблица замен есть в разделе ниже и подробно разобрана в статье о jQuery 4.0.

Остальные deprecated-кандидаты

МетодDeprecated сСтатус в 4.0
jQuery.parseJSON()3.0Убран. Замена — нативный JSON.parse(), поддерживается во всех актуальных браузерах.
jQuery.now()3.3Убран. Замена — Date.now().
jQuery.unique()3.0Убран под старым именем. Тот же алгоритм остался под именем jQuery.uniqueSort().
jQuery.fx.interval3.0Убран. Анимации и так синхронизированы с requestAnimationFrame, вручную задать интервал больше нельзя.
jQuery.holdReady()3.2Официально не значится удалённым в 4.0 — работает, но полагаться на него в новом коде не стоит; лучше явно откладывать инициализацию своей логикой.
jQuery.support1.9Не значится удалённым в 4.0 (объект по-прежнему используется внутри библиотеки). Замена в любом случае — прямая feature-детекция нужного свойства/API, а не чтение общего объекта.
.ajaxComplete(), .ajaxError(), .ajaxSend(), .ajaxStart(), .ajaxStop(), .ajaxSuccess()3.5Не значатся удалёнными в 4.0. Тот же эффект — подписка на глобальные Ajax-события через $(document).on("ajaxComplete", fn) и другие имена событий.
jQuery.proxy()3.3Не значится удалённым в 4.0, продолжает работать. Нативная замена — fn.bind(context).

Удалено в jQuery 4.0 — коротко

jQuery 4.0.0 вышел 17 января 2026 года и убрал сразу всю группу утилит, объявленных нежелательными в 3.x, плюс несколько недокументированных внутренних методов. Подробный разбор с примерами кода, изменениями Ajax и CSS — в статье jQuery 4.0: что нового и как перейти с версии 3.x, здесь — только таблица, чтобы не дублировать.

Убрано в 4.0Замена
jQuery.isArray()Array.isArray()
jQuery.isFunction()typeof x === "function"
jQuery.isNumeric()Number.isFinite() или своя проверка
jQuery.isWindow()x != null && x === x.window
jQuery.trim()str.trim()
jQuery.type()typeof, Array.isArray(), instanceof
jQuery.parseJSON()JSON.parse()
jQuery.now()Date.now()
jQuery.unique()jQuery.uniqueSort()
jQuery.fx.intervalнет замены, не требуется
jQuery.camelCase(), jQuery.cssProps, jQuery.nodeName()недокументированные внутренние методы, своя реализация обычно не нужна
.toggleClass(булево) без имени класса.toggleClass("класс", булево)

.bind(), .unbind(), .delegate(), .undelegate(), событийные сокращения (.click(), .hover() и другие) и позиционные селекторы (:eq(), :first и другие) в этот список не входят — они остаются deprecated, но рабочими, подробности — в разделе выше.

$.browser и определение браузера

jQuery.browser и jQuery.boxModel убраны ещё в 1.9 и 1.8 соответственно, но вопрос «как узнать браузер пользователя» возникает у тех, кто переносит старый код на современный jQuery, регулярно. Правильный ответ — не узнавать браузер вообще, а проверять конкретную возможность, которая нужна коду:

// старый подход (не работает с 1.9) — определить браузер по имени
if ($.browser.msie) {
  // код для IE
}

// современный подход — проверить нужную возможность напрямую
if (!('fetch' in window)) {
  // подключить полифилл или альтернативный код запроса
}
if (CSS.supports("display", "grid")) {
  // можно использовать grid-вёрстку
}
if ('ontouchstart' in window) {
  // устройство с сенсорным экраном
}

Разбор строки navigator.userAgent вручную (то, что делал $.browser внутри) — плохая идея независимо от jQuery: браузеры годами подделывают чужие названия в этой строке ради совместимости с сайтами, которые проверяли её так же. Если код обязательно должен продолжать работать со старым API — jQuery Migrate 1.x временно восстанавливает jQuery.browser, но это решение на время миграции, а не постоянное.

.attr() vs .prop()

Формально это не «устаревший метод» — оба живы и нужны, — но именно на этой паре старый код чаще всего ломается при переносе на современную версию jQuery, поэтому она заслуживает отдельного раздела. До версии 1.6 .attr() одновременно отвечал и за атрибуты, и за некоторые свойства DOM-элемента, из-за чего поведение для булевых состояний (checked, selected, disabled) было непоследовательным. В 1.6 добавили отдельный метод .prop() для свойств, а .attr() для тех же булевых случаев стал возвращать пустую строку вместо ожидаемого true/false — это сразу же массово сломало код, и в патче 1.6.1 .attr() вернул обратную совместимость для типичных булевых атрибутов, одновременно рекомендуя переходить на .prop().

Итоговое правило, актуальное и в 3.7.1, и в 4.0: .attr() читает и пишет HTML-атрибут (то, что видно в разметке), .prop() — текущее состояние DOM-свойства (то, что видит браузер прямо сейчас). Для checked, selected, disabled и подобных булевых состояний используйте .prop():

// ненадёжно для текущего состояния чекбокса после клика пользователя
$("#agree").attr("checked");   // вернёт "checked" или undefined — исходное состояние из HTML

// надёжно — актуальное состояние на момент вызова
$("#agree").prop("checked");   // вернёт true или false

// установка состояния — тоже через .prop()
$("#agree").prop("checked", true);
$("#submit-btn").prop("disabled", false);

.attr() при этом остаётся правильным выбором для обычных атрибутов без булевой природы: href, src, data-*, title, произвольных пользовательских атрибутов.

Как мигрировать старый проект

Цепочка версий jQuery Migrate жёстко привязана к целевой мажорной версии jQuery: Migrate 1.x — для перехода к 1.12/2.2, Migrate 3.x — для перехода к 3.x, Migrate 4.x — для перехода к 4.0. Перепрыгнуть через ветку нельзя — сначала код должен стабильно работать на предыдущей мажорной версии без предупреждений её Migrate, и только потом имеет смысл переходить дальше.

  1. jQuery 1.x/2.x → 1.12/2.2. Подключить jQuery 1.12.x (или 2.2.x, если поддержка IE 6–8 не нужна) вместе с jQuery Migrate 1.x. На этом шаге обычно всплывают самые старые проблемы: .live(), jQuery.browser, .size(), .toggle() как переключатель обработчиков. Разобрать предупреждения консоли, убрать Migrate 1.x.

  2. 1.12/2.2 → 3.7.1. Подключить jQuery 3.7.1 вместе с jQuery Migrate 3.x. Здесь чаще всего всплывают .andSelf(), .context, событийные шорткаты .load()/.unload()/.error(), устаревшие jqXHR-методы .success()/.error()/.complete(). Разобрать предупреждения, проверить ключевые страницы вручную, убрать Migrate 3.x.

  3. 3.7.1 → 4.0.0. Подключить jQuery 4.0.0 вместе с jQuery Migrate 4.x — сначала на тестовом стенде. Здесь всплывают удалённые в 4.0 утилиты ($.isArray, $.trim и другие из таблицы выше) и изменения поведения Ajax/CSS, разобранные в статье про jQuery 4.0.

Если проект небольшой и версия точно известна (например, в разметке подключён конкретный jquery-1.8.3.min.js), можно сократить путь и сразу подключить Migrate соответствующей ветки, минуя промежуточные шаги, — но проверку на каждой ключевой странице с открытой консолью пропускать не стоит в любом случае.

Быстрый поиск устаревших вызовов по исходникам

Перед подключением Migrate полезно прикинуть объём работы простым текстовым поиском по проекту:

grep -rnE "\.live\(|\.die\(|\.size\(\)|\.andSelf\(\)|\$\.browser|\$\.isArray\(|\$\.parseJSON\(|\$\.trim\(" .

Поиск найдёт только буквальные вхождения в исходном коде — динамически собранные вызовы (например, через $[methodName]()) он не покажет. Финальным этапом всё равно остаётся живая проверка страниц через jQuery Migrate с открытой консолью разработчика.

Сводная таблица: метод — статус — замена

Метод / свойствоСтатусЗаменаСтраница справочника
.live()Removed 1.9.on(event, selector, fn)—
.die()Removed 1.9.off(event, selector, fn).die()
jQuery.browserRemoved 1.9feature detectionjQuery.browser
jQuery.boxModelDeprecated 1.3, Removed 1.8не требуетсяjQuery.boxModel
jQuery.sub()Removed 1.9плагин jQuery Migrate (редко нужен)—
.toggle(fn, fn, ...)Removed 1.9своя логика + .on("click")—
.andSelf()Removed 3.0.addBack().andSelf()
.size()Removed 3.0.length—
.contextRemoved 3.0нет замены.context
.selectorDeprecated 1.7, Removed 3.0нет замены—
.load()/.unload()/.error() (события)Removed 3.0.on("load"/"unload"/"error", fn).error()
jqXHR .success()/.error()/.complete()Removed 3.0.done()/.fail()/.always()—
.bind()/.unbind()Deprecated 3.0, работает в 4.0.on()/.off().bind()
.delegate()/.undelegate()Deprecated 3.0, работает в 4.0.on(event, selector, fn).delegate()
jQuery.parseJSON()Deprecated 3.0, Removed 4.0JSON.parse()—
jQuery.now()Deprecated 3.3, Removed 4.0Date.now()—
jQuery.unique()Deprecated 3.0, Removed 4.0jQuery.uniqueSort()—
jQuery.fx.intervalDeprecated 3.0, Removed 4.0не требуется (requestAnimationFrame)—
.click()/.change()/.hover() и другие события как binderDeprecated 3.3, работает в 4.0.on("событие", fn).click(), .change(), .hover(), .keypress()
jQuery.isArray()Deprecated 3.2, Removed 4.0Array.isArray()jQuery.isArray()
jQuery.isFunction()Deprecated 3.3, Removed 4.0typeof x === "function"jQuery.isFunction()
jQuery.isNumeric()/isWindow()/type()Deprecated 3.3, Removed 4.0Number.isFinite(), x===x.window, typeof—
jQuery.trim()Deprecated 3.5, Removed 4.0str.trim()—
:eq()/:first/:gt()/:lt()/:even/:odd/:lastDeprecated 3.4, работает в 4.0.eq()/.first()/:nth-child():eq(), :first, :gt()
.ajaxComplete() и другие глобальные Ajax-событияDeprecated 3.5, работает в 4.0$(document).on("ajaxComplete", fn)—
jQuery.supportDeprecated 1.9, работает в 4.0прямая feature-детекция—
jQuery.holdReady()Deprecated 3.2, работает в 4.0своя логика отложенной инициализации—
jQuery.proxy()Deprecated 3.3, работает в 4.0fn.bind(context)—
.toggleClass(булево)Deprecated 3.0, Removed 4.0.toggleClass("класс", булево)—
jQuery.camelCase()/cssProps/nodeName()Removed 4.0 (недокументированные)обычно не нужны—
jQuery.inArray()Не устарел, работает—jQuery.inArray()

Итог

  • Прежде чем чинить ошибку — определите, «removed» это (метода физически нет, TypeError) или «deprecated» (метод работает, но подключён Migrate или появилось предупреждение). Это разные по срочности задачи.
  • Реально удалены на сегодня: всё из 1.9 и 3.0 (см. таблицы выше) и группа утилит/сигнатур, убранных в 4.0 ($.isArray, $.trim, $.parseJSON, $.now, $.unique, $.fx.interval, .toggleClass(булево) и несколько недокументированных методов).
  • .bind()/.delegate(), событийные сокращения (.click(), .hover() и другие), позиционные селекторы (:eq(), :first) — ещё работают и в 3.7.1, и в 4.0.0, но помечены нежелательными и стоят в очереди на возможное будущее удаление — менять на .on()/.off() и методы коллекции стоит заранее, не дожидаясь ошибки.
  • Мигрировать через промежуточные версии Migrate (1.x → 3.x → 4.x), а не пытаться перескочить сразу на 4.0 с древнего кода — так предупреждения появляются по одной проблеме за раз, а не всей массой сразу.
  • Для определения браузера, фичи или состояния DOM-элемента (checked, disabled) — feature detection и .prop(), а не устаревшие $.browser и .attr() для булевых атрибутов.

Частые вопросы

Чем заменить .live()?

.live() удалён ещё в jQuery 1.9 (2013 год), поэтому если код на нём падает — дело не в свежем обновлении. Замена — делегирование через .on(): вместо $(".item").live("click", fn) нужно $(document).on("click", ".item", fn), где первый аргумент — статичный родитель, второй — селектор динамических элементов. Подробнее о делегировании — в статье про .on() и .off().

$.browser is undefined — что делать?

jQuery.browser удалён в jQuery 1.9 (а jQuery.boxModel — ещё в 1.8) — определять браузер через них больше нельзя. Правильный путь — не выяснять, какой это браузер, а проверять, поддерживает ли он нужную возможность: 'fetch' in window, CSS.supports("gap", "1px") и подобные проверки. Если старый код обязательно требует jQuery.browser, его на время восстанавливает плагин jQuery Migrate.

.size() is not a function — что делать?

.size() убран в jQuery 3.0 (2016 год) как избыточный: он всегда просто возвращал .length. Замена — обращение к свойству .length напрямую: $("li").length вместо $("li").size(). Свойство работает и в 3.x, и в 4.0, других изменений не требуется.

Работает ли ещё .bind()?

Да. .bind(), .unbind(), .delegate() и .undelegate() объявлены нежелательными (deprecated) в jQuery 3.0, но в jQuery 4.0 они не удалены и продолжают работать — просто jQuery Migrate 4.0 пишет по ним предупреждение. Переходить на .on()/.off() стоит заранее, потому что команда jQuery не гарантирует, что эти методы останутся в одном из следующих мажорных релизов.

Можно ли оставить jQuery Migrate навсегда?

Технически да, он не мешает работе сайта, но смысла в этом немного: Migrate — это дополнительный файл, который только восстанавливает старое поведение и пишет предупреждения в консоль (в production-сборке — только восстанавливает, без сообщений). Он не ускоряет и не улучшает код. Правильная стратегия — держать Migrate на время миграции, разобрать все предупреждения и затем убрать его.

Как найти все устаревшие вызовы в проекте?

Быстрый способ без установки чего-либо — текстовый поиск по исходникам через grep или поиск в IDE по шаблонам: \.live\(, \.die\(, \.size\(\), \.andSelf\(\), \$\.browser, \$\.isArray\(, \$\.parseJSON\(. Он не заменяет проверку в браузере: часть вызовов формируется динамически и в текст исходников не попадает буквально, поэтому финальная проверка — jQuery Migrate с открытой консолью на реальных страницах.

[ наверх ]









 




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