Как проверить содержание подменю?

209
09 мая 2022, 14:10

Подскажите, как проверить есть ли у меню подменю? Моя задумка простая: если у элемента 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');
    }
  }
}

Тоже не понятно как проверить) Подскажите, как правильно делать данную проверку?

Answer 1

Используйте 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>

Answer 2

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)
    }
}
READ ALSO
Почему не работает break;

Почему не работает break;

(userAnswer1 || userAnswer2) != answer - это не так сравниваетсяВедь если два ответа будут отменены, то (null || null) != answer будет true

167
Как динамически изменить массив? React js

Как динамически изменить массив? React js

У меня есть два компонента, в первом компоненте массив, который я хочу динамически изменить (например при нажатии на кнопку) и передать во второй...

255
Scroll Модального окна

Scroll Модального окна

Всем привет! У меня имеется приложение и кнопка при клике на которую появляется модальное окно(в нем содержатся продукты взятые из store(redux))При...

161
Не перезаписывает содержимое DIV

Не перезаписывает содержимое DIV

При нажатии <button> выполняется функция f1()Функция получает div

151