mini-event
mini-event是一个简单的工具库,用于为任何系统提供事件相关的功能集,包括:
- 统一的
Event
事件对象。 - 事件的阻止默认行为(
preventDefault
)、停止冒泡(stopPropagation
)、阻止后续处理(stopImmediatePropagation
)功能。 - 事件的注册、反注册等功能。
- 带命名空间的子事件功能。
- 基于DOM事件的包装和行为控制功能。
文档
cd {mini-event}
sudo gem install jsduck
jsduck --config=jsduck/config.json
open doc/index.html
事件类型
在mini-event模型中,事件共分为3类。
命名事件
命名事件是最普通的事件,指一个带有名字的事件。当使用.fire(eventName)
方法触发事件时,其中的eventName
指定事件名称,对应名称符合的命名事件将被触发。
全局事件
全局事件是名称为*
的事件,当任何事件被触发时,全局事件均会被触发。
开发者不能直接触发全局事件,使用.fire('*')
触发全局事件将会得到异常结果。
全局事件一定在命名事件均触发完毕后触发。
全局事件触发时,事件对象的type
属性值为事件的原始名称,而非*
。
事件处理函数
不同类型的事件按以下顺序执行:
- 依次触发所有命名事件处理函数。
- 依次触发所有全局事件处理函数。
以上2步中,每一步对应的所有事件处理函数的执行有如下特征:
- 触发顺序与事件被注册的顺序相同。
- 同一个事件处理函数仅会被触发一次。
- 在事件触发过程中,如果一个处理函数A移除了同一事件的另一个处理函数B,且B还未触发,则该处理函数不会在本次触发中被执行。
- 如果调用事件对象的
.stopImmediatePropagation()
方法,则后续的处理函数均不会被执行。
当一个命名事件触发时,如果处理函数A在执行时移除了全局事件中的处理函数B,则由于B还未被执行,因此后续的全局事件中的处理函数B将不会再被执行。
如果一个事件在命名事件触发时被执行,则其在全局事件被触发时依旧可能被执行。命名事件与全局事件不存在去重的关系。