JS17-循环遍历添加事件

一.事件1
<body>
<ul>
    <li>我是第一个li</li>
    <li>我是第二个li</li>
    <li>我是第三个li</li>
    <li>我是第四个li</li>
    <li>我是第五个li</li>
</ul>

<script>
    // 通过循环遍历,给标签添加事件/操作

    // 1,获取标签对象的集合,也就是数组形式的
    var oLis = document.querySelectorAll('li');
    console.log(oLis);

    // 2,通过 forEach() 等 方式,循环遍历数组中的对象,给这些标签,添加设定/绑定事件
    // 定义的第一个形参,存储的是数组的数据对象,也就是li标签
    oLis.forEach(function( itme ){
        itme.onclick = function(){
            // 输出的是相同的内容
            console.log(123);
        }
    })

    // 通过循环,每次对一个标签进行操作
    // 循环结束,对数组中存储的所有标签,都进行操作
    // 给数组中的所有标签都绑定 click 事件


</script>


二.事件2
<ul>
    <li>我是第一个标签</li>
    <li>我是第二个标签</li>
    <li>我是第三个标签</li>
    <li>我是第四个标签</li>
    <li>我是第五个标签</li>
</ul>
<script>
    // 点击第一个li标签标签,输出 1
    // 点击第二个li标签标签,输出 2
    // 点击第三个li标签标签,输出 3
    // 点击第四个li标签标签,输出 4
    // 点击第五个li标签标签,输出 5

    var oLis = document.querySelectorAll('li');

    
    oLis.forEach(function(item , key){
        item.onclick = function(){
            // 输出的是标签的索引+1
            console.log(key+1);
        }
    })


    for(var i = 0 ; i <= oLis.length-1 ; i++){

        // 在绑定事件之前
        // 先给所有的标签,定义属性 index 属性值是 循环变量
        // 这里定义的属性的属性值,是不会随着程序的执行而改变的

        // oLis 是一个伪数组,存储所有li标签
        // i是模拟生成的索引下标  
        // oLis[i]是通过索引下标,获取数组的数据内容,也就是li标签
        oLis[i].setAttribute('index' , i);

        oLis[i].onclick = function(){
            // 在点击事件中,此处所有的循环变量 i ,数值都是5


            // 此时输出的内容,不是i,是定义在标签上的index属性的属性值
            // 获取index属性的属性值,作为输出的内容

            // this,是指向指代的作用,起到替换指定目标,或者指定对象的作用
            // 赋值式函数,声明式函数,this指向的是window
            // 对象当中的函数,this指向的是这个对象
            // 绑定事件时,事件处理函数,this,指向的是绑定这个事件的标签对象
            // 此处使用this,来替换 oLis[i] , 因为最终i的值是5
            // 必须使用this来指定绑定事件的标签对象 oLis[i] 在点击事件中,无法调用正确的标签对象
            // 也就是对应的li标签

            // 获取的属性值,是字符串类型,要执行迅运算,需要转化为数值类型
            // 方法 parseInt()  -0   *1   /1   前面写+
            var ind = this.getAttribute('index')-0;

            // 输出的是获取到的属性值
            // 数值已经转化为数值类型,再来执行 加法操作
            console.log(ind+1);
        }
    }


    // for循环和forEach()的区别

    // for循环
    // 第一次循环建立一个循环变量 i 
    // 之后每次循环,都是操作的这个循环变量
    // 是对一个循环变量,重复赋值
    // 不管循环多少次,都只是建立一个变量 i 对这个变量 重复赋值,进行操作
    // 操作到最后 只有一个 i 存储最终的数值

    // 绑定事件,并且执行
    // 执行事件时,for循环已经执行完毕,i的数值是5
    // 执行程序,虽然点击的标签不同,但是 i 都是一个变量 最终数值都是5
    // 点击标签不同,i 都是相同的5,i + 1都是6
    // 点击任意标签,触发的都是 i+1为6 的效果

    // 如果要是使用for循环完成效果
    // 就要给标签,添加属性,在属性中,存储当前的索引值
    // 执行时,再调用这个索引值


    // forEach()   
    // forEach() 定义变量的方式和 for循环不同
    // 虽然 变量名称没有改变,但是 每次循环都会创建一个独立不同的变量
    // 存储的数值,也是独立的不同的数值,而且相互之间不会影响
    // 此时当forEach() 循环结束时,循环几次,就有几个独立的变量,存储每次循环对应的数据内容
    // 此时触发事件 每个事件中 变量存储的都是独立的不同的相互不影响的数据数值

发布了103 篇原创文章 · 获赞 4 · 访问量 2010

猜你喜欢

转载自blog.csdn.net/DcTbnk/article/details/105268553