解决javascript中循环给组件添加事件,只有一个最后一个组件添加成功。或者?全部添加失败。

问题产生的原因

页面加载---->for循环执行(结束条件:i<6为例),执行完之后,i最后的值是6---->这时候事件要触发了,事件触发调用的这个function,它拿到的值是i=6–>导致最后一个事件都没有成功被触发。

问题解决方法

第一种:常用的方法是:使用闭包把i值封存

for(var i =0 ; i < 6 ; i++){
(function(i){添加事件的代码}(i);
}

上面用到的解决方法是使用闭包把i值封存了。

第二种:IE11以前不支持的方法是:用let块作用域变量,原理也是闭包

for(var i =0 ; i < 6 ; i++){
let j = i;
添加事件的代码(里面用j就OK了);
}

这是我在做东西时候的部分代码,就是这段代码让我在坑了栽了。ahh

<script>
        var name;
        var gender;
        var age;
        var nativeplace;
        var qq;
        var email;
        var email_old;

        for (var i = 0; i < 6; i++) {

            var update = document.getElementById("update" + i);
            (function(i){
            update.onclick = function () {
    
                name = document.getElementById("name" + i).innerText;
                gender = document.getElementById("gender" + i).innerText;
                age = document.getElementById("age" + i).innerText;
                nativeplace = document.getElementById("nativeplace" + i).innerText;
                qq = document.getElementById("qq" + i).innerText;
                email = document.getElementById(i + "").innerText;

                email_old = email;

                var update = document.getElementById("update" + i);

                update.innerText = "提交";
                update.setAttribute("class", "btn btn-success");

                var name_ele = document.getElementById("name" + i);
                var gender_ele = document.getElementById("gender" + i);
                var age_ele = document.getElementById("age" + i);
                var nativeplace_ele = document.getElementById("nativeplace" + i);
                var qq_ele = document.getElementById("qq" + i);
                var email_ele = document.getElementById("" + i);

                var name_input = document.createElement("input");
                var gender_input = document.createElement("input");
                var age_input = document.createElement("input");
                var nativeplace_input = document.createElement("input");
                var qq_input = document.createElement("input");
                var email_input = document.createElement("input");

                name_input.value = name;
                gender_input.value = gender;
                age_input.value = age;
                nativeplace_input.value = nativeplace;
                qq_input.value = qq;
                email_input.value = email;

                name_ele.innerText = "";
                gender_ele.innerText = "";
                age_ele.innerText = "";
                nativeplace_ele.innerText = "";
                qq_ele.innerText = "";
                email_ele.innerText = "";

                name_ele.appendChild(name_input);
                gender_ele.appendChild(gender_input);
                age_ele.appendChild(age_input);
                nativeplace_ele.appendChild(nativeplace_input);
                qq_ele.appendChild(qq_input);
                email_ele.appendChild(email_input);

                update.onclick = function () {
                    name = name_input.value;
                    gender = gender_input.value;
                    age = age_input.value;
                    nativeplace = nativeplace_input.value;
                    qq = qq_input.value;
                    email = email_input.value;

                    update.href = "UpdateTableServlet?email_old="
                        + email_old + "&name="
                        + name + "&gender="
                        + gender + "&age="
                        + age + "&nativeplace="
                        + nativeplace + "&qq="
                        + qq + "&email="
                        + email;
                }
            }
        })(i);
        }
    </script>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值