Текстовое содержимое всех выпадающих меню изменяется одновременно, а не обновляется отдельно

#javascript #html #twitter-bootstrap #bootstrap-4 #drop-down-menu

#javascript #HTML #twitter-bootstrap #bootstrap-4 #выпадающее меню

Вопрос:

На моем сайте есть три выпадающих меню, которые я создал с помощью Bootstrap. введите описание изображения здесьВ идеале, когда пользователь нажимает на выпадающее меню и выбирает один из пунктов внутреннего меню, выпадающее меню должно обновлять свое текстовое содержимое до текстового содержимого выбранного пункта меню.

введите описание изображения здесь

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

Мой текущий подход заключается в том, что aria-expanded атрибут для каждой раскрывающейся кнопки изменяется на true , если раскрывающийся список открыт на кнопке. Если aria-expanded значение определенного выпадающего меню равно true , то текстовое содержимое этой кнопки изменяется на текстовое содержимое выбранного пункта меню.

JS

 function addPlanesToDropDowns() {
  let dropdowns = document.querySelector('.dropdown-menu');
  let dropDownButtonOne = document.querySelector('#dropdownMenuButtonOne');
  let dropDownButtonTwo = document.querySelector("#dropdownMenuButtonTwo");
  let dropDownButtonThree = document.querySelector("#dropdownMenuButtonThree");
  dropDownDisabledCheck();

  for (let i = 0; i < state.airplaneData.length; i  ) {
    let dropDownMenuItem = document.createElement('a');
    dropDownMenuItem.classList.add('dropdown-item');
    dropDownMenuItem.href = '#';
    dropDownMenuItem.textContent = state.airplaneData[i].make   " "   state.airplaneData[i].model;

    dropDownMenuItem.addEventListener('click', function (event) {
      event.preventDefault();

      if (dropDownButtonOne.getAttribute('aria-expanded')) {
        dropDownButtonOne.textContent = dropDownMenuItem.textContent;
        dropDownButtonOne.setAttribute('aria-expanded', false);
      }
      if (dropDownButtonTwo.getAttribute('aria-expanded')) {
        dropDownButtonTwo.textContent = dropDownMenuItem.textContent;
        dropDownButtonTwo.setAttribute('aria-expanded', false);
      }
      if (dropDownButtonThree.getAttribute('aria-expanded')) {
        dropDownButtonThree.textContent = dropDownMenuItem.textContent;
        dropDownButtonThree.setAttribute('aria-expanded', false);
      }
      dropDownDisabledCheck();
    });
    dropdowns.appendChild(dropDownMenuItem);
  }
}
  

HTML

        <div class="dropdown">
            <button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButtonOne" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Plane 1</button>
            <button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButtonTwo" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Plane 2</button>
            <button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButtonThree" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Plane 3</button>
            <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
                <!-- <a class="dropdown-item" href="#">Planes go here</a> -->
            </div>
        </div>
  

Несмотря на это, все три выпадающих меню обновляются с тем же текстовым содержимым выбранного пункта меню, хотя я устанавливаю текстовое содержимое только для элемента button с определенным атрибутом ID.

Ответ №1:

Этот фрагмент кода dropDownButtonOne.getAttribute('aria-expanded') возвращает строку, а не логическое значение, поэтому либо "true" или "false" .

Поскольку это непустая строка, она всегда принимает значение TRUE . Вам нужно изменить свое условие.

Вы могли бы проверить if(dropDownButtonOne.getAttribute('aria-expanded') === "true") , например.