javascript - js 循环监听
伊谢尔伦
伊谢尔伦 2017-04-11 09:21:13
[JavaScript讨论组]

为什么取不到id


    
  • 1
  • 2
  • 3
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(9)
巴扎黑

别用for 用foreach

[].forEach.call(document.querySelectorAll("li"),function(elem,i){
    elem.addEventListener('click',function(){
        console.log(this.getAttribute('id'));
    });
});
大家讲道理

楼主可以试下打印出i哈哈!

同楼上,建议foeach

var lis = document.querySelectorAll("li");
lis.forEach(function(item,index) {
    item.onclick = function() {
        alert(index);    
    }
})    
高洛峰

经典的闭包问题

var li = document.querySelectorAll("li");
for(var i = 0; i < li.length; i++){
    li[i].addEventListener('click', (function(){
        return function(){alert(li[i].getAttribute('id'));}
    })());
}

var li = document.querySelectorAll("li");
for(var i = 0; i < li.length; i++){
    li[i].addEventListener('click',function(){
        alert(this.getAttribute('id'));
    });
}
PHP中文网

你给每个li添加了一个事件监听并委托了一个处理函数,问题就出在这个处理函数上。

这个函数体内使用了外面定义的变量i,i是很尴尬的,它被这个函数需要,所以不能销毁,所以它就一直在原地等待那个需要它的函数来调用它,但是等这些函数需要它的时候,它已经不是那时的它了。因为它是会变的!

迷茫

简单来说,这里的事件处理程序直到点击事件的发生才会执行。需要闭包。
建议看一编《javascript高级程序设计》

迷茫

这是一个典型的变量提升问题,通过闭包解决,楼上提到的forEachAPI实际上就创造了一个闭包

巴扎黑

哎,请用事件委托好嘛,这就是典型的不该用闭包非要用闭包的例子。

PHP中文网

最后的i等于li的长度,但是li数组里面没有下标为它的长度的元素,因此获取不到.

PHPz

使用闭包解决

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号