#javascript #dom #queryselector
#javascript #dom #queryselector
Вопрос:
Возможно ли с помощью querySelector выбрать элемент, если у него нет предка с определенным классом.
Например. Выберите все элементы, у которых нет класса «b» на любом уровне их дерева предков:
<div class="a">
<span class="element">First</span>
</div>
<div class="b">
<span class="element">Second</span>
<div class="c">
<span class="element">Third</span>
</div>
</div>
Я хотел бы исключить как второй, так и третий элементы из моего выбора, потому что они оба находятся в div класса «b».
document.querySelector(':not(.b) > element');
// returns the First and Third (because Third is not a direct child)
document.querySelector(':not(.b) element');
// returns the First and Third (because "c" fulfills the :not selection criteria of not being "b")
Это, очевидно, упрощенный пример. Элементы могут быть вложены на разных уровнях. Но пока у них есть класс «b» где-то в их дереве предков, они должны быть исключены из выборки.
Возможно ли это вообще с помощью querySelector?
Редактировать: я ищу решение, которое использует querySelector самостоятельно, поскольку я использую библиотеку, которая позволяет мне передавать только строку querySelector, и у меня нет доступа к внутреннему коду библиотеки для выполнения дополнительной фильтрации результатов. Кажется, это невозможно.
Ответ №1:
Я думаю, вам следует выбрать все области и отфильтровать их на основе их родителей.
let elements = document.querySelectorAll('.element');
let selections = [...elements].filter(element => !element.closest(".b"));
Комментарии:
1. Да, я знаю, что существуют другие методы JavaScript, которые могут достичь этого, но я надеялся на строку querySelector, которая могла бы выполнить выбор самостоятельно. Пример кода был просто упрощенным примером. Мой «реальный» код предполагает использование сторонней библиотеки, в которую мне нужно передать строку querySelector.
2. CSS не имеет родительского селектора. Вот почему вы не можете добиться этого так, как хотите. Вы хотите выбрать некоторые элементы, и мой код дает вам их. Я не понимаю, что имеет значение, если вы выбираете одни и те же элементы другим способом. Я думаю, вы должны правильно объяснить это в своем вопросе.
3. Спасибо, БА. Да, я не думал, что это возможно, но не был уверен. Полезно знать. В моем случае это имеет значение, потому что я использую библиотеку, которая позволяет мне передавать только строку querySelector. У меня нет доступа к внутреннему коду библиотеки для выполнения дополнительной фильтрации результатов. Вопрос отредактирован для объяснения причины.