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


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 相关文章推荐
解析arp病毒背后利用的Javascript技术附解密方法
Aug 06 Javascript
ExtJS 2.2.1的grid控件在ie6中的显示问题
May 04 Javascript
了不起的node.js读书笔记之node.js中的特性
Dec 22 Javascript
vue实现app页面切换动画效果实例
May 23 Javascript
详解webpack介绍&amp;安装&amp;常用命令
Jun 29 Javascript
微信小程序使用Promise简化回调
Feb 06 Javascript
js自定义trim函数实现删除两端空格功能
Feb 09 Javascript
axios携带cookie配置详解(axios+koa)
Dec 28 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
Nov 29 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
May 06 Javascript
浏览器JavaScript调试功能无法使用解决方案
Sep 18 Javascript
插件导致ECharts被全量引入的坑示例解析
Sep 23 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 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
教你如何快捷的使用cmd访问mysql小技巧
2014/05/26 PHP
php for 循环使用的简单实例
2016/06/02 PHP
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
jQuery中调用WebService方法小结
2011/03/28 Javascript
jquery实现对联广告的方法
2015/02/05 Javascript
JavaScript中pop()方法的使用教程
2015/06/09 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
2016/08/30 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
Vue实现百度下拉提示搜索功能
2017/06/21 Javascript
javascript 通过键名获取键盘的keyCode方法
2017/12/31 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
微信小程序动态显示项目倒计时
2019/06/20 Javascript
vue3使用vue-count-to组件的实现
2020/12/25 Vue.js
Python读写ini文件的方法
2015/05/28 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
python:接口间数据传递与调用方法
2018/12/17 Python
python对列进行平移变换的方法(shift)
2019/01/10 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
python3调用windows dos命令的例子
2019/08/14 Python
Python如何定义有可选参数的元类
2020/07/31 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
小程序瀑布流解决左右两边高度差距过大的问题
2019/02/20 HTML / CSS
阿迪达斯德国官方网站:adidas德国
2017/07/12 全球购物
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/04/11 面试题
领导班子四风对照检查材料
2014/09/23 职场文书
“向国旗敬礼”主题班会活动设计方案
2014/09/27 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
办理收楼委托书范本
2014/10/09 职场文书
2014年团支部年度工作总结
2014/12/24 职场文书
涨价通知怎么写
2015/04/23 职场文书
2015年十月一日放假通知
2015/08/18 职场文书