相比很多人都遇见过这样的情况: 给一个ul的所有li绑定行为,在点击时获取其index。

假设结构如下:

<body>
<ul>
<li>0</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
</body>

很多人会这么做:

var list= document.querySelectorAll('ul li')
for(var i= 0; i< list.length; i ++){
list[i].addEventListener('click', function(){
console.log(i)
})
}

结果输出的全是5,这便是闭包的最常见的出现情形。

解决方案:

1.利用let块级作用域的特性

var list= document.querySelectorAll('ul li')
for(let i= 0; i< list.length; i ++){
list[i].addEventListener('click', function(){
console.log(i)
})
}

2.利用自执行函数独立作用域,也是红宝书里推荐的写法

var list= document.querySelectorAll('ul li')
for(var i= 0; i< list.length; i ++){
(function(i){
list[i].addEventListener('click', function(){
console.log(i)
})
}(i))
}

3.利用事件委托机制(只适用于li内没有其余元素的情况)

var list= document.querySelector('ul')
list.onclick= function(e){
    var e= window.event||e
    var target= e.target||e.srcElement
    if(target.nodeName.toLowerCase()== 'li'){
        console.log([].indexOf.call(document.querySelectorAll('li'), target))
    }
}

最新文章

  1. EmployeeTest
  2. jq添加数组
  3. [Python]简易terminal歌词滚动播放器
  4. MySql之安装配置
  5. Linux SSH远程文件/目录传输命令scp
  6. 萝卜叶万能助手SEO网络营销简介
  7. RTC系统
  8. 利用Scanner键盘输入
  9. http一问一答
  10. 【端-iOS】给iOS开发入门者编码的一点建议
  11. 原生JS封装时间运动函数
  12. Java的精确整数计算-Bigdecimal学习总结和工具类
  13. LeetCode(36): 有效的数独
  14. [html]Sublime Text添加插件
  15. MiniNet自定义拓扑
  16. Linux中断(interrupt)子系统之一:中断系统基本原理【转】
  17. SUSE Linux – Zypper 命令示例
  18. 从头開始学 RecyclerView(三) 封装简化
  19. linux系统下cpu信息的查看
  20. 《Python》内置方法进阶和常用模块

热门文章

  1. 配置LANMP环境(7)-- 配置nginx反向代理,与配置apache虚拟主机
  2. 关于VIM中展示二进制字符的操作
  3. LeetCode 69 x 的平方根
  4. spark 三种数据集的关系(二)
  5. 下载Americanlife 语音材料
  6. JVM(三),JVM如何加载.class文件
  7. luogu【模板】线性筛素数 (Miller-Rabin素数测试模板)
  8. 如何查询Office版本号
  9. Redis Java连接池调研
  10. fflush函数