Это просто неверный селектор CSS:
> .shouldBeAffected {
border: none;
}
Это означает, что вы не сможете использовать querySelector
или querySelectorAll
от прямого родителя. Но следующая функция принимает только селектор '.shouldBeAffected'
и родительский элемент и возвращает всех прямых потомков, соответствующих селектору:
const directChildren = (element, selector) => (
[...element.children].filter((child) => child.matches(selector))
);
// test run: get all divs with class child that are a direct child of `parent`
const parent = document.getElementById('parent');
console.log(directChildren(parent, 'div.child'));
<div id="parent">
<div class="child">yes</div>
<span class="child">no</span>
<button class="child">no</button>
<div class="child">
yes
<div class="child child--fake">NO!</div>
</div>
</div>
Теперь ваша функция может быть изменена следующим образом, чтобы она работала.
function doWithDirectChildren(parentNode) {
const children = directChildren(parentNode, ".shouldBeAffected");
for(const direct of children) {
// do something with the direct child
}
}
Редактировать
Из комментариев мы можем сделать еще один шаг и создать функции querySelectorChild
и querySelectorChildren
в качестве эквивалентов querySelector
и querySelectorAll
соответственно:
/**
* Get the first direct child of `element` that matches `selector`
*/
const querySelectorChild = (element, selector) => (
Array.from(element.children).find((child) => child.matches(selector))
);
/**
* Get all direct children of `element` that match `selector`
*/
const querySelectorChildren = (element, selector) => (
Array.from(element.children).filter((child) => child.matches(selector))
);