Подскажите, как проверить есть ли у меню подменю? Моя задумка простая: если у элемента li внутри есть элемент ul, значит подменю содержится и родителю нужно задать класс.
<nav class="header__nav">
<ul class="header__menu">
<li><a href="#">Home</a></li>
<li><a href="#">Catalog</a>
<ul class="header__submenu">
<li>1</li>
<li>2</li>
</ul>
</li>
<li><a href="#">About</a></li>
<li><a href="#">Blog</a>
<ul class="header__submenu">
<li>1</li>
<li>2</li>
</ul>
</li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
Но как это реализовать на js никак не пойму. Вариант 1:
const menu = document.querySelector('.header__menu').children;
for (let item of menu) {
if (item.contains("UL")) {
console.log('hi');
}
}
Тут получаю ошибку, что первый параметр contains не Node. Я не пойму, как передать 1 параметр в contains так, чтобы это был Node?
2 вариант:
for (let item of menu) {
for (let i = 0; i < item.childNodes.length; i++) {
if (item.childNodes[i] == 'LI') {
console.log('hi');
}
}
}
Тоже не понятно как проверить) Подскажите, как правильно делать данную проверку?
Используйте querySelectorAll по полной. Просто отталкивайтесь от обратного - вместо перебора, ищите сразу нужные элементы, а после их родителей.
[...document.querySelectorAll('li > ul')].forEach(ul => {
ul.parentElement.classList.add('red');
})
.red { background-color: red; }
<nav class="header__nav">
<ul class="header__menu">
<li><a href="#">Home</a></li>
<li><a href="#">Catalog</a>
<ul class="header__submenu">
<li>1</li>
<li>2</li>
</ul>
</li>
<li><a href="#">About</a></li>
<li><a href="#">Blog</a>
<ul class="header__submenu">
<li>1</li>
<li>2</li>
</ul>
</li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
1 contains принимает node элемент а не тег потому и ошибка
2 нужно проверять на elem.childNodes[i].tagName
как алтернатива
const menu = document.querySelector('.header__menu').children;
for(let key of menu){
if((key.querySelector('ul'))){
console.log(key)
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей