javascript - 为什么在 DOM querySelector for 循环中通过 [i] 进行迭代允许我以任何顺序使用事件侦听器?
问题描述
在下面的代码中,我创建了一个 for 循环,它允许我在简单网页上的 5 个按钮中的任何一个上生成警报。我的问题是,如果我的查询选择器中的 [i] 迭代 1,为什么这种格式允许我单击任何按钮来触发警报?不应该只允许我按索引从 0 到 5 的顺序单击按钮吗?即使我在技术上单击元素 [5],无论顺序如何,在 for 循环中的 [0] 都可以为任何按钮工作,到底发生了什么?
for (var i = 0;
i<document.querySelectorAll(".drum").length; i++){
document.querySelectorAll(".drum")
[i].addEventListener("click", function () {
alert("I got clicked!");
});
}
解决方案
您的 for 循环相当于:
// Define an action to do when user clicks, but pass to the next line without waiting that the click event to occur
document.querySelectorAll(".drum")[0].addEventListener(...);
document.querySelectorAll(".drum")[1].addEventListener(...);
document.querySelectorAll(".drum")[2].addEventListener(...);
...
在每次迭代中,我们只需定义一个在检测到点击时执行的函数。但是,这并不意味着我们正在等待用户真正点击以传递到下一次迭代。
推荐阅读
- model-view-controller - 为什么模型在MVC模式中直接更新视图?
- c - 为什么这会在终止时给出(非零)错误代码?
- mysql - 使用户处于 1 对 n 关系中,条件在 n 表上
- botframework - 来自 Azure 机器人服务的 OAuth 刷新令牌
- docker - 无法将文件移动到docker centos中的目录
- php - 您如何设置一个数组来保存空位置的“0”,以便图形(Highcharts)可以正确格式化它们?
- sql - 替换包含 html 数据的 SQL Server 表列中的所有 URL
- mysql - MySQL 每 30 分钟冻结 40 秒
- python - PyInstaller 错误:“PyiModuleGraph”对象没有属性“edgeData”
- amazon-web-services - 我可以将另一个文件中的文本插入到我的 cloudformation 模板中吗?