Как осуществить? когда один вопрос открывается, остальные закрываются?

Ссылка скопирована
1 ответ

На этой страничке возможно это реализовать (во вкладке Ответы и Вопросы)? Подскажите куда двигаться? нашел на просторах скрипт (второй который), но как применить/привязать к моему списку ФАК не знаю, подскажите пожалуйста

<script>         var label1 = document.getElementById('tab-btn-1');         var label2 = document.getElementById('tab-btn-2');         var label3 = document.getElementById('tab-btn-3');         var label4 = document.getElementById('tab-btn-4');                  var block1 = document.getElementById('content-1');         var block2 = document.getElementById('content-2');         var block3 = document.getElementById('content-3');         var block4 = document.getElementById('content-4');                  var blocks = [block1, block2, block3, block4];                  label1.addEventListener('click', () => {             for(let i = 0; i < blocks.length; i++){                 if(i == 0){                     blocks[i].style.display = 'block';                 }                 else{                     blocks[i].style.display = 'none';                 }             }         });         label2.addEventListener('click', () => {             for(let i = 0; i < blocks.length; i++){                 if(i == 1){                     blocks[i].style.display = 'block';                 }                 else{                     blocks[i].style.display = 'none';                 }             }         });         label3.addEventListener('click', () => {             for(let i = 0; i < blocks.length; i++){                 if(i == 2){                     blocks[i].style.display = 'block';                 }                 else{                     blocks[i].style.display = 'none';                 }             }         });         label4.addEventListener('click', () => {             for(let i = 0; i < blocks.length; i++){                 if(i == 3){                     blocks[i].style.display = 'block';                 }                 else{                     blocks[i].style.display = 'none';                 }             }         });     </script>     <script>     let accordYar = document.querySelectorAll(.accordeon-rules ul li input[type="checkbox"]);  let accordYarText = document.querySelectorAll(.accordeon-rules ul li input[type="checkbox"]:checked~p); accordYarTextOpen = document.querySelectorAll(.accordeon-rules ul li input[type="checkbox"]:not(:checked)~p).forEach(e=>e.style.display = none); accordYarText.forEach(e => e.style.display = none); for(i=0; i<accordYar.length; i++) {     accordYar[i].addEventListener(click, (el)=> {       alert(ss);       accordYarText.forEach(e=> e.style.display = none)       el.currentTarget.classList.add(open);     }) } </script>

<script> var label1 = document.getElementById('tab-btn-1'); var label2 = document.getElementById('tab-btn-2'); var label3 = document.getElementById('tab-btn-3'); var label4 = document.getElementById('tab-btn-4'); var block1 = document.getElementById('content-1'); var block2 = document.getElementById('content-2'); var block3 = document.getElementById('content-3'); var block4 = document.getElementById('content-4'); var blocks = [block1, block2, block3, block4]; label1.addEventListener('click', () => { for(let i = 0; i < blocks.length; i++){ if(i == 0){ blocks[i].style.display = 'block'; } else{ blocks[i].style.display = 'none'; } } }); label2.addEventListener('click', () => { for(let i = 0; i < blocks.length; i++){ if(i == 1){ blocks[i].style.display = 'block'; } else{ blocks[i].style.display = 'none'; } } }); label3.addEventListener('click', () => { for(let i = 0; i < blocks.length; i++){ if(i == 2){ blocks[i].style.display = 'block'; } else{ blocks[i].style.display = 'none'; } } }); label4.addEventListener('click', () => { for(let i = 0; i < blocks.length; i++){ if(i == 3){ blocks[i].style.display = 'block'; } else{ blocks[i].style.display = 'none'; } } }); </script> <script> let accordYar = document.querySelectorAll(.accordeon-rules ul li input[type="checkbox"]); let accordYarText = document.querySelectorAll(.accordeon-rules ul li input[type="checkbox"]:checked~p); accordYarTextOpen = document.querySelectorAll(.accordeon-rules ul li input[type="checkbox"]:not(:checked)~p).forEach(e=>e.style.display = none); accordYarText.forEach(e => e.style.display = none); for(i=0; i<accordYar.length; i++) { accordYar[i].addEventListener(click, (el)=> { alert(ss); accordYarText.forEach(e=> e.style.display = none) el.currentTarget.classList.add(open); }) } </script>

Дополнительно

Как осуществить? когда один вопрос открывается, остальные закрываются?

Сергей delphinpro @delphinpro Куратор тега JavaScript frontend developer snippet

Ответы:

Сделать 1 обработчик, который при клике откроет твой вопрос, а в цикле, другие закроет.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Ирина WP Ответ

Вам нужен обычный accordion: при открытии одного пункта закрываются остальные. В текущем варианте проблема не только в привязке к конкретным label1, label2, но и в синтаксисе: селекторы в querySelectorAll() должны быть строками, в for нужна проверка i < blocks.length, а скрипт должен запускаться после появления разметки. Проще не писать отдельный обработчик на каждый вопрос, а дать всем пунктам одинаковые классы.

&lt;div class='faq-list'&gt;
  &lt;div class='faq-item'&gt;
    &lt;button class='faq-question' type='button'&gt;Вопрос 1&lt;/button&gt;
    &lt;div class='faq-answer'&gt;Ответ 1&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class='faq-item'&gt;
    &lt;button class='faq-question' type='button'&gt;Вопрос 2&lt;/button&gt;
    &lt;div class='faq-answer'&gt;Ответ 2&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class='faq-list'&gt; &lt;div class='faq-item'&gt; &lt;button class='faq-question' type='button'&gt;Вопрос 1&lt;/button&gt; &lt;div class='faq-answer'&gt;Ответ 1&lt;/div&gt; &lt;/div&gt; &lt;div class='faq-item'&gt; &lt;button class='faq-question' type='button'&gt;Вопрос 2&lt;/button&gt; &lt;div class='faq-answer'&gt;Ответ 2&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;

document.addEventListener('click', function (event) {
    const button = event.target.closest('.faq-question');
    if (! button) return;
 
    const current = button.closest('.faq-item');
    const wasOpen = current.classList.contains('is-open');
 
    document.querySelectorAll('.faq-item.is-open').forEach(function (item) {
        item.classList.remove('is-open');
    });
 
    if (! wasOpen) {
        current.classList.add('is-open');
    }
});

document.addEventListener('click', function (event) { const button = event.target.closest('.faq-question'); if (! button) return; const current = button.closest('.faq-item'); const wasOpen = current.classList.contains('is-open'); document.querySelectorAll('.faq-item.is-open').forEach(function (item) { item.classList.remove('is-open'); }); if (! wasOpen) { current.classList.add('is-open'); } });

.faq-answer { display: none; }
.faq-item.is-open .faq-answer { display: block; }

.faq-answer { display: none; } .faq-item.is-open .faq-answer { display: block; }

Такой код работает для любого количества вопросов, потому что ищет текущий пункт через closest(). Если один ответ всегда должен оставаться открытым, уберите переменную wasOpen и всегда добавляйте класс is-open текущему пункту после закрытия остальных. Если разметка уже сделана на checkbox, можно либо заменить их на radio с одинаковым name, если один пункт должен быть открыт всегда, либо при событии change снимать checked со всех соседних checkbox. Но для FAQ кнопки обычно правильнее: это действие интерфейса, а не поле формы.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно