7

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

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

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]);}; 

我主要对为什么它不起作用以及相同风格的解决方案感兴趣。

谢谢。

4

2 回答 2

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] )中进行评估,并将结果作为事件处理程序传递。

我认为,您真正的意思是,如果事件被触发,则应评估该函数。为此,您必须通过一些全局变量或作为数据集属性传递参数。

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

于 2012-04-25T12:18:50.600 回答
3

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

换句话说,编写你的代码,就好像你期望有人这样做:

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

这是一个解决方案:

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

我上传了一个更完整的例子

于 2012-04-25T13:24:49.337 回答