Page 35 - JavaScript修炼之道
P. 35
22 第二部分 DOM、事件及定时器
任务 10 将行为和自定义事件解耦
当你的代码库增长到一定的规模,或者你打算在一个完全不同的上下文复用部分代码时,你
可能就会碰到这样的情形:不管DOM是什么样子,我希望这段代码在这样的情况下被触发。
多数情况下,这个问题涉及微件(widget)间的交互。比如说,某些后台聊天轮询引擎会通
知聊天部件收到了新信息,或者当图片浏览窗中的某个图片被单击后,对应的图片浏览控件和预
载入图片放大控件均会被告知这个操作的发生。
这就是自定义事件的概念。根据你使用的框架不同,自定义事件的行为在某些方面会有所
差异。
类似DOM的行为:你在DOM节点(包括document对象)监听并触发自定义事件。这些事
件既可以冒泡,也可以被拦截。这正是Prototype、jQuery和MooTools所做的。如果事件不
能扩散,就必须在触发事件的对象上进行监听。
命名空间:一些框架需要你为你的事件指定命名空间,通常使用一个冒号前缀来把你的事
件和原生事件区分开来。 Prototype强制要求这种做法;其他框架则允许你按照你习惯的方
式命名自定义事件。
①
自定义额外数据 :JavaScript框架允许你在触发自定义事件时,向事件处理器传送额外的
数据。Prototype接受一个单独的额外参数(当然,这个参数里可以包含各种各样的内容),
以作为事件memo属性的内容。除了初始事件对象参数以外, jQuery可以向事件处理器传递
任意数量的额外参数。其余的框架会把这些参数在不加前缀的情况下传递给事件处理器。
Dojo需要把待传的参数放到一个数组里传递,即使参数只有一个也是如此。
通用事件API:只有Dojo保留了操作原生DOM事件的正常API,而操作自定义事件则需要
特殊的发布/订阅API。这也意味着Dojo中的自定义事件不具有DOM事件的一些行为(比
如冒泡)。
声明:我们往往需要在预定义的事件中加入一些特殊的变化(例如,需要Alt键按下才能
触发的单击事件),MooTools允许你定义此类自定义事件。此类事件需要预先声明,即便
你只是声明它们的名字。任何未声明的自定义事件都不会被触发。
——————————
① 原文为payload,在这里它指的是传给事件处理函数的额外数据。*