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


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 相关文章推荐
AngularJS 使用$sce控制代码安全检查
Jan 05 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
Oct 15 Javascript
探究Vue.js 2.0新增的虚拟DOM
Oct 20 Javascript
js 轮播效果实例分享
Dec 28 Javascript
javascript设计模式之中介者模式学习笔记
Feb 15 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
May 20 jQuery
Ionic3 UI组件之Gallery Modal详解
Jun 07 Javascript
使用原生js+canvas实现模拟心电图的实例
Sep 20 Javascript
AngualrJs清除定时器遇到的坑
Oct 13 Javascript
React props和state属性的具体使用方法
Apr 12 Javascript
vue路由传参三种基本方式详解
Dec 09 Javascript
element-ui如何防止重复提交的方法步骤
Dec 09 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
ip签名探针
2006/10/09 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
2013/06/29 PHP
PHP查询网站的PR值
2013/10/30 PHP
PHP中的函数声明与使用详解
2017/05/27 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
jquery序列化form表单使用ajax提交后处理返回的json数据
2014/03/03 Javascript
jquery分页插件jpaginate在IE中不兼容问题
2014/04/22 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
DOM基础教程之使用DOM设置文本框
2015/01/20 Javascript
JavaScript数据类型判定的总结笔记
2015/07/31 Javascript
Javascript在IE和Firefox浏览器常见兼容性问题总结
2016/08/03 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
js轮播图的插件化封装详解
2017/07/17 Javascript
小程序红包雨的实现示例
2019/02/19 Javascript
在Vuex中Mutations修改状态操作
2020/07/24 Javascript
Ant design vue中的联动选择取消操作
2020/10/31 Javascript
[48:52]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第一局
2016/02/25 DOTA
Python 除法小技巧
2008/09/06 Python
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
Python3中的真除和Floor除法用法分析
2016/03/16 Python
使用Python+wxpy 找出微信里把你删除的好友实例
2019/02/21 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
2020/02/18 Python
Python之变量类型和if判断方式
2020/05/05 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
Python中Pyspider爬虫框架的基本使用详解
2021/01/27 Python
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
机关门卫岗位职责
2013/12/30 职场文书
社区优秀志愿者先进事迹
2014/05/09 职场文书
个人事迹材料范文
2014/12/29 职场文书
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript
div与span之间的区别与使用介绍
2021/12/06 HTML / CSS
Java结构型设计模式之组合模式详解
2022/09/23 Java/Android