js中用for循环事件绑定的小问题

在js中,如果用for循环进行事件绑定,可能会遇到一点小问题,看下面第一个示例,无论点击哪个div,都会弹出3,即length。

因为这相当于事件绑定的同时,并没有把所对应的i进行一起绑定,i的值是最后一个值,即3。

示例1

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            background: red;
            margin-bottom: 3px;
        }
    </style>
    <script>
        window.onload = function () {
            var add_the_handlers = function (nodes) {
                var i;
                for (i = 0; i < nodes.length; i++) {
                    nodes[i].onclick = function (e) {
                        alert(i);
                    };
                }
            };
            var divs = document.getElementsByTagName(‘div‘);
            add_the_handlers(divs);
        }
    </script>

    <body>
        <div></div>
        <div></div>
        <div></div>
    </body>

</html>

再看下面两个例子,通过事件绑定的同时,通过函数调用而不是函数定义进行i与事件的绑定。

示例2

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<style>
    div {
        width: 100px;
        height: 100px;
        background: red;
        margin-bottom: 3px;
    }
</style>
<script>
    window.onload = function () {
        var add_the_handlers = function (nodes) {

            var helper = function (index) {
                return function (e) {
                    alert(index);
                };
            };

            var i;
            for (i = 0; i < nodes.length; i++) {
                nodes[i].onclick = helper(i);
            }
        };
        var divs = document.getElementsByTagName(‘div‘);
        add_the_handlers(divs);
    }
</script>

<body>
    <div></div>
    <div></div>
    <div></div>
</body>

</html>

示例3

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            background: red;
            margin-bottom: 3px;
        }
    </style>
    <script>
        window.onload = function () {
            var add_the_handlers = function (nodes) {
                var i;
                for (i = 0; i < nodes.length; i++) {
                    (function (i) {
                        nodes[i].onclick = function () {
                            alert(i);
                        };
                    })(i);
                }
            };
            var divs = document.getElementsByTagName(‘div‘);
            add_the_handlers(divs);
        }
    </script>

    <body>
        <div></div>
        <div></div>
        <div></div>
    </body>

</html>

原文地址:https://www.cnblogs.com/greatfish/p/7757656.html

时间: 2024-08-01 17:14:03

js中用for循环事件绑定的小问题的相关文章

循环事件绑定和原型的应用

一.循环事件绑定: <ul> <li>0</li> <li>1</li> <li>2</li> <li>3</li> <li>4</li> </ul> <script> var node = document.querySelectorAll('ul li'); for(var i = 0, len = node.length; i < len;

JS基础——事件绑定

上一篇博客JS事件对象中,老师问JS事件处理和VB中的事件处理有什么联系?先来解决一下这个问题.举个VB.net中事件处理的例子(JS敲久了,VB习惯的都不熟悉了,看来得经常回顾了): 1.事件处理VB VS JS Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click MsgBox("helo!") MsgBox(sender.width) '弹出触发这个事件对象的宽度 Msg

微信小程序学习总结(2)------- 之for循环,绑定点击事件

最近公司有小程序的项目,本人有幸参与其中,一个项目做下来感觉受益匪浅,与大家做下分享,欢迎沟通交流互相学习. 先说一下此次项目本人体会较深的几个关键点:微信地图.用户静默授权.用户弹窗授权.微信充值等等. 言归正传,今天分享我遇到的关于wx:for循环绑定数据的一个tips:  1. 想必大家的都知道wx:for,如下就不用我啰嗦了: <view class="myNew" wx:for="{{list}}">{{item.title}}<view

node.js 回调函数、事件循环、EventEmitter ar

异步编程  node.js 编程的直接体现就是回调,异步编程依托于回调来实现: node使用了大量的回调函数,所有API都支持回调函数 .如读取文件等. 这里对不懂线程和异步和同步的稍微解释下这三个名词 . 线程 : 简单的说就是做一件事 . 即执行一段程序代码 .js引擎就是一个单线程 的 处理 方式 .单线程是说 同一时间只能做一件事 . 同步 :就是这件事必须要先做完前面的才能做后面的,否则后面的无法完成. 这就像我们的js代码会从上往下 运行 . 异步 :简单的说就是两个线程,你做你的,

js立即执行函数应用--事件绑定

js中立即执行函数的应用:应用到事件绑定上. 少说多做,直接运行代码(代码中有注释): 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta charset="UTF-8" /> 5 <meta http-equiv="X-UA-Compatible" content="ie=edge" /> 6 <titl

js事件绑定函数

js中事件绑定方法大致有三种: 1.在DOM元素中绑定 <input onclick="alert('在DOM中绑定')" type="button" value="点击我" /> 也可以在onclick中填写函数,与addeventlistener不同的是,在onclick中的函数允许小括号,而后者不允许. 2.在JavaScript代码中绑定 <input id="demo" type="but

JS的事件绑定、事件流模型

.t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.JS事件 (一)JS事件分类 1.鼠标事件:click/dbclick/mouseover/mouseout2.HTML事件: onload/onunload/onsubmit/onresize/onchange/onfoucs/onscroll3.键盘事件: keydown:键盘按下时触发 keypress:键盘按下并抬起的瞬间触发. keyup:键盘抬起触发[注意

微信小程序 - 事件绑定bind和catch 区别

本文以冒泡事件tap(手指触摸后马上离开,也就是点击事件)为例子来区别bind和catch事件.在小程序中事件分为冒泡事件和非冒泡事件: bindtap  事件绑定不会阻止冒泡事件向上冒泡 catchtap  事件绑定可以阻止冒泡事件向上冒泡 假如有三个view点击事件都是用的bindtap,三个view是层级包含关系 <view id="outer" bindtap="out"> outer view <view id="middle&

原生js事件绑定

一.JS事件 (一)JS事件分类 1.鼠标事件: click/dbclick/mouseover/mouseout 2.HTML事件: onload/onunload/onsubmit/onresize/onchange/onfoucs/onscroll 3.键盘事件: keydown:键盘按下时触发 keypress:键盘按下并抬起的瞬间触发. keyup:键盘抬起触发 [注意事项] ①执行顺序:keydown keypress keyup②keypress只能捕获数字,字母,符号键,而不能捕