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,在这里它指的是传给事件处理函数的额外数据。*
   30   31   32   33   34   35   36   37   38   39   40