无法将事件传递给addEventListener:closure问题

时间:2012-01-03 15:24:24

标签: javascript events closures addeventlistener

这个让我疯狂......我有一个循环,它为SVG对象添加一个事件监听器。为了论证,对象是一个小圆圈,我必须为10个圆圈中的每一个添加mouseover和mouseout事件。

我的第一个问题是标准的闭包范围 - 因为所有的监听器都添加在同一个循环中,它们都看到了循环变量的相同无效值。我想,我可以解决这个问题,但第二个问题是我必须将“事件”传递给听众,而我找不到任何方法同时解决这两个问题。

我尝试了各种版本:

for(month = 0; month < nMonths; month++) {
   ...
   shape.addEventListener(
     "mouseover", 
     (function(event, index) { popup_on(event, foo, index); })(event, month),
     false);
   group.appendChild(shape);
}

这个特殊版本给我'事件未定义'。 popup_on是真正的处理程序,必须获得eventmonth的当前值。知道我应该怎么做吗?感谢。

1 个答案:

答案 0 :(得分:18)

事件将自动传递给您的函数 - 只需将其作为传递给addEventListener的函数的第一个参数。此外,false是捕获参数的默认值。

(function() {
    var i = month;
    shape.addEventListener("mouseover", function(e) { popup_on(e, foo, i); });
})();

另外,你可以在事件回调中关闭foo吗?如果没有,你可以用它做同样的事情

(function() {
    var i = month;
    var f = foo;
    shape.addEventListener("mouseover", function(e) { popup_on(e, f, i); });
})();

如果所有这些局部变量都变得烦人,你可以让它们参数化以使事情变得更加整洁

(function(i, f) {
    shape.addEventListener("mouseover", function(e) { popup_on(e, f, i); });
})(month, foo);