2009-10-13 105 views
6

当我尝试将事件处理函数与参数,如:访问事件对象

myhandle.onclick = myfunction(param1,param2); 

function myfunction(param1,param2){ 
} 

现在我要访问我的处理函数的事件对象。在发送事件对象的网页上提到了一种方法,如:

myhandle.onclick = myfunction(event,param1,param2); 

但是,当我测试它时,它的给定事件对象未定义。

我知道库使这个东西很容易,但我正在寻找一个原生的JS选项。

回答

4

我不完全确定你想要做什么,但也许这样的事情是你在找什么?

function myfunction(param1, param2){ 
    return function(event) { 
     // For compatibility with IE. 
     if (!event) { 
      event = window.event; 
     } 

     alert("event = " + event + ", param1 = " + param1 + ", param2 = " + param2); 
    }; 
} 

myhandle.onclick = myfunction(param1, param2); 

的该最终结果是,内部myfunction匿名功能将被调用作为onclick处理程序,从而在事件加上正在打印的两个参数。这两个参数在添加事件处理程序时固定,而event将在用户每次单击myhandle时更改。

0

试试这个:

if (!event) { event = window.event; } 

的MyFunction()内。

7

myhandle.onclick = myfunction(param1,param2);

这是JavaScript级别的常见初学者错误,而不是库可以真正为您解决的问题。

您还没有分配myfunction作为一个单击处理程序,你调用myfunction,用参数1和参数作为参数,函数的返回值分配给onclickmyfunction不返回任何东西,所以你会被分配到undefinedonclick,这将没有任何效果..

你是什么意思是一个引用赋予myfunction本身:

myhandle.onclick= myfunction; 

要通过函数一些额外的参数,你必须做一个包含它们值的闭包,这通常是使用匿名内联函数完成的。它可以通过事件上太多,如果你需要(尽管无论哪种方式,你需要在事件对象不作为参数传递的IE备份计划)的护理:

myhandle.onclick= function(event) { 
    myfunction(param1, param2, event); 
}; 

在ECMAScript中第五版,这将是JavaScript的未来版本中,你甚至可以更轻松地写:(与window是用于this虚值,你就不会在这种情况下需要)

myhandle.onclick= myfunction.bind(window, param1, param2); 

然而,由于今天的许多浏览器都没有t支持第五版,如果你想使用这种方法,你必须为旧版浏览器提供一个实现。一些图书馆已经包括一个;这是另一个独立的。

if (!('bind' in Function.prototype)) { 
    Function.prototype.bind= function(owner) { 
     var that= this; 
     var args= Array.prototype.slice.call(arguments, 1); 
     return function() { 
      return that.apply(owner, 
       args.length===0? arguments : arguments.length===0? args : 
       args.concat(Array.prototype.slice.call(arguments, 0)) 
      ); 
     }; 
    }; 
} 
+0

非常感谢!这很好地解释了我。 – Rajat 2009-10-13 05:41:59