给事件handler传参数-初学者的困惑

如何给事件handler传参数?在刚刚接触Javascript的时候,由于对闭包理解不深刻,常常纠结于该问题。在讨论群里也经常碰到这样的问题,如下:

<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
        <title>如何给事件handler传参数?</title>
    </head>
    <body>
		<a href="#" id="aa">Click me</a>
		<script type="text/javascript">
			var E = {
				on : function(el, type, fn){
					el.addEventListener ?
						el.addEventListener(type, fn, false) :
						el.attachEvent("on" + type, fn);
				},
				un : function(el,type,fn){
					el.removeEventListener ?
						el.removeEventListener(type, fn, false) :
						el.detachEvent("on" + type, fn);		
				}
			};
			var v1 = 'jack', v2 = 'lily';
						
			function handler(arg1,arg2){
				alert(arg1);
				alert(arg2);
			}
					
			// 如何把参数v1,v2传给handler?
			// 默认事件对象将作为handler的第一个参数传入,
			// 这时点击链接第一个弹出的是事件对象,第二个是undefined。				
			E.on(document.getElementById('aa'),'click',handler);
		</script>
    </body>
</html>

 

解决方案一

function handler(arg1,arg2){
	alert(arg1);
	alert(arg2);
}
E.on(document.getElementById('aa'),'click',function(){	
	handler(arg1,arg2);	
});
 

解决方案二  保留事件对象作为第一个参数

function handler(e,arg1,arg2){
	alert(e);
	alert(arg1);
	alert(arg2);
}
E.on(document.getElementById('aa'),'click',function(e){
	handler(e,arg1,arg2);
});
 

解决方案三

function handler(arg1,arg2){
	alert(arg1);
	alert(arg2);
}
E.on(document.getElementById('aa'),'click',(function(arg1,arg2){
	return function(){
		handler.call(this,arg1,arg2);
	};
})(v1,v2));
 

解决方案四,保留事件对象作为第一个参数

function handler(e,arg1,arg2){
	alert(e);
	alert(arg1);
	alert(arg2);
}
E.on(document.getElementById('aa'),'click',(function(arg1,arg2){
	return function(e){
		handler.call(this,e,arg1,arg2);
	};
})(v1,v2));

 

解决方案三,给Function.prototype添加getCallback,不保留事件对象

Function.prototype.getCallback = function(){
	var _this = this, args = arguments;		
	return function(e) {
        return _this.apply(this || window, args);
    };
}
E.on(document.getElementById('aa'),'click',handler.getCallback(v1,v2));

 

解决方案四,给Function.prototype添加getCallback,保留事件对象作为第一个参数传入

Function.prototype.getCallback = function(){
	var _this = this, args = [];
	for(var i=0,l=arguments.length;i<l;i++){
		args[i+1] = arguments[i];
	}
	return function(e) {
		args[0] = e;
        return _this.apply(this || window, args);
    };
}
E.on(document.getElementById('aa'),'click',handler.getCallback(v1,v2));

 

 

最后附件中有四种解决方案完整的html,js代码。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值