如何使用闭包将事件绑定到循环中的元素数组
How to bind events to an array of elements in a loop using closure?
我相信每个使用javascript的人都会遇到这个问题,但是因为我真的不知道闭包是如何工作的,所以我不能自己解决这个问题。
var hint = ["str", "str", "str", "str", "str"];
var inputIDs = ["ip-name", "ip-pwd", "ip-pwd-cfm", "ip-email", "ip-phone"];
var errorMsg = [];
for (var i = 0; i<hint.length; i++) {
document.getElementById(inputIDs[i]).addEventListener("focus", function (e) {
var tar = e.target.parentElement.getElementsByClassName("alert")[0];
tar.innerHTML = hint[i];
});
}
我想迭代地将焦点事件绑定到每个元素。但是如果我使用上面的代码,每次执行函数时,i
等于5。
我认为我应该在这里使用闭包来获得i
的值,如我想要的。
在循环中创建一个闭包并与i
绑定
var hint = ["str", "str", "str", "str", "str"];
var inputIDs = ["ip-name", "ip-pwd", "ip-pwd-cfm", "ip-email", "ip-phone"];
var errorMsg = [];
for (var i = 0; i < hint.length; i++) {
(function(i) { // creating a closure
document.getElementById(inputIDs[i]).addEventListener("focus", function(e) {
var tar = e.target.parentElement.getElementsByClassName("alert")[0];
tar.innerHTML = hint[i];
});
}(i))
}
在我看来,更简单和更干净的解决方案是使用forEach
,下面是一个工作示例,您可以关注input
标记以查看控制台上的结果。
var hint = ["str", "str", "str", "str", "str"];
var inputIDs = ["ip-name", "ip-pwd", "ip-pwd-cfm", "ip-email", "ip-phone"];
var errorMsg = [];
inputIDs.forEach(function(item, i){
document.getElementById(inputIDs[i]).addEventListener("focus", function(e) {
console.log(i);
// I comment out this code just to keep this example more simple
//var tar = e.target.parentElement.getElementsByClassName("alert")[0];
//tar.innerHTML = hint[i];
});
});
<input id="ip-name" type="text">
<input id="ip-pwd" type="text">
<input id="ip-pwd-cfm" type="text">
<input id="ip-email" type="text">
<input id="ip-phone" type="text">
相关文章:
- PHP:同时循环元素粘在一起
- 按数据属性循环元素并替换值
- Javascript/Jquery 循环元素
- for 循环元素的执行时间比内部 AJAX 调用可以响应的要快
- jQuery:对于循环元素 attr 更改,所有元素都有最后一个元素 attr
- 以延迟的方式循环元素
- 通过使用JQuery加载外部文件来循环元素
- Javascript库中每个循环元素
- 无法访问嵌套的循环元素
- JQuery中的循环元素
- 如何循环元素&数数
- 如何在jQuery事件中引用循环元素
- 循环元素's在DOM中的ID
- 循环元素不起作用
- Javascript循环元素并使用WebdriverIO单击链接
- 循环元素's列表创建一个没有jQuery的转盘
- 调用.onclick函数中方法中选定的循环元素
- 循环元素json数组
- 获取jQuery中每个循环元素的父元素
- 如何在jQuery中循环元素并同时替换