Event.observe(element, eventName, handler[, useCapture = false])
在 DOM 元素上注册事件处理程序。
首先,如果你曾经使用过 HTML 事件属性(如 <body onload="return myFunction()">
)或 DOM Level-0 的事件属性(如 window.onload = myFunction;
),你一定要忘记那些糟糕的做法,然后了解 observe
是怎么做的。
对于那些相同的元素事件(element+event)组合,它并不会替换已经存在的事件处理程序,而是将新的处理程序增加到元素事件组合的 处理程序列表 中。使用 observe
再也不会影响到先前已有的事件处理程序调用了。
为注册函数作为事件处理程序,相关的 DOM 元素必须已经存在于 DOM 树中(换句话说,该元素必须出现在 HTML 源代码中,或者在注册事件处理程序的代码运行前,已动态的创建和插入到 DOM 中)。
假设有以下 (X)HTML 片断:
<form id="signinForm" method="post" action="/auth/signin">… </form>
下面的代码描述了如何在表单提交事件上注册函数 checkForm
:
Event.observe('signinForm', 'submit', checkForm);
当然,你会希望这行代码运行时,表单已存在于 DOM 中。但是在文档 <head> 以外的地方放置一对 <script> 标签实在有碍观瞻,因此请使用一种简单的方式来代替——在页面完全载入后再加载处理程序:
Event.observe(window, 'load', function() {
Event.observe('signinForm', 'submit', checkForm);
});
只增加了一点点封装…
注意,如果页面非常大,你可能希望在页面未完全载入前就运行这段代码(只需等待相应的 DOM 节点载入)。目前没有标准的事件支持这样做, 但是这篇文章指出了一些有用的方法。
this
引用的复杂情形当你的事件处理程序作为函数参数传递时,会失去事件处理函数的 绑定。也就是说,会失去原始的事件处理函数中 this
所指向的对象。如果你所传递的方法需要使用 this
引用(例如访问 this
所表示的容器对象中的字段),这会有一些麻烦。
为解决这个问题,Prototype 专门提供了一个 bindAsEventListener 方法, 如果你以前未曾见过,请查阅相关的文档。该方法的使用非常简单:
var Checks = {
// 我们的 'generic' 函数所需的一些信息
generic: function(event) {
// 表单校验逻辑(例如非空字段校验)
}
};
Event.observe('signinForm', 'submit', Checks.generic.bindAsEventListener(Checks));
stopObserving 和 unloadCache 方法。