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


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 相关文章推荐
jQuery学习笔记之DOM对象和jQuery对象
Dec 22 Javascript
jquery 延迟执行实例介绍
Aug 20 Javascript
js获取当前路径的简单示例代码
Jan 08 Javascript
判断window.onload是否多次使用的方法
Sep 21 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
Mar 07 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
Dec 28 Javascript
js中删除数组中的某一元素实例(无下标时)
Feb 28 Javascript
jQuery插件之validation插件
Mar 29 jQuery
jQuery实现简单的抽奖游戏
May 05 jQuery
分析JS中this引发的bug
Dec 12 Javascript
vue.js使用v-if实现显示与隐藏功能示例
Jul 06 Javascript
vue监听对象及对象属性问题
Aug 20 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
Content-type 的说明
2006/10/09 PHP
PHP简介
2006/10/09 PHP
php利用cookie实现访问次数统计代码
2011/05/19 PHP
PHP判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
2016/03/03 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
js实现addClass,removeClass,hasClass的函数代码
2011/07/13 Javascript
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
JQuery伸缩导航练习示例
2013/11/13 Javascript
JavaScript学习笔记之数组去重
2016/03/23 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
JavaScript数组复制详解
2017/02/02 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
2017/06/15 Javascript
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
javascript计算渐变颜色的实例
2017/09/22 Javascript
vue axios封装及API统一管理的方法
2019/04/18 Javascript
深入了解js原型模式
2019/05/30 Javascript
详解elementui之el-image-viewer(图片查看器)
2019/08/30 Javascript
微信小程序云函数添加数据到数据库的方法
2020/03/04 Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
2020/09/07 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
pydev使用wxpython找不到路径的解决方法
2013/02/10 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
详解numpy的argmax的具体使用
2019/05/27 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
Python.append()与Python.expand()用法详解
2019/12/18 Python
基于pygame实现童年掌机打砖块游戏
2020/02/25 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
金讯Java笔试题目
2013/06/18 面试题
《大自然的语言》教学反思
2014/04/08 职场文书
追悼会答谢词范文
2015/09/29 职场文书
django如何自定义manage.py管理命令
2021/04/27 Python
总结Pyinstaller打包的高级用法
2021/06/28 Python