为了账号安全,请及时绑定邮箱和手机立即绑定

为什么一定要用titles[i].id = i;然后用divs[this.id]去取到元素而不用divs[i]?

练习题中实测,用divs[i]不行,而divs[this.id]就可以,不知道为啥

for(var i=0;i<titles.length;i++){
         titles[i].id = i;
         titles[i].onclick = function(){
            //  alert(conts[this.id].style.display);
             if(divs[this.id].style.display == "none"){
                 divs[this.id].style.display = "block";
             }else{
                 divs[this.id].style.display = "none";
             }
         }
     }

正在回答

3 回答

因为onclick是事件绑定函数,也就是说你的click事件发生的时候,局部变量i早就不存在了(undefined)。所以需要把i存入到titles的每个对象中,这样当你很久之后发生click事件时,还是能读取到正确的i的值。

3 回复 有任何疑惑可以回复我~
#1

CoolIsLife 提问者

非常感谢!
2015-04-02 回复 有任何疑惑可以回复我~
#2

CoolIsLife 提问者

是不是可以这样理解,window.onload = function(){...}中,function里面的内容在界面加载时就大部分已经实例化了,即就加载这一次,而里面 *.onclick = function(){...}事件绑定函数只有在触发事件的时候才去实例化,即以后只是会多次加载事件绑定函数,而window.onload = function(){...}中的function不再加载,故i不存在,也就没有意义了?
2015-04-02 回复 有任何疑惑可以回复我~
#3

用户已禁用 回复 CoolIsLife 提问者

大概就是这样
2015-04-02 回复 有任何疑惑可以回复我~
#4

Sappho

你这样说是不对的,不信alert(i)试试
2016-03-08 回复 有任何疑惑可以回复我~
#5

STRONG很壮不怕撞

非常感谢,同样解决了我的困惑,看来对一些基本的概念理解的还不够。
2016-04-19 回复 有任何疑惑可以回复我~
#6

STRONG很壮不怕撞 回复 Sappho

我试过alert(i); 结果就是触发每一个都弹出“3”,即循环执行后的i 值,取值的时候是在事件触发的时候,不是在绑定的时候,如果绑定后还有其他的操作改变了i 的值,那触发的时候弹出的就是i 当时的值。我觉得是这样的……
2016-04-19 回复 有任何疑惑可以回复我~
#7

Jeoop

那请问有什么办法可以解决这个问题呢?如果给元素添加id的话不会产生污染嘛?
2017-09-24 回复 有任何疑惑可以回复我~
查看4条回复

因为onClick不是立即执行的,实际上当事件处理函数执行时,这里如果使用i的话会引用同一个i,而且这个i值等于for循环结束时i的值。

实际上这里起的效果跟闭包是一样的,具体效果是让每一个事件处理函数都有属于它自身的i值,而不是引用同一个i。

1 回复 有任何疑惑可以回复我~

在Javascript的事件函数的this指针是指向调用它的元素。比如:

<div id="test"></div>

div1.onclick = function( ) {

    alert(this.id);   //输出test

};

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

为什么一定要用titles[i].id = i;然后用divs[this.id]去取到元素而不用divs[i]?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信