zoukankan      html  css  js  c++  java
  • js 循环生成元素,并为元素添加click事件,结果只执行最后一个点击事件

     

     

    问题描述:有一个参数集合data,for循环为每一个参数生成一个dom元素,并附加onclick事件。生成之后发现点击事件里的参数全是data集合里的最后一个。

    代码如下:

    复制代码
    var dom=$('#div_id');
    for(var i=0;i<data.length;i++)
    {
        var children=document.createElement("div");
        children.onclick=function(){
                  alert(data[i]);
         }
    
         dom.append(children);
    }
    复制代码

    原因:变量i的作用域为for循环内部;对于onclick=function(){}来说,它属于父亲作用域,对于异步监听的onclick函数,声明的时候并未执行函数体(即:未执行alert(data[i]))而是在点击时触发执行函数体,此时父亲作用域的变量i已经变为data的长度,因此对于生成的元素的每个点击事件来讲,i 都是同一个值。

    解决方法:采用JavaScript闭包。(function(){   return function(){ }     })(data[i]);

    复制代码
    var dom=$('#div_id');
    for(var i=0;i<data.length;i++)
    {
        var children=document.createElement("div");
        children.onclick=(function(param){
         var childrenparam=param;
         return function(){
         alert(childrenparam);
        }
       })(data[i]); 
    dom.append(children); }
    复制代码

    有关闭包的知识请看: 阮一峰的网络日志

  • 相关阅读:
    观察者模式(Observer)
    记负均正
    自守数
    等差数列
    字符统计
    Linux 第四次上机收获
    关于java的类加载(血泪史)
    vi常用操作与命令【持续更新中】
    P3-2017级算法第三次上机 B SkyLee逛漫展
    P3-2017级算法第三次上机 A 水水的二分查找
  • 原文地址:https://www.cnblogs.com/onesea/p/13213246.html
Copyright © 2011-2022 走看看