如何将参数传递给事件处理程序

时间:2012-04-25 12:16:29

标签: javascript-events

如何将参数传递给事件的处理程序?

这是我想要做的,不起作用:

for (var i = 0; i < myobj.length; i++) {
myobj[i].onmouseover = myfun(myobj[i]);
}

以下两者都不起作用。

myobj[i].onmouseover = myfun.call(myobj[i]);
myobj[i].onmouseover = function () {myfun(myobj[i]);};
myobj[i].onmouseover = function () {myfun.call(myobj[i]);}; 

我主要关注它为什么不起作用,以及相同风格的解决方案。

感谢。

2 个答案:

答案 0 :(得分:9)

只需使用处理程序的创建者函数来封装要传递的参数。

function createHandler( param ) {
  return function() {
    myfun( param );
  }
}

for (var i = 0; i < myobj.length; i++) {
  myobj[i].onmouseover = createHandler( myobj[i] );
}

您的方法不起作用的原因是,因为您没有传递函数引用,而是函数调用的结果。因此,在您的第一个示例中,myfun( myobj[i] )被评估,结果将作为事件处理程序传递。

我认为,你的真正含义是,如果事件被触发,则应评估该功能。为此,您必须通过某些全局变量或dataset property传递参数。

然而,更清洁的解决方案是具有如上所示的生成器功能。

答案 1 :(得分:3)

另一种方法是使用onmouseover作为方法(不是函数)在触发事件的DOM元素上调用的事实。

换句话说,编写代码就好像您希望有人这样做:

obj = xahlees();
obj.onmouseover();

这是一个解决方案:

for (var i = 0; i < myobj.length; i++) {
  myobj[i].onmouseover = function() { myFun(this) };
}

我上传了more complete example