javascript遍历对象添加事件

2025-11-05 05:50:38

1、 现在有一下一个列表,我想给每个<a>标签添加一个onclick事件。

<ul id="menu">

    <li><a href="javascript:void(0);">个人信息</a></li>

    <li><a href="javascript:void(0);">成绩查询</a></li>

    <li><a href="javascript:void(0);">课表查询</a></li>

    <li><a href="javascript:void(0);">选课</a></li>

    <li><a href="javascript:void(0);">评价课程</a></li>

    </ul>

javascript遍历对象添加事件

2、以下是js代码

 window.onload = function(){

    var omenu = document.getElementById('menu');

    for (var i = 1 ; i<10; i+=2) {

        (function(i){omenu.childNodes[i].childNodes[0].onclick = function() {

            alert(i);

        }})(i);

    }

}   

点击后会弹出相应的i值

例如点击第二个<a>的文字会弹出3来

javascript遍历对象添加事件

3、上面的代码我们来分析一下,

window.onload = function(){

    var omenu = document.getElementById('menu');

    //先是获取了<ul id="menu">这个元素

    for (var i = 1 ; i<10; i+=2) {

//为什么i是从1开始而不是从0开始呢,因为文本也算是一个节点,

//从html的代码我们可以看到<ul>与<li>之间是有几个空格的,

//这些空格被算做文本元素,omenu.childNodes[0]是获取的不是<li>而是文本

//同理,<li>与<li>之间也是有几个空格的,所以用i+=2,递增2而不是递增1

//但是<li>与<a>之间没有空格隔开,所以用childNodes[0]就可以

        (function(i){omenu.childNodes[i].childNodes[0].onclick = function() {

  //childNodes[i]是omenu的某个子元素节点,<li>是omenu的子元素,

//<a>是<li>的子元素,所以用omenu.childNodes[i].childNodes[0]就

//可以获取到<a>

  // (function(i){})(i);是一个函数立即执行的结构

            alert(i);

        }})(i);

    }

}   

4、为什么要用一个函数立即执行的结构呢?不用行不行?

不行。

如果我们把代码改为下面这样,

    window.onload = function(){

    var omenu = document.getElementById('menu');

    for (var i = 1 ; i<10; i+=2) {

        omenu.childNodes[i].childNodes[0].onclick = function() {

            alert(i);

        }

    }

}  

你会发现无论点击哪个都只会弹出11,因为alert(i);这里面的i是全局变量,

所有你定义的onclick事件中,调用的是同一个i,既然是同一个i,那当然弹出的值当然是相同的。

你可能会疑惑childNodes[i]中的i,也是同一个i,为什么它就能找到每个元素呢。

因为onclick事件是发生在页面加载后,由人来触发的,即所有事件绑定完成之后发生的。遍历过程中,i的值是变化的,所以能找到所有需要元素。遍历结束后,i的值就定格在11。这个时候再弹出i的值,就都是11了。

问题就是这不是我们需要的效果,我们需要每个元素弹出相应的不同的值

所以我们要弹出的i应该是局部变量,而不是全局变量, (function(i){})(i)的作用就在于此,这个结构事实上是把全局变量i作为实参传进,这时 alert(i);这里i,其实不是全局变量的i了,而是作为function(i)这个匿名函数的局部变量,

既然是局部变量,那各个onclick事件的i都是不相关,这样值当然不一样了,而且保留传进来时的值。

javascript遍历对象添加事件

5、最后放上完整的代码

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<script type="text/javascript">

     window.onload = function(){

    var omenu = document.getElementById('menu');

    for (var i = 1 ; i<10; i+=2) {

        (function(i){omenu.childNodes[i].childNodes[0].onclick = function() {

            alert(i);

        }})(i);

    }

}   

    </script>

</head>

<body>

    <ul id="menu">

     <li><a href="javascript:void(0);">个人信息</a></li>

     <li><a href="javascript:void(0);">成绩查询</a></li>

     <li><a href="javascript:void(0);">课表查询</a></li>

     <li><a href="javascript:void(0);">选课</a></li>

     <li><a href="javascript:void(0);">评价课程</a></li>

    </ul>

</body>

</html>

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