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


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.extend 函数的详细用法
Jun 27 Javascript
jquery如何实现锚点链接之间的平滑滚动
Dec 02 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
Dec 17 Javascript
node.js中的fs.closeSync方法使用说明
Dec 17 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
May 10 Javascript
JS使用单链表统计英语单词出现次数
Jun 16 Javascript
Javascript实现代码折叠功能
Aug 25 Javascript
JS正则获取HTML元素的方法
Mar 31 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
Mar 09 Javascript
js中Object.defineProperty()方法的不详解
Jul 09 Javascript
vue实现键盘输入支付密码功能
Aug 18 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
May 06 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/02/08 PHP
php摘要生成函数(无乱码)
2012/02/04 PHP
php实现网站留言板功能
2015/11/04 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
JavaScipt基本教程之JavaScript语言的基础
2008/01/16 Javascript
比较全面的event对像在IE与FF中的区别 推荐
2009/09/21 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
JS插件plupload.js实现多图上传并显示进度条
2016/11/29 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
20多个小事例带你重温ES10新特性(小结)
2019/09/29 Javascript
vue实现图片上传功能
2020/05/28 Javascript
处理JavaScript值为undefined的7个小技巧
2020/07/28 Javascript
vue和H5 draggable实现拖拽并替换效果
2020/07/29 Javascript
Vue中关闭弹窗组件时销毁并隐藏操作
2020/09/01 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
在vue中获取wangeditor的html和text的操作
2020/10/23 Javascript
[48:26]VGJ.S vs infamous Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
Python聊天室程序(基础版)
2018/04/01 Python
Python2和3字符编码的区别知识点整理
2019/08/08 Python
python多进程(加入进程池)操作常见案例
2019/10/21 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
劳动模范事迹材料
2014/01/19 职场文书
最新奶茶店创业计划书范文
2014/02/08 职场文书
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
白莲教口号
2014/06/18 职场文书
亲子阅读的活动方案
2014/08/15 职场文书
一年级下册数学教学反思
2016/02/16 职场文书