我想给数组中的指定元素添加click事件,并且内层循环与外层循环索引值相同时对元素进行改变,错误代码如下
var yunsuan = document.querySelectorAll(".count span")
var number = document.querySelectorAll(".count input")
var k = 0
for(var i = 0;i<yunsuan.length;i=i+3){
yunsuan[i].addEventListener("click",function(){
for(var j = 0;j<number.length;j++){
if (j===k) {
number[j].value--
console.log(number[j].value);
}
}
})
k++
}
因为代码中的外层循环会先执行完毕再进行事件的绑定,所以k的值直接变成了最大值,然后事件中的循环就无法对k进行判断了,请问各位这种问题怎么解决
你这个是类似需要在事件内使用事件外的循环变量的问题。
当事件触发时,那个循环早就结束了,那时的i的值已经是循环最大值加1了。
所以需要用一些方式保存住当前循环的i的值。
for (var i = 0; i < arr.length; i++) {
(function(i){
arr[i].onclick = function () {
alert(i);
}
})(i);
}
for (var i = 0; i < arr.length; i++) {
let k = i;
arr[i].onclick = function () {
alert(k);
}
}
ps:IE11中在for语的()内声明的let是整个循环体中共用的,只有在{}内声明的let才是每次循环都独立的。
非ie的浏览器中可以在中在for语的()内声明let
for (let i = 0; i < arr.length; i++)
for (var i = 0; i < arr.length; i++) {
arr[i].index = i;
arr[i].onclick = function () {
alert(this.index);
}
}
能把html贴出来吗