给事件响应函数传参数的四种方式小结


Posted in Javascript onDecember 05, 2013

如何给事件handler传参数?在刚刚接触Javascript的时候,由于对闭包理解不深刻,常常纠结于该问题。

在讨论群里也经常碰到这样的问题,如下

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <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>

如何把参数v1,v2传给handler?默认事件对象将作为handler的第一个参数传入,这时点击链接第一个弹出的是事件对象,第二个是undefined。

方案一 ,未保留事件对象作为第一个参数传入

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.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));
Javascript 相关文章推荐
javascript类继承机制的原理分析
Sep 12 Javascript
Javascript 面向对象特性
Dec 28 Javascript
javascript垃圾收集机制与内存泄漏详细解析
Nov 11 Javascript
解决jQuery使用JSONP时产生的错误
Dec 02 Javascript
微信小程序 form组件详解
Oct 25 Javascript
通过fastclick源码分析彻底解决tap“点透”
Dec 24 Javascript
bootstrap fileinput插件实现预览上传照片功能
Jan 23 Javascript
在vue2.0中引用element-ui组件库的方法
Jun 21 Javascript
在vue项目中引入高德地图及其UI组件的方法
Sep 04 Javascript
bootstrap table实现合并单元格效果
Dec 24 Javascript
js中async函数结合promise的小案例浅析
Apr 14 Javascript
JS闭包原理及其使用场景解析
Dec 03 Javascript
弹出最简单的模式化遮罩层的js代码
Dec 04 #Javascript
js如何设置在iframe框架中指定div不显示
Dec 04 #Javascript
jquery动态改变onclick属性导致失效的问题解决方法
Dec 04 #Javascript
javascript设置金额样式转换保留两位小数示例代码
Dec 04 #Javascript
下拉列表select 由左边框移动到右边示例
Dec 04 #Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
Dec 04 #Javascript
JavaScript执行顺序详细介绍
Dec 04 #Javascript
You might like
PHP curl 获取响应的状态码的方法
2014/01/13 PHP
jquery.cvtooltip.js 基于jquery的气泡提示插件
2010/11/19 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
ECMAScript中函数function类型
2015/06/03 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
js实现手机web图片左右滑动效果
2017/12/29 Javascript
Angular2之二级路由详解
2018/08/31 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
在JS循环中使用async/await的方法
2018/10/12 Javascript
使用post方法实现json往返传输数据的方法
2019/03/30 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
Promise扫盲贴
2019/06/24 Javascript
js实现移动端吸顶效果
2020/01/08 Javascript
javascript浅层克隆、深度克隆对比及实例解析
2020/02/09 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
Python基础教程之异常详解
2019/01/10 Python
python类的实例化问题解决
2019/08/31 Python
Django中自定义模型管理器(Manager)及方法
2019/09/23 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
2020/05/29 Python
python实现数字炸弹游戏
2020/07/17 Python
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
自荐书范文范例
2014/02/13 职场文书
对标管理实施方案
2014/03/12 职场文书
学生上课说话检讨书
2014/10/25 职场文书
青年文明号申报材料
2014/12/23 职场文书
2015年煤矿工作总结
2015/04/28 职场文书
学校捐书活动总结
2015/05/08 职场文书