简体   繁体   English

JavaScript 手风琴 - for 循环内部 for 循环的问题

[英]JavaScript accordion - problem with for loop inside for loop

I wrote javascript code for a simple accordion.我为一个简单的手风琴编写了 javascript 代码。 The program works, but I have a problem that every time I load the page I have to double-click on heading (h2 tag), after that it works well and responds to one click.该程序有效,但我有一个问题,每次加载页面时,我都必须双击标题(h2 标签),然后它运行良好并响应单击。 I don't know why it doesn't go into the second for loop immediately after the page loads?我不知道为什么在页面加载后 go 没有立即进入第二个 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>

At first, your panels have "" set as their display style.首先,您的面板将""设置为它们的display样式。

The only issue was that the if condition failed because of this.唯一的问题是if条件因此而失败。

If you set display: none at the start of the first loop (before the event listener), the behavior is the one you're expecting.如果您在第一个循环开始时(在事件侦听器之前)设置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>

It doesn't go to the second for loop after the page loads is because second for loop is inside event handler.页面加载后的第二个 for 循环不会 go 是因为第二个 for 循环在事件处理程序内。 So event handler will be called when you actually click something, .addEventListener("click", () => {}) so when you first click it then it goes to your event loop, and executes the callback with your for loop.因此,当您实际单击某些内容时,将调用事件处理程序.addEventListener("click", () => {})因此,当您第一次单击它时,它会进入您的事件循环,并使用您的 for 循环执行回调。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM