Содержимое выпадающего списка некорректно отображается при нажатии кнопки — динамически

#javascript #php #html #css

#javascript #php #HTML #css

Вопрос:

У меня проблема с выпадающим контентом на стороне http://www.filmwatch.sk/serialy/the-godfather / Когда я нажимаю на кнопку 1.серия показывает выпадающее содержимое 1.эпизод, но когда я нажимаю на кнопку 2.серия показывает то же выпадающее содержимое 1.эпизод, но мне нужно показать 2 и 3 эпизода (выпадающее содержимое Godfather S02E02 и Godfather S02E03). Вот код:

 <style>
/* Dropdown Button */
.dropbtn {
  background-color: #3498DB;
  color: white;
  padding: 16px;
  font-size: 16px;
  border: none;
  cursor: pointer;
}

/* Dropdown button on hover amp; focus */
.dropbtn:hover, .dropbtn:focus {
  background-color: #2980B9;
}

/* The container <div> - needed to position the dropdown content */
.dropdown {
  position: relative;
  display: inline-block;
}

/* Dropdown Content (Hidden by Default) */
.dropdown-content {
  display: none;
  position: absolute;
  background-color: #f1f1f1;
  min-width: 160px;
  box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
  z-index: 1;
}

/* Links inside the dropdown */
.dropdown-content a {
  color: black;
  padding: 12px 16px;
  text-decoration: none;
  display: block;
}

/* Change color of dropdown links on hover */
.dropdown-content a:hover {background-color: #ddd}

/* Show the dropdown menu (use JS to add this class to the .dropdown-content container when the user clicks on the dropdown button) */
.show {display:block;}
</style>


<?php
if( have_rows('o1') ):
   while( have_rows('o1') ): the_row(); 
   ?>
<button onclick="myFunction()" class="dropbtn"><?php the_sub_field('s'); ?></button>
    <div id="myDropdown" class="dropdown-content">
    <?php
    if( have_rows('o2') ):
    while ( have_rows('o2') ) : the_row();
$link = get_sub_field('e');
    if( $link ): 
    $link_url = $link['url'];
    $link_title = $link['title'];
    $link_target = $link['target']? $link['target'] : '_self';
    ?>
    <a class="button" href="<?php echo esc_url( $link_url ); ?>" target="<?php
    echo esc_attr( $link_target ); ?>"><?php echo esc_html( $link_title ); ?><br></a>
<?php endif;         
 endwhile;
else :
endif; ?>  </div>  <?php
endwhile; 
endif;  
?>


<script>
/* When the user clicks on the button,
toggle between hiding and showing the dropdown content */
function myFunction() {
  document.getElementById("myDropdown").classList.toggle("show");
}

// Close the dropdown menu if the user clicks outside of it
window.onclick = function(event) {
  if (!event.target.matches('.dropbtn')) {
    var dropdowns = document.getElementsByClassName("dropdown-content");
    var i;
    for (i = 0; i < dropdowns.length; i  ) {
      var openDropdown = dropdowns[i];
      if (openDropdown.classList.contains('show')) {
        openDropdown.classList.remove('show');
      }
    }
  }
}
</script>
  

Любая помощь приветствуется

Комментарии:

1. Получение предупреждений о том, что сайт, на который вы ссылаетесь, имеет недействительный сертификат.

Ответ №1:

Есть две основные проблемы:

  1. Все выпадающие списки имеют одинаковый идентификатор, поэтому первый всегда находится в myFunction. Идентификатор должен быть уникальным в DOM.

  2. myFunction не отображает выпадающий список, который может уже отображаться

Решение состоит в том, чтобы полностью исключить использование идентификаторов и заставить myFunction очистить все отображаемые в данный момент выпадающие списки.

Замените эти две строки

 <button onclick="myFunction()" class="dropbtn"><?php the_sub_field('s'); ?></button>
<div id="myDropdown" class="dropdown-content">
  

с помощью этих

 <button onclick="myFunction(event)" class="dropbtn"><?php the_sub_field('s'); ?></button>
<div class="dropdown-content">
  

и замените JavaScript на это

 /* When the user clicks on **a** button,
toggle between hiding and showing the dropdown content */
function myFunction(event) {
//FIND THE DROPDOWN ELEMENT ASSOCIATED WITH THE BUTTON THAT HAS JUST BEEN CLICKED
  var dropdownEl = event.target.nextElementSibling;
  dropdownEl.classList.toggle("show");
  clearShowExcluding(dropdownEl);
}

function clearShowExcluding(el) {
//CLEAR ANY SHOW CLASS ON ANY OTHER DROPDOWN ELEMENT
  var dropdowns = document.getElementsByClassName("dropdown-content");
    var i;
    for (i = 0; i < dropdowns.length; i  ) {
      var openDropdown = dropdowns[i];
      if ((openDropdown!=el)amp;amp;openDropdown.classList.contains('show')) {
        openDropdown.classList.remove('show');
      }
    }
}

// Close the dropdown menu if the user clicks outside of it
window.onclick = function(event) {
  if (!event.target.matches('.dropbtn')) {
    clearShowExcluding('');
  }
}
  

Комментарии:

1. Спасибо за совет. Я новичок в программировании. Я не знаю, как правильно его закодировать. Мне нужно добавить больше серий и эпизодов в WordPress admin. Можете ли вы мне помочь и написать мне код, который будет работать. @A Haworth

2. Я боюсь, что это займет несколько часов. Ваш код WordPress выглядит нормально, и будет легко добавить больше строк, это бит, который связывает это с выпадающими списками, которые пользователь увидит в своем браузере, что требует немного большего объяснения.

3. Да, добавить больше строк не проблема. Я использую плагин ACF, o1 — поле повторителя, серии — тип текстового поля (строка s), o2 — повторитель, а эпизоды — тип поля ссылки (строка e). Если это необходимо, я могу отправить электронное письмо с учетными данными в wpadmin. @A Haworth