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


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.validate使用攻略 第一部
Jul 01 Javascript
基于jquery实现图片广告轮换效果代码
Jul 07 Javascript
JS 控件事件小结
Oct 31 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
Jun 29 Javascript
javascript自然分类法算法实现代码
Oct 11 Javascript
jQuery中detach()方法用法实例
Dec 25 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
Aug 26 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
Feb 21 Javascript
微信小程序 共用变量值的实现
Jul 12 Javascript
Vue+webpack+Element 兼容问题总结(小结)
Aug 16 Javascript
[原创]微信小程序获取网络类型的方法示例
Mar 01 Javascript
jQuery实时统计输入框字数及限制
Jun 24 jQuery
弹出最简单的模式化遮罩层的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
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
php文件上传的简单实例
2013/10/19 PHP
PHP网络操作函数汇总
2015/05/18 PHP
php 在字符串指定位置插入新字符的简单实现
2016/06/28 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
2016/12/19 PHP
jQuery表单验证插件formValidator(改进版)
2012/02/03 Javascript
JQuery勾选指定name的复选框集合并显示的方法
2015/05/18 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
jQuery中ajax的load()与post()方法实例详解
2016/01/05 Javascript
JavaScript读二进制文件并用ajax传输二进制流的方法
2016/07/18 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
JavaScript“尽快失败”的原则实例详解
2016/10/08 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
2017/03/27 jQuery
vue中将网页打印成pdf实例代码
2017/06/15 Javascript
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
深入理解Vue官方文档梳理之全局API
2017/11/22 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
Nodejs核心模块之net和http的使用详解
2019/04/02 NodeJs
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
vue编写简单的购物车功能
2021/01/08 Vue.js
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
python开发之thread线程基础实例入门
2015/11/11 Python
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
Python 实现OpenCV格式和PIL.Image格式互转
2020/01/09 Python
Omio西班牙:全欧洲低价大巴、火车和航班搜索和比价
2017/02/11 全球购物
新西兰最大的在线设计师眼镜店:SmartBuyGlasses新西兰
2017/10/20 全球购物
serialVersionUID具有什么样的特征
2014/02/20 面试题
RealTek面试题
2016/06/28 面试题
幼儿园实习自我鉴定
2013/12/15 职场文书
班级体育活动总结
2014/07/05 职场文书
中国梦演讲稿范文
2014/08/28 职场文书
小学中队委竞选稿
2015/11/20 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python
Django框架模板用法详解
2022/06/10 Python