js绑定事件打印索引的方法整理

本文探讨了在DOM元素上绑定事件并记录元素索引的方法。通过五种不同方式实现:使用对象属性、闭包、自执行匿名函数及new Function声明函数等,比较了各种方法的优劣,帮助开发者选择最适合场景的技术方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很常见的问题,dom对象绑定事件打印索引。

<html >
<body>

<p>111</p>
<p>222</p>
<p>333</p>
<p>444</p>
<p>555</p>

</body>
</html>



<script type="text/javascript">
var p = document.getElementsByTagName("p");
var len = p.length;
function fn1(){
	for(var i=0; i<len; i++){
		p[i].setAttribute("x",i+1);
		p[i].onclick = function(){
			alert(this.getAttribute("x"));
		};
	}
}
//fn1();

function fn2(){
	for(var i=0; i<len; i++){	
		p[i].onclick = function(){
			alert(arguments.callee.x);
		}
		p[i].onclick.x = i+1;
		//or
		/*
		(p[i].onclick = function(){
			alert(arguments.call.x);
		}).x = i+1;
		*/
	}
}
//fn2();
// ----------------- 以上是保存变量在对象中。


function fn3(){
	for(var i=0; i<len; i++){
		p[i].onclick = (function(x){  
			var y = i+1;
			return function(){   //返回一个闭包,引用了来自外层的变量
				alert(x);        // 参数形式
				alert(y);        // 变量形式,外层函数执行可以不带参数.
			};
		})(i+1);
	}
}
//fn3();

function fn4(){
	for(var i=0; i<len; i++){
		(function(x){                 //利用自执行的匿名函数激发作用域。体会和fn3的区别。
			var y = i+1;			  //fn3和fn4同样是闭包,不过fn3是在函数外引用闭包,fn4是在函数内引用闭包。
			p[i].onclick = function(){
				alert(x);
				alert(y);
			}
		})(i+1);
	}
}
//fn4();
// ----------------------以上变量保存在闭包中

function fn5(){
	for(var i=0; i<len; i++){            
		var str = "alert("+(i+1)+")";      //利用new Function声明函数。
		p[i].onclick = new Function(str);  //这种方法相当于对每一个p[i]单独声明了一个构造好的函数.
	}
}
fn5();

//总结
/*
	fn5的效率无疑是最差的,因为new Function的问题,所以不建议使用。
	fn3,fn4利用闭包的特性,分别在内存中持久了每一个i的变量。这里可以帮助理解闭包的作用。
	fn1,fn2将变量保存在对象上,效率最高,对于大量的绑定建议使用。
*/

</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值