#javascript #jquery #accordion
#javascript #jquery #аккордеон
Вопрос:
Я работаю с некоторым старым кодом для аккордеона, используя JavaScript, добавляя новые функциональные возможности. Я, наконец, добрался до того, что аккордеон открывается и закрывается по щелчку, и одновременно открывается только один. Мой вопрос заключается в следующем: есть строка кода (panel.toggleClass(«mystyle»);), которая выдает ошибку консоли о том, что это не функция, но когда я вынимаю ее, переключатель больше не работает. Я озадачен тем, почему это происходит. CSS для mystyle — display:none; .
<button role="button" aria-expanded="false" aria-controls="answer<?php echo $i; ?>" class="accordion">
<h2>Websites</h2><i role="presentation" style="float:right; margin:15px;" class="rt-icon icon-plus-circled"></i>
<h3>Heading</h3>
<p>Blurb Goes Here</p>
</button>
<div id="answer" class="panel">
<div>
<h3>Answer</h3>
<p>Answer Text</p>
</div>
</div>
<script>
var acc = document.getElementsByClassName("accordion");
var i;
for (i = 0; i < acc.length; i ) {
acc[i].addEventListener("click", function() {
//toggle i class for plus to minus on click
jQuery("i", this).toggleClass("icon-plus-circled icon-minus-circled-1 ");
var panel = this.nextElementSibling;
if (panel.style.maxHeight) {
// need both to make toggle function
panel.style.maxHeight = null;
panel.toggleClass("mystyle");
} else {
panel.style.maxHeight = panel.scrollHeight "px";
// Loop over all the panels an close each one
document.querySelectorAll(".panel").forEach(function(panel){
panel.style.maxHeight = null;
});
}
var x = this.getAttribute("aria-expanded");
if (x === "true") {
x = "false";
panel.style.maxHeight = null;
} else {
x = "true";
panel.style.maxHeight = panel.scrollHeight "px";
}
this.setAttribute("aria-expanded", x);
panel.style.maxHeight = panel.scrollHeight "px";
});
}
</script>
Комментарии:
1.
toggleClass()
это метод jQuery.panel
не является объектом jQuery.2. Почему вы так часто переключаетесь между DOM и jQuery? Если вы используете jQuery, вам не нужен
for
цикл, вы можете использовать$(".accordion").click(function() ... )
. И тогда вы можете использоватьvar panel = $(this).next()
и использовать методы jQuery для него.3. Спасибо вам обоим за вашу помощь! Я унаследовал этот код со старого сайта и изо всех сил пытался понять, почему они написали код таким образом. Я воспользуюсь предложением и преобразоваю его, чтобы просто использовать jQuery, что должно решить мою проблему.