JS循环添加事件

通常我们会这样给元素添加事件:

var ul=document.getElementsByTagName("ul")[0];
var list=document.getElementsByTagName("li");
 for(var i=0;i<li.length;i++){
   list[i].onclick=function(){
   alert("我的index是"+i);
 } }

但结果往往不是我们想象的那样,它们全部弹出是“我的index是2”,原因是JavaScript是单线程执行任务的,添加事件会被罗列到任务单中,所以i的值全是2;

解决方法:

方式1. 使用闭包。
var ul = document.getElementsByTagName("ul")[0];
var list = ul.getElementsByTagName("li");  
function foo(){
    for(var i = 0, len = list.length; i < len; i++){
        var that = list[i];
        list[i].onclick = (function(k){  return function(){
                alert("我的index是"+k);              };
        })(i);
    }
}
foo(); 
方式2.事件代理
var ul = document.querySelector(‘ul‘);
var list = document.querySelectorAll(‘ul li‘);  

ul.addEventListener(‘click‘, function(){
    var e = arguments[0] || window.event;
    var target = e.target || e.srcElement;  

    for(var i = 0, len = list.length; i < len; i++){
        if(list[i] == target){
            alert("我的index是"+i);           }
    }
});
方式3. 引入jQuery,使用其中的on或delegate进行事件绑定(它们都有事件代理的特性)
// delegate方法
$("ul").delegate("li", "click", function(){
    var index = $(this).index();
    var info = $(this).html();
    alert(index + "----" + info);
});
 // on方法
$("ul").on("click", "li", function(){
    var index = $(this).index();
    var info = $(this).html();
    alert(index + "----" + info);
});
方式4. 使用ES6中的新特性let来声明变量用let来声明的变量将具有块级作用域,很明显可以达到要求,不过需要注意的是得加个‘use strict‘(使用严格模式)才会生效。
var ul = document.getElementsByTagName("ul")[0];
var list = ul.getElementsByTagName("li");  

function foo(){‘use strict‘
    for(let i = 0, len = list.length; i < len; i++){
        list[i].onclick = function(){
            alert(i + "----" + this.innerHTML);
        }
    }
}
foo();  

仅供参考,如有错误请指正!

时间: 2024-12-28 08:49:38

JS循环添加事件的相关文章

js原生添加事件的方式

js原生添加事件的方式: 1. 直接在html标签上添加 <div onclick="alert('div')">div</div> 2. 用dom的on...方法添加 document.getElementById('div').onclick = function () {alert('div')}; 3. 用addEventListener或attachEvent添加 document.getElementById('div').addEventListe

js循环绑定事件

在js中,用循环来为一对元素队列的元素绑定事件,是一个常见的问题. 通常进入误区的新人,都会这么写代码: (假设元素队列为o,默认使用jQuery) //error method var o =$('.blockHead'); for(var i=0; i<o.length; i++){ o[i].onclick = function(){ function(i){ alert(i); } } } 当然这种情况下,你会发现每个元素点击运行时,显示的 i值 都是 o.length-1: 因为js的

js动态添加事件-事件委托

作者:白狼 出处:http://www.manks.top/javascript-dynamic-event.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 其所谓的动态添加事件实质就是指js中的事件委托. 我们知道在js中,事件处理只能绑定在当前被选中的元素上,换句话也就是说,事件处理只能绑定在当前文档已经存在的元素上!但是,往往小伙伴们都会遇到一个问题就是,我的元素是后来动态添加到页面的,而我又想给该元素绑定

JS普通添加事件和事件绑定的区别

很简单,看代码. 普通添加事件的方法: var btn = document.getElementById("hello"); btn.onclick = function(){ alert(1); } btn.onclick = function(){ alert(2); } 执行上面的代码只会alert 2 事件绑定方式添加事件: var btn = document.getElementById("hello"); btn.addEventListener(&

JS - 循环添加 DropDownList(Select)

代码: <td style="padding-left: 10px;"> <select id="ddl_picture_3"> <!--循环添加1-600--> <script> for (var i = 100; i <= 700; i++) { document.write("<option value= r" + i + "'>" + i + "

遇到的问题(JS循环绑定事件)

问题描述:想通过循环的方式给HTML元素绑定事件,结果失败---总是会只能绑定到最后一个元素. HTML <div id="bnts"> <span></span> <span></span> <span></span> <span></span> </div> JS var bnts = document.getElementById("bnts"

js循环绑定事件解决方案

var add_the_handlers = function (nodes) { var helper= function (i) {return function (e) {alert(i);};}; var i; for (i = 0; i < nodes.length; i += 1) { nodes[i].onclick =helper(i); }};

闭包机制实现循环添加事件

for(var i = 0 ;i<xx.length;i++){ ((i)=>{ xx[i].onclick = ()=>{ //执行的代码 }; })(i); } 原文地址:https://www.cnblogs.com/Liqian-Front-End-Engineer/p/11372855.html

js 添加事件 attachEvent 和 addEventListener 的用法

一般我们在JS中添加事件,是这样子的 obj.onclick=method 这种绑定事件的方式,兼容主流浏览器,但如果一个元素上添加多次同一事件呢? obj.onclick=method1; obj.onclick=method2; obj.onclick=method3; 如果这样写,那么只有最后绑定的事件,这里是method3会被执行,这个时候我们就不能用onclick这样的写法了,主角改登场了,在IE中我们可以使用attachEvent方法 //object.attachEvent(eve