Библиотека jQuery когда-то была стандартом де-факто для веб-разработки, упрощая работу с DOM, AJAX и событиями. Однако с развитием браузеров и появлением современных API необходимость в jQuery исчезла. Сегодня нативный JavaScript предоставляет практически все те же возможности, зачастую с лучшей производительностью и меньшим объемом кода.
Отказ от jQuery снижает размер бандла, ускоряет загрузку страницы и упрощает сопровождение проекта. Например, метод $(element).fadeOut() можно заменить на CSS-анимацию с последующим удалением элемента через setTimeout или requestAnimationFrame. Поиск элементов через document.querySelector и делегирование событий с помощью addEventListener покрывают большинство кейсов, ради которых ранее подключали библиотеку.
Важно не просто заменить вызовы jQuery-методов, а переосмыслить логику: избавиться от лишних оберток, пересмотреть структуру данных, использовать современные синтаксические конструкции – async/await, for…of, class. Это не рефакторинг ради моды, а переход к архитектуре, ориентированной на стабильность и масштабируемость.
В статье разберём конкретные примеры: обработку событий, анимации, AJAX-запросы, манипуляции с DOM. Каждое решение будет представлено на jQuery и на чистом JavaScript, с пояснением, почему и как именно происходит замена. Цель – не просто переписать код, а сделать его чище, быстрее и понятнее.
Как заменить $(document).ready() на нативный DOMContentLoaded
В jQuery выражение $(document).ready(function() { … }); гарантирует, что код выполнится после полной загрузки DOM. В чистом JavaScript для этого используется событие DOMContentLoaded.
Эквивалент без jQuery выглядит так:
document.addEventListener('DOMContentLoaded', function() {
// Ваш код здесь
});
Важно: DOMContentLoaded срабатывает, когда браузер полностью разобрал HTML-документ, но до загрузки внешних ресурсов – изображений, стилей, фреймов. Это поведение идентично $(document).ready(), которое также не ждёт полной загрузки ресурсов.
Если скрипт подключён в конце <body>, можно обойтись без DOMContentLoaded, так как DOM уже готов к моменту выполнения кода:
// Скрипт внизу страницы
// Можно сразу писать код
initApp();
function initApp() {
// Инициализация
}
Для модульных приложений или подключения через <head> безопаснее использовать DOMContentLoaded, чтобы избежать ошибок при обращении к ещё не созданным элементам.
Если требуется поддержка старых браузеров (до IE9), используйте следующий полифил:
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initApp);
} else {
initApp();
}
function initApp() {
// Инициализация
}
Такой подход обеспечит корректное поведение даже при асинхронной загрузке скрипта.
Навешивание событий: jQuery.on() против addEventListener
Метод jQuery.on()
используется для делегирования и прямого навешивания событий. Например, $('#btn').on('click', handler)
навешивает обработчик на элемент с id btn
. При делегировании событий через $(parent).on('click', '.child', handler)
jQuery автоматически реализует механизм всплытия и фильтрации, что удобно, но скрывает детали реализации.
В чистом JavaScript аналогичная функциональность достигается через addEventListener
и проверку event.target
вручную. Пример делегирования:
document.querySelector('#parent').addEventListener('click', function(event) {
if (event.target.matches('.child')) {
handler(event);
}
});
addEventListener
не поддерживает делегирование «из коробки», но дает больший контроль над фазами события (всплытие/перехват) через третий параметр. При многократном добавлении обработчиков следует явно использовать опции { once: true }
или { passive: true }
для оптимизации.
Удаление событий в jQuery через .off()
зависит от точного соответствия переданных параметров. В JavaScript важно сохранять ссылку на обработчик: element.removeEventListener('click', handler)
без точного соответствия работать не будет.
Для замены on()
в динамических интерфейсах рекомендуется писать вспомогательные функции делегирования и использовать closest()
для уточнения цели события. Это улучшает читаемость и повторное использование кода.
Работа с классами: альтернатива .addClass(), .removeClass(), .toggleClass()
jQuery предоставляет удобные методы для управления классами, но в чистом JavaScript те же задачи решаются через свойство classList
. Ниже представлены прямые замены наиболее часто используемых методов.
jQuery | Чистый JavaScript |
---|---|
$(el).addClass('active') |
el.classList.add('active') |
$(el).removeClass('hidden') |
el.classList.remove('hidden') |
$(el).toggleClass('open') |
el.classList.toggle('open') |
$(el).hasClass('disabled') |
el.classList.contains('disabled') |
Метод toggle
поддерживает второй аргумент – булево значение, позволяющее явно указать действие:
el.classList.toggle('selected', shouldSelect)
Для удаления всех классов используйте:
el.className = ''
Чтобы заменить один класс другим:
el.classList.replace('old-class', 'new-class')
Цикл для добавления/удаления нескольких классов:
['foo', 'bar'].forEach(cls => el.classList.add(cls))
В отличие от jQuery, classList
работает быстрее, безопаснее (исключает дублирование классов) и не требует подключения сторонних библиотек.
Манипуляции с DOM: как заменить.append(),.html(),.remove()
Методы jQuery .append()
, .html()
и .remove()
легко заменяются на нативные средства JavaScript. Ниже приведены конкретные аналоги с примерами.
-
.append()
Для добавления элемента в конец другого используйте
append()
илиappendChild()
:const parent = document.querySelector('#container'); const newElement = document.createElement('div'); newElement.textContent = 'Пример'; parent.append(newElement);
Если добавляется только текст или HTML-строка:
parent.insertAdjacentHTML('beforeend', '<p>Новый параграф</p>');
-
.html()
Для получения HTML-контента:
const html = element.innerHTML;
Для установки HTML:
element.innerHTML = '<span>Обновлено</span>';
Если нужно вставить DOM-узел, предпочтительнее использовать
replaceChildren()
:const newNode = document.createElement('div'); newNode.textContent = 'Содержимое'; element.replaceChildren(newNode);
-
.remove()
Для удаления элемента из DOM:
const target = document.querySelector('.item'); target.remove();
Если необходимо сначала проверить наличие родителя:
if (target.parentNode) { target.parentNode.removeChild(target); }
AJAX-запросы без $.ajax() – использование fetch и XMLHttpRequest
Для замены $.ajax()
в jQuery можно использовать два нативных подхода: fetch
и XMLHttpRequest
. Первый предпочтителен благодаря более современному синтаксису и поддержке промисов.
Пример GET-запроса с использованием fetch:
fetch('/api/data')
.then(response => {
if (!response.ok) throw new Error('Ошибка: ' + response.status);
return response.json();
})
.then(data => {
console.log(data);
})
.catch(error => {
console.error('Запрос не удался:', error);
});
Для POST-запроса необходимо указать метод, заголовки и тело запроса:
fetch('/api/data', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name: 'Test' })
})
.then(response => response.json())
.then(result => console.log(result))
.catch(error => console.error(error));
Если необходима поддержка старых браузеров, можно использовать XMLHttpRequest:
const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data');
xhr.onload = function() {
if (xhr.status === 200) {
const data = JSON.parse(xhr.responseText);
console.log(data);
} else {
console.error('Ошибка: ' + xhr.status);
}
};
xhr.onerror = function() {
console.error('Сетевая ошибка');
};
xhr.send();
POST-запрос с XMLHttpRequest:
const xhr = new XMLHttpRequest();
xhr.open('POST', '/api/data');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onload = function() {
if (xhr.status === 200) {
console.log(JSON.parse(xhr.responseText));
} else {
console.error('Ошибка: ' + xhr.status);
}
};
xhr.onerror = function() {
console.error('Сетевая ошибка');
};
xhr.send(JSON.stringify({ name: 'Test' }));
Использование fetch
упрощает обработку асинхронных операций и лучше интегрируется с async/await
. Однако при необходимости тонкой настройки или для совместимости с устаревшими системами XMLHttpRequest
остаётся актуальным.
Аналоги jQuery-методов поиска:.find(),.closest(),.parents()
В чистом JavaScript можно легко заменить основные методы поиска элементов, использующиеся в jQuery. Рассмотрим, как работают аналоги методов .find()
, .closest()
и .parents()
в стандартном JavaScript.
.find() в jQuery используется для поиска потомков внутри выбранного элемента. В чистом JavaScript аналог этого метода – это querySelectorAll()
, который позволяет найти все дочерние элементы, соответствующие заданному селектору.
Пример jQuery:
$('#parent').find('.child');
Аналог в JavaScript:
document.querySelectorAll('#parent .child');
Метод .closest() в jQuery находит ближайший родительский элемент, соответствующий селектору. В JavaScript аналогом является closest()
метода самого элемента. Он возвращает ближайший родительский элемент, который удовлетворяет заданному селектору, или null
, если такой элемент не найден.
Пример jQuery:
$('#child').closest('.parent');
Аналог в JavaScript:
document.getElementById('child').closest('.parent');
.parents() в jQuery ищет все родительские элементы, соответствующие селектору. Для этого можно использовать цикл и метод parentNode
в JavaScript для ручного обхода по дереву DOM. Также можно воспользоваться closest()
в случае поиска только ближайших родителей.
Пример jQuery:
$('#child').parents('.parent');
Аналог в JavaScript (с использованием цикла):
let parents = [];
let element = document.getElementById('child');
while (element = element.parentElement) {
if (element.matches('.parent')) {
parents.push(element);
}
}
Таким образом, для замены jQuery-методов поиска в чистом JavaScript достаточно освоить несколько стандартных методов, таких как querySelectorAll()
, closest()
и parentElement
, что позволяет значительно улучшить производительность, избегая зависимости от внешних библиотек.
Вопрос-ответ:
Что такое переписывание кода с jQuery на чистый JavaScript и зачем это нужно?
Переписывание кода с jQuery на чистый JavaScript — это процесс замены функциональности, реализованной с использованием библиотеки jQuery, на аналогичные решения, использующие только стандартные возможности JavaScript. Это может быть полезно для уменьшения зависимости от сторонних библиотек, повышения производительности и уменьшения размера загружаемых файлов. В некоторых случаях jQuery становится излишним, так как современный JavaScript уже поддерживает многие функции, которые раньше приходилось реализовывать с помощью этой библиотеки.
Какие основные различия между jQuery и чистым JavaScript?
Основные различия между jQuery и чистым JavaScript заключаются в том, что jQuery предоставляет удобные абстракции для работы с DOM, а также упрощает работу с событиями, анимациями и AJAX-запросами. Однако эти возможности могут быть реализованы и в чистом JavaScript, что избавляет от необходимости подключать дополнительную библиотеку. В отличие от jQuery, который скрывает сложные детали реализации, JavaScript требует более прямого подхода, что может привести к более длинному коду, но при этом улучшает контроль над его выполнением и сокращает нагрузку на страницу.
Какие проблемы могут возникнуть при переписывании кода с jQuery на чистый JavaScript?
Одной из проблем при переписывании кода с jQuery на чистый JavaScript может быть несовпадение в синтаксисе и особенностях работы с элементами DOM, особенно в старых браузерах. Например, методы для манипуляций с DOM, такие как `.html()`, `.css()`, или `.attr()` в jQuery, имеют свои аналоги в JavaScript, но их использование требует дополнительной внимательности и проверки совместимости с различными браузерами. Также могут возникнуть сложности с поддержанием совместимости с существующим кодом, если он активно использует jQuery, а в новых частях проекта предпочтительнее использовать только JavaScript.
Нужно ли полностью отказаться от jQuery, если я уже использую его в проекте?
Отказ от jQuery — это не обязательный шаг для всех проектов. Если проект уже успешно работает с jQuery и не испытывает проблем с производительностью или совместимостью, переход на чистый JavaScript может быть нецелесообразным. Однако, если проект начинает расти и нуждается в улучшении производительности или уменьшении размеров загружаемых файлов, отказ от jQuery может быть полезным. Важно оценить реальную потребность в переходе и понимать, что этот процесс потребует времени и усилий, так как потребуется переписать значительную часть кода.
Какую выгоду можно получить от переписывания кода с jQuery на чистый JavaScript?
Переписывание кода с jQuery на чистый JavaScript может принести несколько преимуществ. Во-первых, это уменьшает зависимость от сторонних библиотек, что снижает потенциальные риски безопасности и необходимость обновлений библиотек. Во-вторых, использование чистого JavaScript может сократить время загрузки страницы, так как не нужно подключать внешнюю библиотеку. В-третьих, можно улучшить производительность, так как код на чистом JavaScript часто работает быстрее, чем эквивалентный код на jQuery, благодаря отсутствию дополнительных абстракций. Также это дает больший контроль над кодом и позволяет лучше адаптировать его под конкретные требования проекта.