Как получить детей $(this) в jQuery? Разбираем на пальцах
Представьте: вы пишете интерактивную таблицу на сайте. Пользователь кликает по строке, и вам нужно подсветить именно её ячейки, не трогая соседние. Или вы делаете выпадающее меню — клик по заголовку должен показать только его подпункты. В обоих случаях встаёт вопрос: «Как получить дочерние элементы того элемента, на который я только что кликнул?»
Этот вопрос — настоящий хит на Stack Overflow. Тысячи разработчиков, от новичков до профи, ищут ответ. И неудивительно: работа с $(this) и его детьми — база, без которой не обойтись. Сегодня мы раз и навсегда разберёмся, как это делать правильно, красиво и без багов.
Почему $(this).children() — не панацея?
Самый очевидный способ — метод children(). Он возвращает только прямых потомков (первый уровень вложенности). Звучит логично, но часто новички ожидают от него магии, которой нет.
// HTML:
// <div id="parent">
// <span>Прямой потомок</span>
// <div>
// <span>Вложенный потомок (не вернётся)</span>
// </div>
// </div>
$('#parent').click(function() {
// Вернёт только первый <span> и <div>
let directChildren = $(this).children();
console.log(directChildren.length); // 2
});
Важно: children() не заглядывает внутрь вложенных блоков. Если вам нужны все потомки любой глубины — используйте find().
Способ №1: Классика — $(this).children()
Когда использовать: когда вам нужны только элементы непосредственно внутри текущего блока. Например, у вас есть список <ul>, и вы хотите перебрать его <li>.
// Пример: клик по контейнеру товара
$('.product-card').on('click', function() {
// Получаем все прямые дочерние элементы карточки
let kids = $(this).children();
// Перебираем и что-то делаем
kids.each(function(index) {
$(this).addClass('highlighted');
});
});
Фишка: можно отфильтровать по селектору прямо в вызове:
// Только <div> внутри текущего элемента
let divsOnly = $(this).children('div');
Способ №2: Глубокий поиск — $(this).find()
Когда использовать: когда структура вложенная и вам нужны все элементы с определённым классом или тегом, независимо от глубины. Например, найти все картинки внутри статьи.
// Клик по блоку новости
$('.news-block').on('click', function() {
// Найдём все <img> внутри, даже если они в подзаголовках
let images = $(this).find('img');
images.each(function() {
// Добавим рамку каждой картинке
$(this).css('border', '2px solid red');
});
});
Отличие от children(): find() обходит всё дерево DOM внутри элемента. children() — только первый уровень. Запомните правило: «Дети — это дети. Find — это все потомки до седьмого колена».
Способ №3: Нативный JavaScript — без jQuery
А что, если вы пишете на чистом JS или хотите уменьшить зависимость от библиотек? У $(this) есть «нативный» аналог — this в обработчике события. И у него тоже есть дети!
// Чистый JavaScript
document.querySelectorAll('.item').forEach(item => {
item.addEventListener('click', function() {
// Получаем прямых детей
let children = this.children; // HTMLCollection
// Превращаем в массив для удобства
Array.from(children).forEach(child => {
child.style.backgroundColor = 'yellow';
});
// Или ищем всех потомков по селектору
let allSpans = this.querySelectorAll('span');
});
});
Совет для гибридного подхода: внутри jQuery-обработчика вы можете легко получить нативный DOM-элемент через $(this)[0] или this (если используете jQuery-обработчик, this всё равно указывает на DOM-элемент).
Сравнительная таблица: что выбрать?
| Метод | Что возвращает | Глубина | Фильтр по селектору | Производительность |
|---|---|---|---|---|
$(this).children() |
jQuery-объект | Только 1 уровень | Да | Высокая (быстрее find) |
$(this).find() |
jQuery-объект | Все уровни | Да | Средняя (обход всего поддерева) |
this.children |
HTMLCollection (нативный) | Только 1 уровень | Нет (только через цикл) | Очень высокая (нативный DOM) |
this.querySelectorAll() |
NodeList (нативный) | Все уровни | Да | Высокая |
Типичные ошибки и как их избежать
- Ошибка №1: Путаница между children() и find(). Помните: если вам нужны только прямые потомки —
children(). Если все —find(). - Ошибка №2: Забыли про контекст this. Внутри стрелочной функции
thisне будет ссылаться на элемент! Используйтеfunction()или сохраняйтеconst self = this. - Ошибка №3: Ожидание, что children() вернёт текст.
children()возвращает только DOM-элементы. Текстовые узлы игнорируются. Для текста используйте.contents(). - Ошибка №4: Попытка вызвать children() на пустом jQuery-объекте. Всегда проверяйте, что элемент существует:
if ($(this).length) { ... }.
Живой пример: интерактивное меню
Давайте соберём всё вместе. Предположим, у нас есть меню, где каждый пункт раскрывает свой подсписок: