是的,您可以通过这种方式将函数实例分配给事件处理程序:
table.rows[i].onmouseout = function() { ... };
在循环中这样做时要小心,因为您在每个循环上都创建了一个新函数,并且该函数会关闭范围内的数据(因此对它有一个持久引用,而不是副本函数创建时的数据;更多信息请参见this other recent question)。不过不用担心,closures are not complicated 一旦您了解了它们的工作原理。
通常,这称为“DOM0”事件处理,因为它涉及附加事件处理程序的方法,该方法是在第一个 DOM 规范之前创建的。从 DOM2 开始,有更好的方法addEventListener:
table.rows[i].addEventListener('mouseout',function() { ... }, false);
它“更好”,因为您可以在同一元素的同一事件上拥有多个事件处理程序,而使用 DOM0 机制,分配一个新的事件处理程序会断开前一个事件处理程序(如果有的话)。
遗憾的是,在 IE9 之前的 IE 上,addEventListener 不受支持,但它确实具有 非常相似 attachEvent:
table.rows[i].attachEvent('onmouseout',function() { ... });
注意区别:
-
addEventListener 的事件名称没有“on”前缀
-
addEventListener 比 attachEvent 多一个参数,你几乎总是想设置 false
更新:
上面所有的例子都是针对内联匿名函数的,这有点不像我,因为I don't like anonymous functions。因此,为了清楚起见,从事件的角度来看,函数就是函数。它可以是你在别处声明的命名函数,也可以是内联匿名函数,随便什么:
// Hook up...
table.rows[i].addEventListener('mouseout', handleRowMouseOut, false);
// Nice, reusable function defined elsewhere
function handleRowMouseOut(event) {
// ...
}
题外话:正是这些浏览器差异导致我一般建议使用jQuery、Prototype、YUI、Closure 或any of several others 之类的库.它们为您消除差异,并提供许多方便的实用功能。