给事件响应函数传参数的多种方式

发布于 2022-09-30 19:25:28 字数 6701 浏览 12 评论 0

转:Snandy

给事件响应函数传参数的多种方式

如何给事件handler传参数?在刚刚接触Javascript的时候,由于对闭包理解不深刻,常常纠结于该问题。

在讨论群里也经常碰到这样的问题,如下

  1. 01 <!DOCTYPE HTML>  
  2. 02 <html>  
  3. 03 <head>  
  4. 04     <meta charset="utf-8">  
  5. 05     <title>如何给事件handler传参数?</title>  
  6. 06 </head>  
  7. 07 <body>  
  8. 08     <a href="#" id="aa">Click me</a>  
  9. 09     <script type="text/javascript">  
  10. 10         var E = {  
  11. 11             on : function(el, type, fn){  
  12. 12                 el.addEventListener ?  
  13. 13                     el.addEventListener(type, fn, false) :  
  14. 14                     el.attachEvent("on" + type, fn);  
  15. 15             },  
  16. 16             un : function(el,type,fn){  
  17. 17                 el.removeEventListener ?  
  18. 18                     el.removeEventListener(type, fn, false) :  
  19. 19                     el.detachEvent("on" + type, fn);         
  20. 20             }  
  21. 21         };  
  22. 22            
  23. 23         var v1 = 'jack', v2 = 'lily';                        
  24. 24         function handler(arg1,arg2){  
  25. 25             alert(arg1);  
  26. 26             alert(arg2);  
  27. 27         }  
  28. 28                    
  29. 29         // 如何把参数v1,v2传给handler?  
  30. 30         // 默认事件对象将作为handler的第一个参数传入,  
  31. 31         // 这时点击链接第一个弹出的是事件对象,第二个是undefined。               
  32. 32         E.on(document.getElementById('aa'),'click',handler);  
  33. 33     </script>  
  34. 34 </body>  
  35. 35 </html>

复制代码如何把参数v1,v2传给handler?默认事件对象将作为handler的第一个参数传入,这时点击链接第一个弹出的是事件对象,第二个是undefined。

方案一 ,未保留事件对象作为第一个参数传入

  1. 1 function handler(arg1,arg2){  
  2. 2     alert(arg1);  
  3. 3     alert(arg2);  
  4. 4 }  
  5. 5 E.on(document.getElementById('aa'),'click',function(){   
  6. 6     handler(arg1,arg2);   
  7. 7 });

复制代码方案二,保留事件对象作为第一个参数

  1. 1 function handler(e,arg1,arg2){  
  2. 2     alert(e);  
  3. 3     alert(arg1);  
  4. 4     alert(arg2);  
  5. 5 }  
  6. 6 E.on(document.getElementById('aa'),'click',function(e){  
  7. 7     handler(e,arg1,arg2);  
  8. 8 });

复制代码方案三,给Function.prototype添加getCallback,不保留事件对象

  1. 1 Function.prototype.getCallback = function(){  
  2. 2     var _this = this, args = arguments;      
  3. 3     return function(e) {  
  4. 4         return _this.apply(this || window, args);  
  5. 5     };  
  6. 6 }  
  7. 7 E.on(document.getElementById('aa'),'click',handler.getCallback(v1,v2));
  8. 方案四,给Function.prototype添加getCallback,保留事件对象作为第一个参数传入
  9. view sourceprint?
  10. 01 Function.prototype.getCallback = function(){  
  11. 02     var _this = this, args = [];  
  12. 03     for(var i=0,l=arguments.length;i<l;i++){  
  13. 04         args[i+1] = arguments[i];  
  14. 05     }  
  15. 06     return function(e) {  
  16. 07         args[0] = e;  
  17. 08         return _this.apply(this || window, args);  
  18. 09     };  
  19. 10 }  
  20. 11 E.on(document.getElementById('aa'),'click',handler.getCallback(v1,v2));

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文