问答详情
源自:9-22 编程练习

为什么for循环中直接使用tr[i]不可以,(详情见下面代码)

为什么for循环中直接使用tr[i]不可以

window.onload = function(){
     // 鼠标移动改变背景,可以通过给每行绑定鼠标移上事件和鼠标移除事件来改变所在行背景色。
        var tr = document.getElementsByTagName("tr");
        for(var i = 0; i < tr.length; i++)
        {
           tr[i].onmouseover=function()
            {
                tr[i].style.backgroundColor = "#f2f2f2";
            }
            tr[i].onmouseout=function()
            {
                tr[i].style.backgroundColor = "#fff";
            }      

       }

}

这是别人的代码,但我的问题和他有点不一样,这是别人回答他:

这是由于事件的异步执行造成的。方法一中给每个tr都绑定了onmouseover和onmouseout事件,页面加载完成后,for循环中的i已经变为了tr.length。而事件此时还没有被触发,当用户移动鼠标触发事件时,事件函数中的代码  tr[i].style.backgroundColor = "#f2f2f2";开始执行,而这时i的值已经是tr.length了,tr[i]即tr[tr.length],可tr中最后一个是tr[tr.length-1],而tr[tr.length]这个节点是不存在的。

我的问题是:

就是for循环结束后,每个tr[i]的事件不是已经注册了吗?就是tr[0].style.backgroundColor = "#f2f2f2";这样每个tr[i]事件都注册了,那这时i怎么变不是应该没关系了吗,为什么鼠标移动的时候触发事件的时候还要在执行tr[i].style.backgroundColor = "#f2f2f2";这个啊,不是应该执行如tr[0].style.backgroundColor = "#f2f2f2";这样的,执行的是注册的事件吗?


提问者:慕容7796276 2016-11-10 21:23

个回答

  • 都怪我执念太过
    2016-11-14 19:19:12

    似乎有点明白,似乎不明白。。。我也是那样写的,怎么都行不通。。。把方法单独写到一个方法就OK,这感觉就像是这语言有点ZZ

  • ゞ苏戏 〃
    2016-11-10 22:40:47

    电脑有毒,鉴定完毕


  • stone310
    2016-11-10 22:27:00

    你得理解不对,每个tr[i]事件确实注册了,但是只是注册到 tr[i].onmouseover=function()这一步,具体事件内容还是要等触发的时候再去获取

  • 慕容7796276
    2016-11-10 21:59:57

    怎么没人回答我的,跪求解答