JavaScript 手风琴 - for 循环内部的 for 循环问题
JavaScript accordion - problem with for loop inside for loop
我为一个简单的手风琴编写了 javascript 代码。该程序有效,但我有一个问题,每次加载页面时,我都必须在标题(h2 标签)上 double-click,之后它运行良好并响应一次点击。我不知道为什么它在页面加载后不立即进入第二个for循环?
var acc = document.getElementsByClassName("accordionItemHeading");
var panel = document.getElementsByClassName("textAccordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
console.log(i);
for (i = 0; i < acc.length; i++) {
if (acc[i].classList.contains("active") && panel[i].style.display === "none"){
panel[i].style.display = "block";
console.log(i);
}
else {
panel[i].style.display = "none";
}
acc[i].classList.remove("active");
}
});
}
.textAccordion {
display: none;
background-color: blue;
overflow: hidden;
}
<div class="accordion">
<h2 class="accordionItemHeading">One</h2>
<p class="textAccordion">Aenean pretium lorem sit amet sapien ornare, sit amet consequat mauris fringilla.</p>
<h2 class="accordionItemHeading">Two</h2>
<p class="textAccordion">Aenean pretium lorem sit amet sapien ornare, sit amet consequat mauris fringilla.</p>
<h2 class="accordionItemHeading">Three</h2>
<p class="textAccordion">Aenean pretium lorem sit amet sapien ornare, sit amet consequat mauris fringilla.</p>
<h2 class="accordionItemHeading">Four</h2>
<p class="textAccordion">Aenean pretium lorem sit amet sapien ornare, sit amet consequat mauris fringilla.</p>
</div>
它不会在页面加载后进入第二个 for 循环,因为第二个 for 循环在事件处理程序中。因此,当您实际单击某些内容时,将调用事件处理程序,.addEventListener("click", () => {})
因此,当您第一次单击它时,它会进入您的事件循环,并使用您的 for 循环执行回调。
首先,您的面板 ""
设置为 display
样式。
唯一的问题是 if
条件因此失败。
如果您在第一个循环开始时设置 display: none
(在事件侦听器之前),行为就是您所期望的。
var acc = document.getElementsByClassName("accordionItemHeading");
var panel = document.getElementsByClassName("textAccordion");
var i;
for (i = 0; i < acc.length; i++) {
panel[i].style.display = "none";
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
for (i = 0; i < acc.length; i++) {
if (acc[i].classList.contains("active") && panel[i].style.display === "none"){
panel[i].style.display = "block";
console.log(i);
}
else {
panel[i].style.display = "none";
}
acc[i].classList.remove("active");
}
});
}
.textAccordion {
display: none;
background-color: blue;
overflow: hidden;
}
<div class="accordion">
<h2 class="accordionItemHeading">One</h2>
<p class="textAccordion">Aenean pretium lorem sit amet sapien ornare, sit amet consequat mauris fringilla.</p>
<h2 class="accordionItemHeading">Two</h2>
<p class="textAccordion">Aenean pretium lorem sit amet sapien ornare, sit amet consequat mauris fringilla.</p>
<h2 class="accordionItemHeading">Three</h2>
<p class="textAccordion">Aenean pretium lorem sit amet sapien ornare, sit amet consequat mauris fringilla.</p>
<h2 class="accordionItemHeading">Four</h2>
<p class="textAccordion">Aenean pretium lorem sit amet sapien ornare, sit amet consequat mauris fringilla.</p>
</div>
我为一个简单的手风琴编写了 javascript 代码。该程序有效,但我有一个问题,每次加载页面时,我都必须在标题(h2 标签)上 double-click,之后它运行良好并响应一次点击。我不知道为什么它在页面加载后不立即进入第二个for循环?
var acc = document.getElementsByClassName("accordionItemHeading");
var panel = document.getElementsByClassName("textAccordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
console.log(i);
for (i = 0; i < acc.length; i++) {
if (acc[i].classList.contains("active") && panel[i].style.display === "none"){
panel[i].style.display = "block";
console.log(i);
}
else {
panel[i].style.display = "none";
}
acc[i].classList.remove("active");
}
});
}
.textAccordion {
display: none;
background-color: blue;
overflow: hidden;
}
<div class="accordion">
<h2 class="accordionItemHeading">One</h2>
<p class="textAccordion">Aenean pretium lorem sit amet sapien ornare, sit amet consequat mauris fringilla.</p>
<h2 class="accordionItemHeading">Two</h2>
<p class="textAccordion">Aenean pretium lorem sit amet sapien ornare, sit amet consequat mauris fringilla.</p>
<h2 class="accordionItemHeading">Three</h2>
<p class="textAccordion">Aenean pretium lorem sit amet sapien ornare, sit amet consequat mauris fringilla.</p>
<h2 class="accordionItemHeading">Four</h2>
<p class="textAccordion">Aenean pretium lorem sit amet sapien ornare, sit amet consequat mauris fringilla.</p>
</div>
它不会在页面加载后进入第二个 for 循环,因为第二个 for 循环在事件处理程序中。因此,当您实际单击某些内容时,将调用事件处理程序,.addEventListener("click", () => {})
因此,当您第一次单击它时,它会进入您的事件循环,并使用您的 for 循环执行回调。
首先,您的面板 ""
设置为 display
样式。
唯一的问题是 if
条件因此失败。
如果您在第一个循环开始时设置 display: none
(在事件侦听器之前),行为就是您所期望的。
var acc = document.getElementsByClassName("accordionItemHeading");
var panel = document.getElementsByClassName("textAccordion");
var i;
for (i = 0; i < acc.length; i++) {
panel[i].style.display = "none";
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
for (i = 0; i < acc.length; i++) {
if (acc[i].classList.contains("active") && panel[i].style.display === "none"){
panel[i].style.display = "block";
console.log(i);
}
else {
panel[i].style.display = "none";
}
acc[i].classList.remove("active");
}
});
}
.textAccordion {
display: none;
background-color: blue;
overflow: hidden;
}
<div class="accordion">
<h2 class="accordionItemHeading">One</h2>
<p class="textAccordion">Aenean pretium lorem sit amet sapien ornare, sit amet consequat mauris fringilla.</p>
<h2 class="accordionItemHeading">Two</h2>
<p class="textAccordion">Aenean pretium lorem sit amet sapien ornare, sit amet consequat mauris fringilla.</p>
<h2 class="accordionItemHeading">Three</h2>
<p class="textAccordion">Aenean pretium lorem sit amet sapien ornare, sit amet consequat mauris fringilla.</p>
<h2 class="accordionItemHeading">Four</h2>
<p class="textAccordion">Aenean pretium lorem sit amet sapien ornare, sit amet consequat mauris fringilla.</p>
</div>