YUI事件体系之Y.EventTarget

上两篇文章YUI事件体系之Y.Do、YUI事件体系之Y.CustomEvent中,分别介绍了YUI实现AOP的Y.Do对象,以及建立自定义事件机制的Y.CustomEvent对象。
本篇文章,将要介绍YUI事件体系集大成者、最为精华的部分——Y.EventTarget。
Y.EventTarget
DOM事件中的目标元素为event.target,这类元素可以触发、监听一些事件,例如input元素的click、focus等事件。这也正是Y.EventTarget的命名渊源,它提供了一种让任意对象定义、监听、触发自定义事件的实现方式。
从设计上看,Y.EventTarget通过内部维护一系列Y.EventCustom对象,提供了可以通过事件名称进行事件定义、监听和触发的便捷接口。另外,推荐使用Y.augment将它以组合的方式加载在其它类上,而不要使用继承。关于Y.augment和Y.extend之间的异同,可以参考我之前的一篇文章:Y.extend与Y.augment。
YUI很多基础类都扩展了Y.EventTarget,重要的有Y(YUI instance,sandbox)、Y.Global、Y.Node、Y.NodeList、Y.Base等。
YUILibrary有专门一个章节介绍EventTarget,非常详尽,如果你对EventTarget的设计思路和使用方法感兴趣,请移步YUILibrary-EventTarget。
示例
首先,让我们看看Y.EventTarget独立调用的例子:
1 | // 例1 |
这种方式实际意义不大,YUI中只有Y.Global使用了这种方式。
下面,让我们看下最广泛的使用方式,即通过Y.augment扩展其它类:
1 | // 例2 |
源代码分析
接下来,让我们看看YUI的内部实现吧。
注:为了更容易的看懂代码的核心,我做了适当的简化,感兴趣的朋友可以去看未删节的源码。
1 | var AFTER_PREFIX = '~AFTER~'; |
进阶用法
Y.EventTarget作为一个十分重要的类,提供了非常丰富、方便的使用方式,除了依赖内部Y.CustomEvent实现的事件接口、默认执行方法、事件广播等,其余主要有:
a) 事件冒泡
多个EventTarget对象之间可以建立一定事件传播关系,类似DOM事件中的冒泡。
1 | // 例3 |
b) 事件前缀
在事件冒泡的基础上,考虑到区分不同EventTarget对象触发相同事件,YUI引入了事件前缀(Event Prefix)。
1 | // 例4 |
参考
Author: Chun Shang
Link: https://springuper.github.io/event-target/
License: 知识共享署名-非商业性使用 4.0 国际许可协议