Всё сам. Сделал код, полностью работает, можно ли как то его улучшить? Говнокод или пойдёт? Если убрать closeAnswer то остальные открытые элементы не будут сами закрываться, а будет закрываться только тот элемент, на который кликну. Можно потыкать https://plnkr.co/edit/Tkp3xcf8T0nKYh8ykgvC?p HTML: <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="style.css"> <script src="script.js"></script> </head> <body> <div class="box-question"> <div class="question"> <div class="additionally"> <a href="#">Показать ответ 1</a> </div> </div> <div class="answer answer-index"> Этот текст открывается и закрывается </div> </div> <div class="box-question"> <div class="question"> <div class="additionally"> <a href="#">Показать ответ 2</a> </div> </div> <div class="answer answer-index"> Этот текст открывается и закрывается </div> </div> <div class="box-question"> <div class="question"> <div class="additionally"> <a href="#">Показать ответ 3</a> </div> </div> <div class="answer answer-index"> Этот текст открывается и закрывается </div> </div> </body> </html> Код (Javascript): function closeAnswer() { var allAnswers = document.querySelectorAll('.answer'); allAnswers.forEach(function (answer, i) { answer.classList.add('answer-index'); }) } document.documentElement.addEventListener('click', function (event) { event.preventDefault(); var target = event.target; var question = target.closest('.box-question'); var answer = question.querySelector('.answer'); if (answer.classList.contains('answer-index')) { closeAnswer() answer.classList.remove('answer-index'); } else { closeAnswer() answer.classList.add('answer-index'); } }); Код (CSS): .answer-index { display: none; }
Вот так сделал Код (Javascript): <script> function closeAnswer() { var allAnswers = document.querySelectorAll('.answer'); allAnswers.forEach(function (answer, i) { answer.classList.add('answer-index'); }) } document.documentElement.addEventListener('click', function (event) { var target = event.target; if (target.classList.contains("button-answer")) { var question = target.closest('.box-question'); var answer = question.querySelector('.answer'); if (answer.classList.contains('answer-index')) { closeAnswer() answer.classList.toggle('answer-index'); } else { answer.classList.toggle('answer-index'); } } }); </script>
@Dimon2x Код (Javascript): let ansver = null; document.onclick = function(event) { let target = event.target.parentElement.parentElement.parentElement.lastElementChild; if(target && target.classList.contains("answer")) { if(ansver) { ansver.classList.toggle("answer-index"); } target.classList.toggle("answer-index"); ansver = target; } } похоже на говнокод, но это из за верстки
@Artur_hopf HTML: event.target.parentElement.parentElement.parentElement.lastElementChild; Вставить элемент между элементами и всё сломается, надо делать привязку, к конкретным блокам.
Код (Javascript): document.querySelectorAll(“.box-question”).forEach(question => question.addEventListener(“click”, questionToggle);); function questionToggle(e) { e.preventDefault(); let answer = e.currentTarget.querySelector(“.answer”); if (answer && e.target.tagName === “A”) { answer.classList.toggle(“answer-index”, answer.classList.contains(“answer-index”); } } или же вообще обойтись без forEach если выше вопросы находятся в одном контейнере