Библиотека jQuery: что это, как работает и где применяется сейчас

Библиотека jQuery: что это, как работает и где применяется сейчас Полезное

jQuery — это JavaScript-библиотека для работы со страницей в браузере: она находит элементы по CSS-селекторам, меняет DOM, подключает обработчики событий и отправляет AJAX-запросы через короткий единый API. Библиотеку выпустил Джон Резиг в 2006 году, сейчас ее развивает OpenJS Foundation, лицензия MIT. Актуальная ветка на сентябрь 2026 — jQuery 4.x (4.0.0 вышла в январе 2026).

Ниже — полный пример с разбором, типовые ошибки, AJAX и таблица замен на нативный JavaScript. Анимации оставляем за рамками.

Мини-словарь: что с чем не путать

  • DOM — дерево объектов, в которое браузер превращает HTML. jQuery не заменяет DOM, а работает поверх него.
  • jQuery-объект ($("li")) — обертка над набором найденных DOM-элементов. Даже если найден один элемент, это набор, а не сам элемент.
  • DOM-элемент — то, что возвращает document.querySelector(). Его методы (classList, textContent) у jQuery-объекта отсутствуют, и наоборот.
  • jQuery UI — отдельная библиотека виджетов поверх jQuery (календарь, диалоги, перетаскивание). jQuery Mobile — бывший мобильный фреймворк проекта, официально прекращенный; для новых проектов не подходит.

Зачем jQuery появилась и почему ее статус изменился

В конце 2000-х браузеры по-разному реализовывали события, выборку элементов и XMLHttpRequest. jQuery спрятала эти различия за функцией $() и цепочками методов: «найди элементы -> сделай с ними что-то».

С тех пор стандарт догнал библиотеку. В современных браузерах есть querySelectorAll, classList, closest, addEventListener, fetch. Поэтому в 2026 году jQuery — это legacy-технология: она живая и поддерживается, но для новых проектов ее обычно не выбирают.

При этом библиотека остается на большой доле действующих сайтов. Главные причины — WordPress (jQuery входит в его поставку, от нее зависят многие темы и плагины), старые админки и корпоративные системы, плагины, написанные под jQuery. Bootstrap начиная с 5-й версии от jQuery не зависит.

Как подключить

Два рабочих способа:

npm install jquery

После установки файл лежит в node_modules/jquery/dist/jquery.min.js: его можно скопировать в статику проекта или импортировать через сборщик. Второй вариант — подключить файл с официального CDN проекта по адресу, указанному на странице загрузки jQuery. Сборка jquery.slim.min.js легче, но в ней нет AJAX и эффектов.

Полный пример: список задач

Сначала целиком рабочая страница. Сохраните ее рядом с файлом jquery.min.js и откройте в браузере.

<!doctype html>
<html lang="ru">
<head>
  <meta charset="utf-8">
  <title>Задачи на jQuery</title>
  <style>.done { text-decoration: line-through; color: gray; }</style>
</head>
<body>
  <input id="title" placeholder="Новая задача">
  <button id="add">Добавить</button>
  <ul id="tasks">
    <li>Прочитать про DOM</li>
  </ul>
  <p>Осталось: <span id="left">1</span></p>

  <script src="jquery.min.js"></script>
  <script>
    $(function () {
      function updateCounter() {
        $("#left").text($("#tasks li:not(.done)").length);
      }

      $("#add").on("click", function () {
        const title = $("#title").val().trim();
        if (!title) return;
        $("<li>").text(title).appendTo("#tasks");
        $("#title").val("");
        updateCounter();
      });

      $("#tasks").on("click", "li", function () {
        $(this).toggleClass("done");
        updateCounter();
      });
    });
  </script>
</body>
</html>

Что увидите: после ввода «Новая задача» и нажатия кнопки в списке появится второй пункт, счетчик станет 2. Клик по пункту зачеркнет его, счетчик уменьшится. Повторный клик снимет зачеркивание.

Разбор по строкам: четыре опоры jQuery

Готовность DOM. $(function () { ... }) запускает код, когда DOM построен. Нативный аналог — событие DOMContentLoaded или атрибут defer у тега script.

