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


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 相关文章推荐
让回调函数 showResponse 也带上参数的代码
Aug 13 Javascript
Javascript 更新 JavaScript 数组的 uniq 方法
Jan 23 Javascript
JavaScript 程序编码规范
Nov 23 Javascript
js操作textarea 常用方法总结
Dec 03 Javascript
调用jQuery滑出效果时闪烁的解决方法
Mar 27 Javascript
jQuery表格列宽可拖拽改变且兼容firfox
Sep 03 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
Aug 27 Javascript
详解Angular.js的$q.defer()服务异步处理
Nov 06 Javascript
jQuery图片轮播功能实例代码
Jan 29 Javascript
vue.js语法及常用指令
Oct 29 Javascript
浅谈React Native Flexbox布局(小结)
Jan 08 Javascript
原生js+ajax分页组件
Jan 30 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 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
PHP用身份证号获取星座和生肖的方法
2013/11/07 PHP
PHP数组和explode函数示例总结
2015/05/08 PHP
文件上传之SWFUpload插件(代码)
2015/07/30 PHP
PHP获取当前日期及本周一是几月几号的方法
2017/03/28 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
动态加载JS文件的三种方法
2013/11/08 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
javascript每日必学之条件分支
2016/02/17 Javascript
web页面和微信小程序页面实现瀑布流效果
2018/09/26 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
layui实现三级导航菜单
2019/07/26 Javascript
vue实现在v-html的html字符串中绑定事件
2019/10/28 Javascript
[02:34]肉山说——泡妞篇
2014/09/16 DOTA
[02:32]“虐狗”镜头慎点 2016国际邀请赛中国区预选赛现场玩家采访
2016/06/28 DOTA
python实现八大排序算法(2)
2017/09/14 Python
遗传算法之Python实现代码
2017/10/10 Python
python实现k-means聚类算法
2018/02/23 Python
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
Python中的元组介绍
2019/01/28 Python
python中调试或排错的五种方法示例
2019/09/12 Python
Pytorch 实现冻结指定卷积层的参数
2020/01/06 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
利用CSS3实现自定义滚动条代码分享
2016/08/18 HTML / CSS
a标签下载链接的简单实现
2016/09/13 HTML / CSS
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
法律进社区实施方案
2014/03/21 职场文书
老人节标语大全
2014/10/08 职场文书
旷工辞退通知书
2015/04/17 职场文书
2015年卫生监督工作总结
2015/05/21 职场文书
2016年“世界环境日”校园广播稿
2015/12/18 职场文书
python基础之模块的导入
2021/10/24 Python
python解析照片拍摄时间进行图片整理
2022/07/23 Python