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

如何给事件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));

时间: 2024-08-03 14:27:02

给事件响应函数传参数的四种方式小结_javascript技巧的相关文章

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

     这篇文章主要介绍了给事件响应函数传参数的四种方式.需要的朋友可以过来参考下,希望对大家有所帮助      如何给事件handler传参数?在刚刚接触Javascript的时候,由于对闭包理解不深刻,常常纠结于该问题.   在讨论群里也经常碰到这样的问题,如下   代码如下: <!DOCTYPE HTML> <html> <head>     <meta charset="utf-8">     <title>如何给事

String字符串截取的四种方式总结_javascript技巧

如下所示: import java.util.StringTokenizer; import java.util.regex.Pattern; import org.junit.Test; public class TestStringToken { @Test public void subSting() { String str = "java,javac,javae"; String s1 = str.substring(2);//"va,javac,javae&quo

JavaScript重定向URL参数的两种方法小结_javascript技巧

这篇文章主要介绍的是JavaScript重定向URL参数的两种方法,下面话不多说,直接看示例代码. 一.字符拼接形式 function setUri(para, val) { var strNewUrl = new String(); var strUrl = new String(); var url = window.location.href; strUrl = window.location.href; if (strUrl.indexOf("?") != -1) { strU

JS获取地址栏参数的几种方法小结_javascript技巧

复制代码 代码如下: <script> // 获取地址栏的参数数组 function getUrlParams() {  var search = window.location.search;  // 写入数据字典  var tmparray = search.substr(1, search.length).split("&");  var paramsArray = new Array;  if (tmparray != null) {   for (var

JavaScript 定义function的三种方式小结_javascript技巧

(1)声明一个表达式变量,并定义该变量的表达式.如: 复制代码 代码如下: var func = function() { /*body code*/ } (2) 定义一个function表达式,并指定该表达式的标识.如: 复制代码 代码如下: function func() { //body code } (3) 使用JavaScript内置Function对象构造.如: 复制代码 代码如下: var func = new Function("/*parameters*/",&quo

将string解析为json的几种方式小结_javascript技巧

1.比较古老的方法: 复制代码 代码如下: function strToJson(str){ var json = eval('(' + str + ')'); return json; } 2.比较常用的方法: 复制代码 代码如下: function strToJson(str){ return (new Function("return " + str))(); } 3.IE67不支持的json对象方法: 复制代码 代码如下: function strToJson(str){ re

thinkphp 3.2.3 入门示例2(URL传参数的几种方式)

原文:thinkphp中URL传参数的几种方式 在thinkphp中,url传参合asp.net中原理类似,下面就单个参数和多个参数传递方式进行一个简单讲解 1.传单个参数  单个参数这种比较简单,例如 想像edit操作里面传递一个id值,如下写法__URL__/edit/id/1 http://localhost/index.php/user/edit/id/1 id和其值1要分别位于/后面 后台获取id通过    $id=$_GET['id']   即可获取其具体值. 2.传多个参数 传多个

Python函数中定义参数的四种方式_python

Python中函数参数的定义主要有四种方式: 1. F(arg1,arg2,-) 这是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等 的值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应,也就是说第一个形参对应这第一个实参.例如: 复制代码 代码如下: def a(x,y):print x,y 调用该函数,a(1,2)则x取1,y取2,形参与实参相对应

android全局监控click事件的四种方式(小结)

本文主要给大家分享如何在全局上去监听 click 点击事件,并做些通用处理或是拦截.使用场景可能就是具体的全局防快速重复点击,或是通用打点分析上报,用户行为监控等.以下将以四种不同的思路和实现方式去监控全局的点击操作,由简单到复杂逐一讲解. 方式一,适配监听接口,预留全局处理接口并作为所有监听器的基类使用 抽象出公共基类监听对象,可预留拦截机制和通用点击处理,简要代码如下: public abstract class CustClickListener implements View.OnCli