javascript - Javascript循环只执行一次
问题描述
当我在外面单击时,我希望所有div
带有my-select-dropdown
和block
class
es 的 s 立即变得不可见。下面的代码不会给我错误,但div
每次点击都会让 s 一个一个消失。但我想立刻全部消失。
我的代码:
window.addEventListener("click", function (e) {
var dropdowns = document.getElementsByClassName("my-select-dropdown block");
console.log(dropdowns.length)
for (var i = 0; i < dropdowns.length; i++) {
console.log(dropdowns[i])
if (e.target.closest('.my-select > button')){
// pass
}
else if (e.target !== dropdowns[i] && !e.target.closest(dropdowns[i].classList)){
dropdowns[i].classList.replace("block", "hidden");
}
}
});
Console log
返回 2,只有一个HTML element
,这意味着只有第一个loop
正在执行。
解决方案
所以,这是一个棘手的问题。事实证明,如果你反转你的循环,它就会起作用。无论出于何种原因,dropdowns
当您更改 时,数组会被重新评估DOM
,因此您的数组越来越短,而您实际上只做了一半的div
s。你没有看到这个,因为你显然只有 2 个。当我输入 4 时,它更清晰了,因为它显示了我Test1
,而我Test3
将id
s 更改为显示,而不是完整的div
.
我为这些类编了一些东西,因为你没有包含它,但它似乎可以div
用你的代码隐藏 s 。
下面的链接说更改DOM
将导致数组重新评估,所以这是意料之中的,只是不是我或你显然。:-)
https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName
window.addEventListener("click", function (e) {
var dropdowns = document.getElementsByClassName("my-select-dropdown block");
console.log(dropdowns.length)
for (var i = dropdowns.length-1; i >= 0 ; i--) {
console.log(dropdowns[i].id)
if (e.target.closest('.my-select > button')){
// pass
}
else if (e.target !== dropdowns[i] && !e.target.closest(dropdowns[i].classList)){
dropdowns[i].classList.replace("block", "hidden");
}
}
});
.my-select-dropdown
{
font-family: "Ariel";
}
.block
{
display: block;
}
.hidden
{
display: none;
}
<div id='test1' class="my-select-dropdown block" type="button">Test 1</div>
<div id='test2' class="my-select-dropdown block" type="button">Test 2</div>
<div id='test3' class="my-select-dropdown block" type="button">Test 3</div>
<div id='test4' class="my-select-dropdown block" type="button">Test 4</div>
推荐阅读
- python - 组织多个数据框的最佳方法
- javascript - 如何使用循环请求 URL、抓取数据、从该页面获取新 URL 并移动到下一页 X 次
- python - 什么时候应该从ABC继承?
- html - 无法用崇高的文字或漂亮的汤美化 html 代码
- wordpress - Gravity Forms 的验证脚本,可以检测电话号码的第一个位置是否存在数字 1 或 +1
- angularjs - Angular.forEach 转换值以在排序表中使用
- android - 我如何从橙色 pi 4g iot 的引脚读取数据以及如何在“/system/bin/sh”中写入数据。如何修复“无法创建引脚:只读文件系统”
- python - 正则表达式反向引用乘法
- next.js - 在没有选择器的情况下编写 styled-jsx
- git - 如何在 Windows 上删除旧的本地 Git 分支?