Как найти определенный класс в DOM дереве с использованием JavaScript?

Как можно реализовать с помощью JavaScript следующее поведение: при клике на элемент списка (ссылку) ему устанавливается класс "isActive", а при клике на другой элемент списка этот класс устанавливается только на него, но с предыдущего элемента класс удаляется? Учитывая, что списки данных могут быть вложенными и иметь различные уровни, включая вертикальные и горизонтальные структуры. Требуется, вероятно, использовать рекурсивный алгоритм для обхода узлов и поиска нужных элементов.	progressiveEnhancement

Чтобы обеспечить лучшее понимание вашего вопроса, было бы полезно иметь представление о том, какие элементы конкретно должны быть учитаны при реализации этого поведения.
  • 21 августа 2024 г. 19:04
Ответы на вопрос 2

Для поиска определенного класса в DOM дереве с использованием JavaScript можно воспользоваться методом querySelector или querySelectorAll. Например, чтобы найти все элементы с классом "exampleClass", можно использовать следующий код:

```javascript
const elements = document.querySelectorAll('.exampleClass');
```

Для реализации описанного поведения при клике на элемент списка можно использовать следующий подход:

```javascript
const listItems = document.querySelectorAll('li');

listItems.forEach(item => {
    item.addEventListener('click', () => {
        // Устанавливаем класс "isActive" на текущий элемент
        item.classList.add('isActive');
        
        // Удаляем класс "isActive" с предыдущего активного элемента
        listItems.forEach(otherItem => {
            if (otherItem !== item && otherItem.classList.contains('isActive')) {
                otherItem.classList.remove('isActive');
            }
        });
    });
});
```

Этот код добавляет обработчик события click на каждый элемент списка. При клике на элемент, ему устанавливается класс "isActive", а у остальных элементов списка этот класс удаляется.

Для обработки вложенных списков можно использовать рекурсивный подход. Например, можно воспользоваться рекурсивной функцией для обхода дочерних элементов:

```javascript
function handleListItemClick(item) {
    item.addEventListener('click', () => {
        item.classList.add('isActive');
        
        listItems.forEach(otherItem => {
            if (otherItem !== item && otherItem.classList.contains('isActive')) {
                otherItem.classList.remove('isActive');
            }
        });
        
        // Рекурсивно вызываем функцию для обработки дочерних элементов
        const childItems = item.querySelectorAll('li');
        childItems.forEach(childItem => {
            handleListItemClick(childItem);
        });
    });
}

// Вызываем функцию для обработки каждого элемента списка
listItems.forEach(item => {
    handleListItemClick(item);
});
```

Этот код обрабатывает клики по элементам списка и их дочерним элементам рекурсивно.
Алгоритм: 
0. В любом случае есть родительский контейнер, поэтому работаешь от него. Лучше чтобы у него был id, тогда при работе функции отслеживания ты сможешь её запускать с нужным айди, она будет универсально и поддерживать множество независимых подобных контейнеров с этим меню.
1. По клику ищешь текущий isActive (с учетом специфичности родительского контейнера) и снимаешь все активные.
2. Делаешь кликнутый активным.

Условный пример. Не продашн рэди) Но смысл ясен.

Похожие вопросы