原问题:事件机制有三个步骤,捕获,目标和冒泡。请问,在目标阶段都已经执行了需要执行的函数,为什么还要冒泡呢?
回答:
以前以
经说过很多次了,如果在as2中,事件模式是实时拦截的,意思简述就是一个影片剪辑包裹一个按钮的时候,对按钮和影片剪辑同时侦听处理的话,影片剪辑事件
会优先于按钮被截获执行,而令到内层的按钮代码失效,所以在as2中会用到很多非as资深程序员头痛的小技巧!!! 手机发表 分段发吧
所以在as3中对事件架构做了一个很大的调整,基本上完全放弃as2的事件处理方式,所有显示对象均继承自displayObjectO类,而此类又继承自EventDispatcher,意味着所有的显示对象均天生拥有了事件派发的能力
说了这么多,其实as3中的 特色 事件流机制 是 与 显示列表 相辅相承的,对以上两点有良好的理解是 合理运用事件流机制的前提
测试过了一下,证实整个显示列表是严格按照容器的方式进行事件流的
?
回到第一点,as2是实时拦截的,而as3就是走了三个阶段,捕获,目标,冒泡
具体 意义其实就是为了令整个事件流过程中的各环节都能对事件进行消费
比如 一个鼠标事件发生在 一个 MC包裹一个按钮 按钮里有文字的情况下
首先肯定是捕获MC的了,然后向内层走捕获到 按钮,因为按钮simpleButton是属于非容器对象,看上面类图,所以事件流目标节点就是它了,这时是目标阶段(到达最底一层目标),然后再到冒泡阶段,沿着捕获阶段记录的节点一级一级向上访问
这时你可能要问了,为什么不直接捕获阶段一走向下走就OK呢, 这是因为盒子模式,事件应该是由最内层的盒子派发出来的,但要进入到内层盒子,就肯定要先一层层经过包裹层的遍历,才能到达目标,然后才在冒泡阶段中,令到各节点进行事件的消费
为什么要各事件进行消费啊?
这里举个例子,比如你做一个 TitleWindow ,对话框影片剪辑,按以前的做法肯定就是? 在关闭按钮上写
parent.visible = false;
但站在面向对象编程的角度来说,这个应该在对话框的绑定类文中侦听? MouseEvent.CLICK事件,
然后关闭按钮根本就不用添加任何代码,因为事件存在冒泡,当按钮被点击的时候,冒泡事件过程中,因为上层包裹(对话框)对此事件侦听了,所以会响应
冒泡事件的基本作用其中一个就是这种,令到沿途各节点自身处理自己的业务,反正事件流就是
负责通知?
对对应事件进行侦听的节点
通知它 所侦听的事件发生了,让它做对应的操作处理罢了
意味着所有的显示对象均天生拥有了事件派发的能力
这句是说,所有显示对象都会默认响应触发鼠标事件 键盘事件 等等等等? 底层管理的交互行为事件,不用用户手动派发事件