`
liang100100
  • 浏览: 37229 次
  • 性别: Icon_minigender_2
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

js闭包基本应用演示循环添加事件

 
阅读更多
遇到一个问题,获取html元素集,想给他们循环添加事件,在点击的时候需要把外面的参数传进去,这样,每次取到的值都是最后一个。代码如下
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>闭包演示</title>
</head>
<script type="text/javascript">
function load(){
	var dates=["我是第一个","我是第二个","我是第三个","我是第四个","我是第五个"];
	for(var i=0;i<5;i++){
		var date=dates[i];
		var obj=document.getElementById("btn"+(i+1));
		obj.onclick=function(arg){
			alert(date);
		};
	}
	
}
</script>

<body onload="load()">
  <ul>  
    <li> <a href="javaScript:void(0);" id="btn1">测试1</a></li>
	<li> <a href="javaScript:void(0);" id="btn2">测试2</a></li>
	<li> <a href="javaScript:void(0);" id="btn3">测试3</a></li>
	<li> <a href="javaScript:void(0);" id="btn4">测试4</a></li>
	<li> <a href="javaScript:void(0);" id="btn5">测试5</a></li>
  </ul>
</body>
</html>

打印出来的值每次都是最后一个;后面搜索出很多方法,先整理保存下,留着用。
应用js闭包,把js方法修改如下:
1、加一层闭包,返回一个函数作为响应事件
function load(){
	var dates=["我是第一个","我是第二个","我是第三个","我是第四个","我是第五个"];
	for(var i=0;i<5;i++){
		var date=dates[i];
		var obj=document.getElementById("btn"+(i+1));
		obj.onclick=function(arg){
			return function(){
				alert(arg);
				//可以在这里写点击事件时所做的事
			};
		}(date);
	}
}

2、将变量 date 保存给在每个段落对象(a)上

function load(){ 
    var dates=["我是第一个","我是第二个","我是第三个","我是第四个","我是第五个"];
	for(var i=0;i<5;i++){
		var date=dates[i];
		var obj=document.getElementById("btn"+(i+1));
		obj.date=date;
		obj.onclick=function(){
			 alert(this.date);
		};
	}
}

3、将变量 date保存在匿名函数自身
function load(){ 
    var dates=["我是第一个","我是第二个","我是第三个","我是第四个","我是第五个"];
	for(var i=0;i<5;i++){
		var date=dates[i];
		var obj=document.getElementById("btn"+(i+1));
		(obj.onclick=function(){
			 alert(arguments.callee.date);
		}).date=date;
	}
}

4、加一层闭包,date以函数参数形式传递给内层函数
function load(){ 
    var dates=["我是第一个","我是第二个","我是第三个","我是第四个","我是第五个"];
	for(var i=0;i<5;i++){
		var date=dates[i];
		var obj=document.getElementById("btn"+(i+1));
		(function(arg){
       		obj.onclick = function() {
            alert(arg);
             };
        })(date);//调用时参数 
	}
}


5、加一层闭包,date以局部变量形式传递给内层函数
function load(){ 
    var dates=["我是第一个","我是第二个","我是第三个","我是第四个","我是第五个"];
	for(var i=0;i<5;i++){
		var date=dates[i];
		var obj=document.getElementById("btn"+(i+1));
		(function () {
		  var temp = date;//调用时局部变量
		  obj.onclick = function() {
			alert(temp);
		  }
		})();
	}
}

6、用Function实现,实际上每产生一个函数实例就会产生一个闭包
function load(){ 
    var dates=["我是第一个","我是第二个","我是第三个","我是第四个","我是第五个"];
	for(var i=0;i<5;i++){
		var date=dates[i];
		var obj=document.getElementById("btn"+(i+1));
		obj.onclick =new Function("alert('"+date+"');");//new一次就产生一个函数实例,注意此处date两边需要加上单引号,否则js会把date的值当做变量
	}
}

7、用Function实现,没有new
function load(){ 
    var dates=["我是第一个","我是第二个","我是第三个","我是第四个","我是第五个"];
	for(var i=0;i<5;i++){
		var date=dates[i];
		var obj=document.getElementById("btn"+(i+1));
		obj.onclick =Function("alert('"+date+"');");//new一次就产生一个函数实例,注意此处date两边需要加上单引号,否则js会把date的值当做变量
	}
}



分享到:
评论

相关推荐

    JS 循环li添加点击事件 (闭包的应用)

    这篇文章通过一个实用的例子演示了如何在循环中通过闭包来为每个li元素绑定点击事件处理器,同时保持每个事件处理器独立的作用域,使得点击不同的li元素时可以弹出对应的索引,体现了闭包在JavaScript编程中的实际...

    分析js闭包引起的事件注册问题

    在描述中,作者指出了一个常见的误区,即在for循环中为DOM节点注册事件时,由于闭包的特性,导致了事件处理器绑定到了不期望的值。作者解释说,在循环过程中,变量i的引用被保存在了事件处理器中,而当事件处理器被...

    Javascript闭包演示代码小结

    闭包演示 p {background:gold;} function init() { var pAry = document.getElementsByTagName(“p”); for( var i=0; i 产品 0 产品 1 产品 2 产品 3 产品 4 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]...

    javascript代码和网页演示

    总的来说,"javascript代码和网页演示"是一个宝贵的资源,通过实际的代码示例和效果展示,可以帮助学习者掌握JavaScript的基本语法、网页特效的实现以及更高级的技术应用,为成为优秀的前端开发者奠定坚实基础。...

    javascript演示程序

    总的来说,"javascript演示程序"将带你探索JavaScript的各个领域,包括基本语法、DOM操作、事件处理、AJAX、函数、面向对象编程等。通过实践这些示例,你不仅能了解JavaScript的工作原理,还能提升你的编程技能,为...

    300个JavaScript应用实例

    实例将演示如何绑定事件处理程序,以及如何使用DOM API来查找、添加、删除和修改页面元素。 6. **AJAX与Fetch API** AJAX(异步JavaScript和XML)使得页面无需刷新就能与服务器通信。Fetch API是现代浏览器中的新...

    javascript 常见的闭包问题的解决办法

    –这就是闭包的问题 原来 在js中,函数中在定义函数,就出现闭包了。此时外层函数中变量是可以在里层函数里利用的,即使外层函数结束。但是当外层中出现循环的时候,如果在里层函数中利用这个循环变量的话,会直接...

    javascript实例应用---综合类.rar

    JavaScript是一种广泛应用于网页和网络应用的编程语言,尤其在客户端脚本方面表现出色。这个"javascript实例应用---综合类.rar"压缩包很可能包含了多种JavaScript的实际应用案例,旨在帮助学习者理解并掌握...

    javascript中的作用域和闭包详解

    循环绑定事件是JavaScript开发中常见的一种模式,通过闭包可以实现闭包内函数访问外部循环变量i的值。在循环中直接绑定事件处理器会导致所有处理器引用相同的变量i,最终值为循环的最后一个值。通过闭包,每个事件...

    js高级教你学好前端

    "js高级教你学好前端"这一主题旨在深入探讨JavaScript的高级特性,帮助开发者提升技能,打造更加高效、交互性更强的Web应用。 JavaScript的核心概念包括变量、数据类型、操作符、流程控制(如条件语句和循环)、...

    JavaScript 例子(JavaScript 源码html格式)

    JavaScript,简称JS,是一种广泛应用于Web开发的轻量级编程语言,主要负责为网页添加交互性和动态功能。这个"JavaScript例子"压缩包提供了一系列的源码示例,旨在帮助学习者深入理解和掌握JavaScript的核心概念与...

    JS经典代码 JavaScript 经典

    本软件"JS经典代码 JavaScript 经典"正是为了帮助开发者更好地理解和学习JavaScript而设计的,包含了丰富的源码示例和演示。 1. **基础概念**:JavaScript基于ECMAScript规范,具有面向对象、函数式、弱类型等特性...

    浅谈JavaScript for循环 闭包

    有个网友问了个问题,如下的html,为什么每次输出都是5,而不是点击每个p...闭包演示&lt;/title&gt; [removed] function init() { var pAry = document.getElementsByTagName(p); for( var i=0; i&lt;pAry.length; i

    程序天下JavaScript(所有例子).rar

    10. **Node.js**:JavaScript还可以用于服务器端开发,通过Node.js平台,开发者可以用JavaScript编写服务器端应用程序。 压缩包中的"程序天下JavaScript(例子)"可能涵盖了上述各个方面的实例,每个例子都旨在帮助...

    javaScript教程及实例

    JavaScript,也被称为JS,是一种广泛应用于网页和网络应用的脚本语言,主要在客户端运行,为用户提供动态交互体验。此“JavaScript教程及实例”压缩包包含了一本关于JavaScript的详细讲解PPT和一系列实例代码,旨在...

Global site tag (gtag.js) - Google Analytics