Как получить прямые потомки через CSS и JS по заданным условиям

Как получить соответствующие условию прямые потомки через CSS и JS

14.05.2021
85
3 мин.
0

Речь в этой статье пойдёт о том, как получить прямые потомки через CSS и нативный JavaScript, которые соответствуют заданным условиям. Для получения прямых потомков родительского элемента по CSS-классам на нативном JavaScript потребуется объединить три метода.

Прежде всего, создадим следующую простую HTML структуру:

<div id="beverages">
    <div id="one" class="orange">Соответствует условию</div>
    <div id="two" class="orange">
        <div id="three" class="orange">Не соответствует условию</div>
    </div>
    <div id="four" class="orange">Соответствует условию</div>
</div>

Как обратиться к прямым потомкам элемента

Допустим, нам требуется обратиться исключительно к прямым потомкам элемента c id beverages. Таковыми являются элементы с классом orange и id one, two и four. Элемент c id three также имеет класс orange, но он вложен в другой элемент, поэтому не подходит под заданное условие.

let beverages = document.querySelector('#beverages');
let orange = beverages.querySelectorAll('.orange');

Чтобы получить прямые потомки через CSS можно использовать метод Element.querySelectorAll(), чтобы получить все элементы по определённому селектору внутри другого элемента. Но он будет осуществлять поиск по всей структуре DOM-дерева в пределах блока с id beverages и вернёт элементы с id one, two и four.

let orange = beverages.children;

Так же, ещё одним вариантом является свойство Node.children, но оно возвращает всех прямых потомков родителя, независимо от класса. Чтобы исправить это потребуется объединить Node.children с несколькими другими методами.

Как получить прямые потомки через CSS и JS по заданным условиям
Обращение к прямым потомкам через CSS и JS (изображение создано с помощью ИИ)

Как получить прямые потомки через CSS и JS по заданным условиям

Можно использовать Array.from(), чтобы список элементов (NodeList), который возвращает всех потомков, принимал форму массива. Затем следует применить метод Array.filter() для удаления элементов, не соответствующих требуемому условию.

let orange = Array.from(beverages.children).filter(function (elem) {

     if (elem.matches('.orange')) {
          console.log(elem);
     }
     return elem.matches('.orange');

});

See the Pen
qBrZMRY
by Viacheslav Demchenko (@Viacheslav_Demchenko)
on CodePen.

Читайте также: Как получить параметры строки URL адреса на нативном JavaScript.

Кроссбраузерность

Методы Element.querySelectorAll() и Array.from() в отличие от Array.filter() не работают в Internet Explorer.