Переключить меню с одним открытым меню за один раз в чистом javascript - PullRequest
1 голос
/ 12 февраля 2020

Я хочу, чтобы меню переключалось, и один элемент из меню был открыт одновременно. Я могу открыть один элемент за раз, но не могу переключиться одновременно.

var navclick = document.getElementsByClassName("js-dropdown");
var navContent = document.getElementsByClassName('-arrow-link-content');
for (var i = 0; i < navclick.length; i++) {
    navclick[i].onclick = function () {
      if (this.parentNode.querySelector('div.-arrow-link-content').classList.contains('nav-active')) {
        this.parentNode.querySelector('div.-arrow-link-content').classList.remove('nav-active'); 
      }
      else {
        this.parentNode.querySelector('div.-arrow-link-content').classList.add('nav-active');
      }
    }
  }
.-arrow-link-content {
  display:none;
}
.nav-active{ display:block;}
<ul class="c-icons" id="c-iconslist">
                    <li>
                        <div class="c-icons__text js-dropdown">heading 1</div>
                     <div class="c-icons__textdropdown -arrow-link-content"> Content 1</div>
                    </li>
                       <li>
                        <div class="c-icons__text js-dropdown">heading 2</div>
                     <div class="c-icons__textdropdown -arrow-link-content"> Content 2</div>
                    </li>
                </ul>

если у кого-либо есть какие-либо предложения .. пожалуйста, поделитесь .. Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Чтобы переключиться на работу, нам нужно получить все узлы с именем класса -arrow-link-content, а затем сначала удалить класс nav-active, а затем добавить nav-active к выбранному элементу.

Проверьте фрагмент.

var navclick = document.getElementsByClassName("js-dropdown");
var navContent = document.getElementsByClassName('-arrow-link-content');
for (var i = 0; i < navclick.length; i++) {
  navclick[i].onclick = function() {
    if (this.parentNode.querySelector('div.-arrow-link-content').classList.contains('nav-active')) {
      this.parentNode.querySelector('div.-arrow-link-content').classList.remove('nav-active');
      return false
    }


    var el = document.querySelectorAll('div.-arrow-link-content');
    for (var i = 0; i < el.length; i++) {
      if (el[i].classList.contains('nav-active')) el[i].classList.remove('nav-active');
    }
    this.parentNode.querySelector('div.-arrow-link-content').classList.add('nav-active');

  }
}
.-arrow-link-content {
  display: none;
}

.nav-active {
  display: block;
}
<ul class="c-icons" id="c-iconslist">
  <li>
    <div class="c-icons__text js-dropdown">heading 1</div>
    <div class="c-icons__textdropdown -arrow-link-content"> Content 1</div>
  </li>
  <li>
    <div class="c-icons__text js-dropdown">heading 2</div>
    <div class="c-icons__textdropdown -arrow-link-content"> Content 2</div>
  </li>
</ul>
1 голос
/ 12 февраля 2020

Поскольку не более одного элемента может быть открыто одновременно, нам просто нужно найти этот один элемент и сначала закрыть его, если он существует, прежде чем открывать неоткрытый элемент

var navclick = document.getElementsByClassName("js-dropdown");
var navContent = document.getElementsByClassName('-arrow-link-content');
for (var i = 0; i < navclick.length; i++) {
    navclick[i].onclick = function () {
      if (this.parentNode.querySelector('div.-arrow-link-content').classList.contains('nav-active')) {
        this.parentNode.querySelector('div.-arrow-link-content').classList.remove('nav-active'); 
      }
      else {
        try {
          // if an open element exists, close it first
          this.parentNode.parentNode.querySelector('.nav-active').classList.remove('nav-active');
         }
          catch (error){ 
            // Error occurs when no open elment exists, in that case: Do nothing
          }
        this.parentNode.querySelector('div.-arrow-link-content').classList.add('nav-active');
      }
    }
  }
 
.-arrow-link-content {
  display:none;
}
.nav-active{ display:block;}
<ul class="c-icons" id="c-iconslist">
                    <li>
                        <div class="c-icons__text js-dropdown">heading 1</div>
                     <div class="c-icons__textdropdown -arrow-link-content"> Content 1</div>
                    </li>
                       <li>
                        <div class="c-icons__text js-dropdown">heading 2</div>
                     <div class="c-icons__textdropdown -arrow-link-content"> Content 2</div>
                    </li>
                </ul>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...