如果转载本文,请注明出处!
从这个类的命名上就可已看出,这是一个接收站,是事件的目的地。注意,我并未说EventTarget是事件的终点。事件的本质是信息,事件的作用是交流。一个事件的生命周期是如何的呢?
- 创建交流通道。这个步骤有两个工作必须完成。第一个工作是约定信息的格式,第二个是设立地址。
- 发送方对信息进行编码、把信息转换成事件。
- 信息发送到目的地。
- 接收放对事件进行解码、把事件还原程信息。
前文使用人类语言描述了事件的生命周期,下文将人类语言转换为计算机语言。
- 设计、实现Event的子类XXXEvent;设计、实现EventTarget子类XXXEventTarget。
- 创建XXXEvent类型的对象。
- 将XXXEvent类型的对象存入EventQueue中。
- XXXEventTarget使用监听器处理事件。
EventTarget在步骤1中提供了注册监听器的接口。从事件目的地角度来看,只要有监听器,就可以正确地把事件翻译成信息。EventTarget在步骤4中提供了获取监听器的接口。因此,EventTarget的主要功能就是记录监听器。
个人觉得已经将EventTarget的功能说明白了。下面看一下EventTarget的具体功能。
- 维护了引用计数。可以使用ref来增加引用计数,使用deref来减少引用计数。
- 使用InterfaceName获得名称,常见的名称有"Node", "DOMApplicationCache"等。一般与w3c标准中定义的相同。具体的可以查看动态生成的EventTargetInterfaces.h文件。
- 使用toNode方法,将EventTarget对象转换为Node对象。如果此EventTarget对象并非Node对象,那么返回值为0。
- 使用toDOMWindow方法,将EventTarget对象转换为DOMWindow对象。如果此EventTarget对象并非DOMWindow对象,那么返回值为0。
- 使用addEventListener、removeEventListener、removeAllEventListeners管理监听器。
- 使用setAttributeEventListener、clearAttributeEventListener、getAttributeEventListener管理属性事件监听器。属性事件没有capture状态。
- 判断是否有监听器。
- 使用dispatchEvent来分发事件。这个分发是指将事件传递给AT_TARGET监听器