При работе с jQuery одной из частых задач является выбор элементов DOM для дальнейших операций. Типичная запись выглядит так:
$('#myElement').hide();
$('#myElement').css('color', 'red');
$('#myElement').fadeIn();
Каждый вызов $('#myElement') заставляет jQuery заново
искать элемент в DOM. В крупных приложениях или при работе с множеством
элементов это приводит к серьёзным потерям
производительности. Решением является кэширование
селекторов.
Кэширование селектора заключается в сохранении результата поиска в переменной, чтобы повторно использовать его без повторного обхода DOM:
var $myElement = $('#myElement');
$myElement.hide();
$myElement.css('color', 'red');
$myElement.fadeIn();
Здесь $myElement — это объект jQuery, который содержит
выбранный элемент. Префикс $ не обязателен, но используется
по соглашению, чтобы показать, что переменная хранит объект jQuery.
Преимущества:
Если нужно работать с несколькими однотипными элементами, целесообразно сохранять весь набор в переменной:
var $buttons = $('.btn');
$buttons.addClass('active');
$buttons.on('click', function() {
$(this).toggleClass('clicked');
});
В этом примере поиск .btn выполняется только один раз, а
все дальнейшие операции применяются к сохранённой коллекции.
Частая ошибка — использование селектора внутри цикла:
for (var i = 0; i < 100; i++) {
$('#item').hide();
}
Каждая итерация запускает поиск элемента в DOM. Правильный подход:
var $item = $('#item');
for (var i = 0; i < 100; i++) {
$item.hide();
}
Для функций, которые вызываются многократно, также важно кэшировать селекторы:
function highlightItems() {
var $items = $('.list-item');
$items.addClass('highlight');
}
Если функция вызывается часто, можно вынести кэширование за её пределы, если DOM не изменяется.
При добавлении или удалении элементов из DOM кэш может устаревать. В таких случаях необходимо обновлять кэш:
var $listItems = $('.list-item');
$('#addItem').on('click', function() {
$('<li>Новый элемент</li>').appendTo('#list');
$listItems = $('.list-item'); // обновление кэша
});
Альтернативный подход — использование делегирования событий, чтобы не зависеть от кэша при динамических изменениях:
$('#list').on('click', '.list-item', function() {
$(this).toggleClass('active');
});
Локальные переменные внутри функций Если элемент используется несколько раз внутри функции, его стоит закэшировать в локальной переменной.
Переменные на уровне модуля или страницы Элементы, которые используются глобально, можно кэшировать один раз при инициализации скрипта.
Использование родительских селекторов Вместо глобального поиска по всему DOM лучше сначала выбрать родителя, а затем искать внутри него:
var $container = $('#container');
var $items = $container.find('.item');
Это ускоряет поиск и делает код более структурированным.
$, например: $menu,
$buttons.$(document).ready(function() {
var $menu = $('#menu');
var $menuItems = $menu.find('li');
var $toggleButton = $('#toggleMenu');
$toggleButton.on('click', function() {
$menu.toggleClass('open');
$menuItems.toggleClass('visible');
});
});
Здесь:
Кэширование селекторов является базовым и обязательным при работе с jQuery в реальных проектах. Оно напрямую влияет на скорость работы приложения и на поддерживаемость кода.