javascript - 添加事件上的一个小问题。
PHP中文网
PHP中文网 2017-04-10 17:11:09
[JavaScript讨论组]

麻烦更新内容,保留原来的东西。你让原来的答题者,情何以堪




 
 Document
 


 
 
 
 


更新之后代码




    
    Document
    
    


    

111

222

333

444

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(4)
高洛峰

这是一个新手经常会遇到的问题。为什么会这样呢?一步一步来。先看下面的代码

for(var i=0; i<oBtn.length;i++){
    oBtn[i].onclick=function(){
        console.log(i);
    }
}

你会发现所有的输出都是2,也就是oBtn.length

click事件发生的时候,会执行代码console.log(i)

控制台会打印i
控制台会打印i
控制台会打印i

那么i又是什么?不是你想象的数字。这里i是一个变量,它最终打印出是这个变量的值。
这个值是oBtn.length,因为循环语句

for(var i=0; i<oBtn.length;i++){

}

执行完毕后,i已经变成了oBtn.length。因此,在内部使用oBtn[i]是不行的。


以下内容,初学者要耐心

如果,非要使用oBtn[i],那么就必须在oBtn[i].onclick赋值的时候,用变量把i的每次值保存起来。

for(var i=0; i<oBtn.length;i++){
    oBtn[i].onclick=(function(j){
        return function(){
            oBtn[j].className='active'
        }
    })(i)
}

这里,我们执行了一个匿名函数,并且把i,传给了这个函数。然后,这个匿名函数返回一个函数,作为click属性的值。当点击事件发生的时候,就会触发这个函数。

当匿名函数返回一个函数的时候,会形成一个闭包被返回的函数(内部函数)可以访问匿名函数(外部函数)的参数,以及两个函数中间的变量。

// 这是把i作为参数传给匿名函数,并执行函数。
(匿名函数)(i)

匿名函数 = function(j){
    return function(){
        oBtn[j].className='active'
    }
}

当i传过来的时候,j = i;当i的值发生变化的时候,j的值是不会跟着变的。这与下面代码是一个意思

var a, b = 5;

a = b;
b = 6;

a, b // 5, 6; a不会跟着变了

这样每一个不同的i的值就被保存下来了。也许你会有疑问,每一次都执行了j = i,为什么j的值没有变化呢?因为每次循环的时候,匿名函数都是新的,包括参数变量等。

显然,上一个j与下一个j已经不是同一个了。

ringa_lee

你的这段代码仅在页面加载时执行了一次,而事件绑定的监听函数都是后触发的

换句话说,如果是

oBtn[i].className = 'active';

其实等价于

oBtn[3].className = 'active';

你这里oBtn的下标总共也就0, 1, 2,所以当然会出错

ringa_lee

闭包的问题,循环给每个元素绑定了点击事件,但外部变量i在循环结束已经是3。匿名函数里的oBtn[i] = oBtn[3],已经超出元素。所以你每次都要保存变量的值。

for(var i=0; i<oBtn.length;i++){
    oBtn[i].index = i;
    oBtn[i].onclick=function(){
        oBtn[this.index].className='active';
    }
}

哦,你现在又变成4个了。第二个循环没报错是因为你又把i从零赋值开始了,出了循环i的值是4了,你再用oBtn[i].className = 'active';已经越界,获取的元素是NULL,肯定报错了啊。

迷茫

典型的闭包问题。当click发生时i已经变成了3,数组下标越界。
1,使用闭包把i保存在闭包的作用域下
2,使用this
3, 使用event.target

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

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