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


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 学习小结(适合新手参考)
Jul 30 Javascript
JavaScript实现简单的时钟实例代码
Nov 23 Javascript
js实现温度计时间样式代码分享
Aug 21 Javascript
jQuery实现图片局部放大镜效果
Mar 17 Javascript
JavaScript SHA-256加密算法详细代码
Oct 06 Javascript
jQuery纵向导航菜单效果实现方法
Dec 19 Javascript
Javascript自定义事件详解
Jan 13 Javascript
AngulerJS学习之按需动态加载文件
Feb 13 Javascript
Express下采用bcryptjs进行密码加密的方法
Feb 07 Javascript
解决vue-router中的query动态传参问题
Mar 20 Javascript
Vue组件全局注册实现警告框的实例详解
Jun 11 Javascript
JavaScript遍历数组的方法代码实例
Jan 14 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
ext监听事件方法[初级篇]
2008/04/27 Javascript
ImageZoom 图片放大镜效果(多功能扩展篇)
2010/04/14 Javascript
JS随机漂浮广告代码具体实例
2013/11/19 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
jquery验证手机号是否正确实例讲解
2015/11/17 Javascript
超实用的JavaScript表单代码段
2016/02/26 Javascript
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
安装Node.js并启动本地服务的操作教程
2018/05/12 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
2018/08/03 jQuery
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
2020/11/06 Javascript
Python遍历指定文件及文件夹的方法
2015/05/09 Python
Python使用bs4获取58同城城市分类的方法
2015/07/08 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
pandas 层次化索引的实现方法
2019/07/06 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
Django中自定义模型管理器(Manager)及方法
2019/09/23 Python
python读取yaml文件后修改写入本地实例
2020/04/27 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
用python绘制樱花树
2020/10/09 Python
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
C#面试问题
2016/07/29 面试题
《世界多美呀》教学反思
2014/03/02 职场文书
2014全国两会心得体会
2014/03/17 职场文书
党校个人自我鉴定范文
2014/03/28 职场文书
公务员试用期满考核材料
2014/05/22 职场文书
改进作风怎么办发言材料
2014/08/17 职场文书
党的群众路线教育实践活动调研报告
2014/11/03 职场文书
第28个世界无烟日活动总结
2015/02/10 职场文书
医德医风个人总结
2015/02/28 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
国富论读书笔记
2015/06/26 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
2016年教代会开幕词
2016/03/04 职场文书