【发布时间】:2018-09-26 12:41:22
【问题描述】:
我编写了一个代码来为 div 容器创建模态窗口。单击按钮后,我会获取按钮的编号并显示相关的模式窗口。经过测试,适用于所有浏览器。
myModalContent = new tingle.modal();
var myBtn = document.querySelectorAll("button.project__btn");
for (var i = 0; i < myBtn.length; i++) {
myBtn[i].addEventListener("click", function () {
myModalContent.open();
if (this.hasAttribute("data-btn")) {
myModalContent.setContent(document.querySelector(".project" + this.getAttribute("data-btn") + "-modal").innerHTML);
} else {
myModalContent.setContent(document.querySelector(".project1-modal").innerHTML);
}
});
} 一个 js 验证器会给出一个警告“不要在循环中创建函数”。 看了一些与这个主题相关的帖子,特别是函数必须在循环之外创建,我创建了一个函数:
function handler(modalDiv, trigBtn, index){
modalDiv.open();
if (trigBtn[index].hasAttribute("data-btn")) {
modalDiv.setContent(document.querySelector(".project" + trigBtn[index].getAttribute("data-btn") + "-modal").innerHTML);
} else {
modalDiv.setContent(document.querySelector(".project1-modal").innerHTML);
}
}
然后在循环中调用它:
for (var i = 0; i < myBtn.length; i++) {
myBtn[i].onclick = handler(myModalContent, myBtn, i);
}
它似乎无法正常工作,它会在网页加载后立即显示最后一个模式窗口。我的理解是该函数必须与单击事件监听器连接,即单击按钮时,应弹出模态窗口。现在,模式窗口弹出,没有任何点击事件。你能给我一个如何正确编写函数的想法吗?或者我是否应该简单地忽略这个 js 验证警告。
【问题讨论】:
-
为什么要更改函数的内容,为什么现在尝试调用它而不是像以前那样将其安装为处理程序?
标签: javascript function for-loop jslint jshint