Event
♪ 令人惊叹的混乱 ♫
对于编写跨浏览器的脚本而言,事件管理是一个让人头痛的地方。
确实,一个异常明显的问题是:所有的人都遵循 W3C 的规范,而 MSIE 却另起炉灶。但是另外还有许多遍布各处的诡异的问题,
一不小心就会让你掉入陷井,例如基于 KHTML 的浏览器(Konqueror 和 Safari)的 keypress
/keydown
事件。当然,也别忘了 MSIE 处理废弃的事件句柄时导致的内存泄漏问题。
Prototype 的补救!
当然,Prototype 很好的解决了这个问题,你甚至不会觉察到这些问题的存在。在 Event
命名空间中,包含了许多方法
(已在这个页面中列出)。所有的方法都具有一个用于表示当前事件对象的参数,它以非常友好的方式提供你所需要的信息,
并且跨越了所有主要的浏览器。
Event
同时提供了一个标准的键盘代码表,可以用在与键盘相关的事件中。在这个命名空间中,定义了以下一些常量:
KEY_BACKSPACE
, KEY_TAB
, KEY_RETURN
, KEY_ESC
,
KEY_LEFT
, KEY_UP
, KEY_RIGHT
, KEY_DOWN
,
KEY_DELETE
, KEY_HOME
, KEY_END
, KEY_PAGEUP
,
KEY_PAGEDOWN
。这些常量名称都具有自我描述的特性。
下面这些函数经常会用到: observe、element 和 stop。至于其它的,将取决于你的应用。
事件对象的实例方法1.6
在 Prototype 1.6 中,所有 Event
对象的方法也可以作为事件对象自身的实例方法使用:
以前的版本
$('foo').observe('click', respondToClick);
function respondToClick(event) {
var element = Event.element(event);
element.addClassName('active');
}
现在的版本
$('foo').observe('click', respondToClick);
function respondToClick(event) {
var element = event.element(); //注意这一句的区别
element.addClassName('active');
}
Event
包含的方法已通过 Event.extend 增加到事件对象作为实例方法,这跟
Element
通过 Element.extend 将其所包含的方法添加到 DOM 节点是一样的。
在使用 Event.observe 方法注册事件处理程序时,Prototype 会自动扩展事件对象(
译注:调用 Event.extend
方法)。如果想采用不同的方法来加载事件处理程序,那你必须手动调用
Event.extend
来扩展事件对象。
方法
element
Event.element(event) -> Element
返回触发事件的 DOM 元素。
extend1.6
Event.extend(event)
用 Event.Methods
包含的所有方法来扩展 event
。
findElement
Event.findElement(event, tagName) -> Element
从触发事件的 DOM 元素开始(包含该元素),由里而外搜索第一个具有指定标签名称的 DOM 元素。
isLeftClick
Event.isLeftClick(event) -> Boolean
判断鼠标相关的事件是否是由“左键”(主功能键)引发的。
observe
Event.observe(element, eventName, handler[, useCapture = false])
在 DOM 元素上注册事件处理程序。
pointerX
Event.pointerX(event) -> Number
返回鼠标事件发生时鼠标所在的绝对水平位置。
pointerY
Event.pointerY(event) -> Number
返回鼠标事件发生时鼠标所在的绝对垂直位置。
stop
Event.stop(event)
停止事件的传播,并阻止事件被触发后最终的默认行为。
stopObserving
Event.stopObserving(element, eventName, handler[, useCapture = false])
注销事件处理程序。
unloadCache1.6
Event.unloadCache()
注销所有通过 observe 方法注册的事件处理程序。从 1.6 版开始该方法不再可用。