Селекторы. $("#tasks li:not(.done)") принимает обычный CSS-селектор и возвращает набор. .length — число найденных элементов, на этом построен счетчик.

Манипуляции DOM. $("<li>") создает элемент, .text(title) задает текст, .appendTo("#tasks") вставляет в список. .val() читает и пишет значение поля ввода. Методы возвращают тот же набор, поэтому их можно выстраивать цепочкой.

События. .on("click", fn) вешает обработчик. Форма .on("click", "li", fn)делегирование: обработчик стоит на ul, а срабатывает для любого li внутри, в том числе добавленного позже. Внутри обработчика this — DOM-элемент, $(this) оборачивает его обратно в jQuery-объект.

Типовые ошибки: неверно -> результат -> как исправить

Ошибка 1. Обработчик на элементах вместо делегирования.

$("#tasks li").on("click", function () {
  $(this).toggleClass("done");
  updateCounter();
});

Результат (проверено прогоном): первый пункт зачеркивается, а добавленные кнопкой — нет. Селектор выполнился один раз при загрузке и нашел только существующий li. Исправление — вариант из полного примера: $("#tasks").on("click", "li", ...).

Ошибка 2. Пользовательский ввод через .html().

$("<li>").html(title).appendTo("#tasks");

Результат: ввод <img src=x onerror=alert(1)> превращается в настоящий тег img с обработчиком, то есть в XSS. С .text(title) та же строка выводится как текст: &lt;img src=x onerror=alert(1)&gt;. Правило: данные от пользователя и с сервера вставлять через .text(), а .html() — только для своей проверенной разметки. У нативного innerHTML риск тот же.

Ошибка 3. Ожидание, что опечатка в селекторе даст ошибку.

const $missing = $("#mesage").addClass("active");
console.log("jQuery, найдено:", $missing.length);

document.querySelector("#mesage").classList.add("active");

Результат:

jQuery, найдено: 0
TypeError: Cannot read properties of null (reading 'classList')

jQuery молча работает с пустым набором, нативный код падает. Тихое поведение удобно, но прячет опечатки: при отладке проверяйте .length. Текст TypeError приведен для движка V8 (Chrome, Node.js), в других браузерах формулировка другая.

AJAX в jQuery и отличие от fetch

$.getJSON("/api/tasks.json")
  .done(function (tasks) {
    tasks.forEach(function (t) {
      $("<li>").text(t.title).appendTo("#tasks");
    });
    console.log("jQuery: загружено задач -", tasks.length);
  })
  .fail(function (jqXHR) {
    console.log("jQuery: ошибка", jqXHR.status);
  });

Для адреса, который отдает JSON из двух задач, в консоли будет jQuery: загружено задач - 2. Для несуществующего адреса сработает .fail, и выведется jQuery: ошибка 404: jQuery считает HTTP-ошибку неудачей запроса.

У fetch логика другая, и это частая ловушка при переписывании:

async function loadTasks(url) {
  const response = await fetch(url);
  if (!response.ok) {
    throw new Error("HTTP " + response.status);
  }
  return response.json();
}

loadTasks("/api/tasks.json")
  .then((tasks) => console.log("fetch: загружено задач -", tasks.length))
  .catch((err) => console.log("fetch: ошибка", err.message));

loadTasks("/api/nope.json")
  .then(() => console.log("fetch: успех?"))
  .catch((err) => console.log("fetch: ошибка", err.message));

fetch("/api/nope.json")
  .then((r) => console.log("fetch без проверки ok: then, status", r.status));

fetch отклоняет промис только при сетевом сбое. Ответ 404 без проверки response.ok попадет в then. Поэтому проверка статуса обязательна:

fetch: загружено задач - 2
fetch: ошибка HTTP 404
fetch без проверки ok: then, status 404

Нативные аналоги: таблица замен

Тот же список задач на чистом JavaScript дает идентичный результат (проверено тем же сценарием кликов):

