#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:
Есть две основные проблемы:
-
Все выпадающие списки имеют одинаковый идентификатор, поэтому первый всегда находится в myFunction. Идентификатор должен быть уникальным в DOM.
-
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