本文和大家重点讨论一下Flex事件机制,Flex事件执行流程大致可以分为三个阶段,下面为你一一介绍。
Flex事件机制
Flex事件执行流程大致可以分为三个阶段。
第一阶段为捕获阶段
第二阶段为目标阶段
第三阶段为冒泡阶段
所以:addEventListener方法注册的监听器有两种,第一种是处理捕获阶段的监听器(addEventListener的第三个参数useCapture 为true)
第二种就是处理目标和冒泡阶段的监听器(第三个参数useCapture 为false)。
第一阶段:捕获阶段流程
Flex会去查找事件的触发源,它是通过根显示元素(root display object)逐层向下寻踪,并从上往下,依次触发这些节点的当前Flex事件的处理函数(如果他们都用捕获阶段的监听器注册了这个事件)直到找到事件发起源头的父节点。并触发完父节点的这个事件为止。但它不会调用事件触发源节点的事件。
例如:
test.mxml文件下:
application节点--vbox(id=vb)节点--button(id=bt)节点。
如果在application的creationComplete中:将以上所有组件的click事件注册为捕获监听器。
如:
- addEventListener(MouseEvent.CLICK, btnClick2, true);
- vb.addEventListener(MouseEvent.CLICK, btnClick3,true);
- bt.addEventListener(MouseEvent.CLICK, btnClick4,true);
如果在bt上点击,执行流程如下:
Flash Player会去查找Flex事件的触发源(bt),通过根显示元素(root display object)(这里就是application)逐层向下寻踪,并从上往下,依次调用它们的click事件(如果他们都注册了捕获阶段的click事件)直到找到事件的发起源头的父节点,上面例子中会找到vb,并执行完vb的click事件后,就不再查找下边的bt组件和执行它的click事件。
第二阶段:
一般情况下,第二阶段的目标阶段,也是执行mxml文档的目标节点配置的那个事件处理函数,然后再处理对应的监听器(处理目标和冒泡阶段的监听器)注册的那个处理函数。
如果文档该节点,没有配置Flex事件处理,则只执行通过addEventListener注册的事件处理方法,否则,如果配置了,就先执行mxml的配置函数处理,接着处理通过监听器注册的函数。
最后就是冒泡阶段:
这个阶段与捕获阶段相反,它会从从目标节点的父节点开始依次向上查找并执行父节点的mxml配置事件和通过监听器注册的事件处理函数。(这些处理函数也是用处理目标和冒泡阶段的监听器注册的)
也就是说:捕获阶段的事件触发只能是用处理这个阶段的监听器去注册。目标和冒泡阶段的事件触发,也只能是处理这个阶段的监听器去注册。如果,要让同一个事件,在捕获阶段或目标和冒泡阶段都执行的话,需要用addEventListener注册两次,将第三个参数useCapture true和false各设置一次。
【编辑推荐】
- Flex事件处理三要素
- 从Flex Builder更名看Flash平台战略
- Flex及FlexBuilder2.0开发环境详解
- FlexBuilder3.0与Eclipse3.4的完美结合
- 学习笔记 FlexBuilder2.0中如何使用基于Lists的控件