Задача jQuery Нативный JavaScript
Найти все элементы $(".item") document.querySelectorAll(".item")
Найти один элемент $("#id") (пустой набор, если нет) document.querySelector("#id") (null, если нет)
Текст .text("...") el.textContent = "..."
Разметка .html(s) el.innerHTML = s (тот же риск XSS)
Классы .addClass(), .toggleClass() el.classList.add(), .toggle()
Атрибуты .attr("href") el.getAttribute("href")
data-атрибуты .data("id") — приводит типы и кеширует el.dataset.id — всегда строка
Событие .on("click", fn) el.addEventListener("click", fn)
Делегирование .on("click", "li", fn) обработчик на родителе + event.target.closest("li")
DOM готов $(fn) DOMContentLoaded или defer
Запрос к серверу $.getJSON(), $.ajax() fetch() + проверка response.ok

Нюанс с data-атрибутами проверен: для data-id="42" jQuery вернет число, dataset — строку. А .data("id", 7) не меняет сам атрибут, значение остается в кеше jQuery. При миграции это частый источник расхождений.

Когда jQuery уместна, а когда нет

Ситуация Что взять Почему
Поддержка сайта, где jQuery уже есть (WordPress-тема, старая админка) jQuery переписывание не окупается, плагины на нее завязаны
Новая небольшая страница, пара обработчиков нативный JavaScript лишняя зависимость не нужна, API браузера хватает
Интерфейс со сложным состоянием React, Vue, Svelte и подобные jQuery не управляет состоянием, только DOM
Обновление старого кода jQuery 4.x или 3.7.x + постепенная замена в 4.0 удалены устаревшие функции

При обновлении на 4.0 учитывайте: удалены давно помеченные устаревшими функции вроде $.trim, $.isArray, $.parseJSON, $.type, $.now (проверено: в 4.0.0 они undefined). Замены — str.trim(), Array.isArray(), JSON.parse(). Также прекращена поддержка старых версий Internet Explorer. Переходный плагин jQuery Migrate помогает найти в коде вызовы удаленного API.

И отдельно про безопасность: старые версии jQuery содержат известные уязвимости в обработке HTML. Если на сайте стоит древняя версия, обновление — задача безопасности, а не только стиля кода.

Выводы

  • jQuery — библиотека поверх DOM: селекторы, манипуляции, события и AJAX через единый API $(); актуальная ветка — 4.x.
  • В 2026 году это legacy: новые проекты обычно пишут на нативном JavaScript или фреймворках, но jQuery остается в WordPress и старом коде.
  • Главные практические приемы — делегирование событий (.on(событие, селектор, fn)) и вставка данных через .text(), а не .html().
  • При переходе на fetch проверяйте response.ok: в отличие от $.ajax, HTTP 404 не считается ошибкой.
  • Почти каждая функция jQuery имеет нативный аналог, но поведение отличается в деталях (null vs пустой набор, типы в .data()).

Где применяется / связь с практикой

Освойте тему на практике

jQuery чаще всего встречается при поддержке действующих сайтов: правка темы WordPress, доработка старой админки, перенос кода на нативный JavaScript. Чтобы уверенно делать такие задачи, нужна база самого языка — DOM, события, асинхронность и промисы, на которых строятся и jQuery, и современные фреймворки. Ее системно дает курс JavaScript Developer. Basic.

Освойте тему на практике

Посмотреть формат обучения и разобрать отдельные темы фронтенда можно на бесплатных открытых уроках Otus.

FAQ

Можно ли использовать jQuery вместе с React или Vue?
Технически да, но это конфликт подходов: фреймворк сам управляет DOM, и прямые правки через jQuery он может перезаписать. Обычно jQuery оставляют только для изолированного старого плагина.

Стоит ли учить jQuery новичку в 2026 году?
Отдельно с нуля — нет, лучше сначала освоить нативный DOM API. Синтаксис jQuery читается за вечер, если придется поддерживать старый код.

Работает ли jQuery на сервере в Node.js?
Сама по себе нет: ей нужен объект window с документом. В Node.js ее запускают вместе с эмулятором DOM (например, jsdom), в основном для тестов.

OTUS Журнал