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


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 相关文章推荐
dojo 之基础篇(二)之从服务器读取数据
Mar 24 Javascript
jquery $.ajax入门应用二
Nov 19 Javascript
JQuery扩展插件Validate 1 基本使用方法并打包下载
Sep 05 Javascript
jQuery版仿Path菜单效果
Dec 15 Javascript
json原理分析及实例介绍
Nov 29 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
Dec 31 Javascript
不同js异步函数同步的实现方法
May 28 Javascript
在线引用最新jquery文件的实现方法
Aug 26 Javascript
详解angularjs实现echart图表效果最简洁教程
Nov 29 Javascript
解决VUEX兼容IE上的报错问题
Mar 01 Javascript
JS实现的小火箭发射动画效果示例
Dec 08 Javascript
深入了解Vue3模板编译原理
Nov 19 Vue.js
弹出最简单的模式化遮罩层的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
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
PHP浮点比较大小的方法
2016/02/14 PHP
雄兵连第三季海报曝光,艾妮熙德成主角,蔷薇新造型
2021/03/09 国漫
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
Javascript继承机制详解
2017/05/30 Javascript
js实现移动端轮播图效果
2020/12/09 Javascript
js+html5生成自动排列对话框实例
2017/10/09 Javascript
Javascript实现异步编程的过程
2018/06/18 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
2019/09/23 Javascript
jQuery实现的图片点击放大缩小功能案例
2020/01/02 jQuery
JS使用setInterval计时器实现挑战10秒
2020/11/08 Javascript
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
2014/04/25 Python
Python 40行代码实现人脸识别功能
2017/04/02 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
使用OpenCV实现道路车辆计数的使用方法
2020/07/15 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
Perricone MD裴礼康美国官网:抗衰老护肤品
2016/09/26 全球购物
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
大学四年个人自我小结
2014/03/05 职场文书
计生工作先进事迹
2014/08/15 职场文书
家庭贫困证明范本(经典版)
2014/09/22 职场文书
人身意外保险授权委托书
2014/10/01 职场文书
免职证明样本
2014/10/23 职场文书
傅雷家书读书笔记
2015/06/29 职场文书
入队仪式主持词
2015/07/04 职场文书
2016年暑假家长对孩子评语
2015/12/01 职场文书
2019年恭贺升学祝福语集锦
2019/08/15 职场文书
咖啡厅里的创业计划书
2019/08/21 职场文书
oracle表分区的概念及操作
2021/04/24 Oracle
Win11如何查看显卡型号 Win11查看显卡型号的方法
2022/08/14 数码科技