`
nianshi
  • 浏览: 416219 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Flex事件之旅

    博客分类:
  • Flex
阅读更多

Flex的“事件之旅”

信号灯的应用中,为什么在点击按钮 后,就会自动调用 myEventHandler方法呢?看官答道:“我们把myEventHandler作为事件侦听器注册到了容器ctnButtons上了!”没错,但 是为什么在容器上注册了侦听器,Flash Player就能够调用myEventHandler方法呢?Flash Player如何发现有这样一个侦听器?如果我们在其他的容器,比如ctnButtons的父容器traficLight上为同样的事件注册了侦听器,会 发生什么?Flash Player维护了一个侦听器队列吗?如果是这样的话,那队列中成员的顺序又如何呢?

其实并没有一个所谓的侦听器队列。但Flash Player确实维护了一个树状列表,即显示列表(详见第7章的7.1.1节“显示列表”(见第126页))。Flash Player创建事件对象,并调度该对象到事件流。事件流就是事件对象在显示列表中的“旅程”。

当 事件发生时(比如用户按下了按钮),Flash Player即创建Event对象,事件之旅也由此刻开始了。然而,事件之旅的起源地并不在“此地”,而是从显示列表的根节点 Stage(flash.display.Stage,一个特别的显示对象容器,显示列表的根节点)开始,然后沿着列表逐级向下,直到发生事件的对象。之 后,又按相反的方向逐级向上回到根节点。没错,事件之旅是个往返旅程。而且,需要强调的是,事件旅程并不包括从根节点Stage对象到发生事件的对象之间 的所有节点,而只涉及发生事件的对象本身和它的父容器。比如,信号灯应用中,Flash Player就不会检查lblLightInfo对象,因为它并不是三个按钮对象的父容器。在这段旅程中,Flash Player逐一检查这些对象是否针对发生的事件注册了侦听器,为事件对象赋值,并调用侦听器。

概念上,Flex的事件旅程分为三个阶段:捕获阶段、目标阶段和冒 泡阶段,如图6-2所示。既然事件之旅同显示列表密切相关,在旅程开始之前,我列出了信号灯应用的树状显示列表以供参考。同时标出了当用户按下“红色”按 钮时事件旅程的三个阶段。

图6-2  信号灯应用的显示列表和事件流

6.2.1  target和currentTarget

如 我们刚才提到的,在事件被触发后,Flash Player就会创建事件对象,并逐一检查“事件旅程”上的节点是否针对发生的事件注册了侦听器,为事件对象赋值,并调用侦听器。事件对象源自 flash.events.Event类。事件对象currentTarget属性的值会在事件流中改变,而target属性则不会变化。(关于事件对 象,我们将在6.3节(见第106页)深入讨论)由此,开发者能够通过currentTarget属性获知事件旅程现在停在了哪个节点上。

·      currentTarget属性:事件旅程中,currentTarget属性代表了Flash Player正在检查的节点对象。比如,当Flash Player遍历到ctnButtons对象,那么event.currentTarget就是ctnButtons对象。

·      target属性:target属性就是发生事件的对象。在信号灯应用中,event.target就是用户所点击的按钮对象,在事件旅程中,该属性的值 始终不变。信号灯应用中,侦听器myEventHandler利用event.target来获取被点击按钮上的标签数据。此时赋给 event.currentTarget属性的则是HBox容器对象ctnButtons。

6.2.2  捕获阶段

在 事件发生之 后,Flash Player将沿着显示列表,从根节点Stage开始遍历事件发生对象的所有父对象,这个阶段称之为“捕获阶段”。捕获阶段截止到发生事件对象的直接父对 象。在遍历的过程中,Flash Player会检查是否有节点注册了事件侦听器,并对生成的事件对象赋值,调用事件侦听器方法。

在信号灯应用中,在事件发 生后,Flash Player将顺序检测Stage、SystemManager、Application、traficLight、ctnButtons,至此为捕获阶 段。

需 要指出的是,在默认情况 下,容器们并不在捕获阶段“侦听”事件。信号灯的应用中,侦听器myEventHandler实际上是在冒泡阶段被调用的。当我们在ctnButtons 上注册侦听器时,默认设置了addEventListener方法的use_capture属性为“false”。如果你希望在捕获阶段调用侦听器,那么 要使用如下代码注册侦听器,见代码6-6:

代码6-6:在捕获阶段响应按钮事件

ctnButtons.addEventListener(MouseEvent.CLICK,myEventHandler,true);

通常情况下,开发者更习惯于 利用事件旅程的目标阶段和冒泡阶段处理事件响应。

6.2.3  目标阶段

目标阶段只涉及一个对象, 即发生事件的对象。在目标阶段,事件对象的target和currentTarget对象被赋予相同的值,也就是发生事件的对象。

在 信号灯应用中,如果用户 按下了红色按钮,那么在目标阶段,Flash Player将只检测btnRed对象。如果我们在btnRed按钮上注册侦听器方法(假设为redEventHandler(event Event)),则在目标阶段,系统会调用redEventHandler方法。在该方法中,如果检测event.target和 event.currentTarget属性,将会发现两者均指向btnRed按钮。

6.2.4  冒泡阶段

冒泡阶段与捕获阶段涉及的节点完全相同,但遍历顺序却恰好相反。在 Flash Player对发生事件对象检查完毕后,将从其直接父容器开始,沿着显示列表向上,最终返回到Stage根节点。

在信号灯的应用中,目标阶段结束后,Flash Player将依次检测ctnButtons、traficLight、Application、SystemManager,最终返回到Stage,此 为冒泡阶段,而事件之旅也告一段落。

6.2.5  信号灯应用的事件之旅

最后,通过代码再一次体验Flex的“事件之旅”。依然以信号灯的 应用为基础,经过改造的应用代码见代码6-7,新的项目名为EventJourney。

代码6-7: EventJourney项目代码

<mx:Script>

       <![CDATA[      

   import mx.controls.Alert;

   private function initApp():void {

       btnRed.addEventListener(MouseEvent.CLICK,myEventHandler);            

       traficLight.addEventListener(MouseEvent.CLICK,myEventHandler);

       ctnButtons.addEventListener(MouseEvent.CLICK,myEventHandler);

       lblLightInfo.addEventListener(MouseEvent.CLICK,myEventHandler);

       this.addEventListener(MouseEvent.CLICK,myEventHandler);

 

       //在捕获阶段调用EventListener

        btnRed.addEventListener(MouseEvent.CLICK,myEventHandler,true);

       traficLight.addEventListener(MouseEvent.CLICK,myEventHandler,true);

       ctnButtons.addEventListener(MouseEvent.CLICK,myEventHandler,true);

       lblLightInfo.addEventListener(MouseEvent.CLICK,myEventHandler,true);

       this.addEventListener(MouseEvent.CLICK,myEventHandler,true);              

   }

   private function myEventHandler(event:Event):void {

       trace(event.currentTarget.toString() + " 在事件阶段" + event.eventPhase);

   }

]]>

</mx:Script>

在 initApp()方法中,我们为btnRed、 traficLight、ctnButtons、lblLightInfo和Application本身(通过this)分两次注册了同一个侦听器 myEventHandler。第二次注册中,我们设置use_capture参数为true。

在myEventHandler中使用trace方法输出了侦听器 被调用时的当前节点对象和事件所在阶段。事件属性event.eventPhase标志着当前所处事件旅程的阶段。返回值为unit类型,包含了代表着三 个阶段的numeric值。分别为:

·      捕获阶段:EventPhase.CAPTURING_PHASE=1;

·      目标阶段:EventPhase.AT_TARGET=2;

·      冒泡阶段:EventPhase.BUBBLING_PHASE=3。

在按下红色按钮后,输出结果如代码6-8所示。

代码6-8: EventJourney项目代码输出结果

EventJourney0 在事件阶段1

EventJourney0.traficLight 在事件阶段1

EventJourney0.traficLight.ctnButtons 在事件阶段1

EventJourney0.traficLight.ctnButtons.btnRed 在事件阶段2

EventJourney0.traficLight.ctnButtons 在事件阶段3

EventJourney0.traficLight 在事件阶段3

EventJourney0 在事件阶段3

关于结果的说明:

·      尽管我们为btnRed按钮注册了两次侦听器,但是由于Flash Player只在目标阶段检查该按钮,因此侦听器只在目标阶段被调用一次;

·      尽管我们为lblLightInfo标签也注册了侦听器,但由于该对象并不在事件旅程覆盖的节点中,因此不会产生任何输出。

分享到:
评论

相关推荐

    Flex Cairngorm之旅(小项目实例)

    Flex Cairngorm之旅,这是一次深入探讨Adobe Flex框架Cairngorm的实践教程,旨在通过一个小项目的实例来展示Cairngorm如何在实际开发中发挥作用。Cairngorm是面向服务架构(SOA)的轻量级MVC(Model-View-Controller...

    Flex AIR之旅--第六章 编写用户登录界面

    程序缘 Flex AIR之旅-第六章 编写用户登录界面,用于学习借鉴的Flex Air的工程源码,导入flash builder4.6即可。已实现一般C/S结构展现界面的实现,如菜单、快捷工具栏、主窗口等。

    程序缘 Flex AIR之旅-搭框架配套主程序

    程序缘 Flex AIR之旅-搭框架配套主程序,用于学习借鉴的Flex Air的工程源码,导入flash builder4.6即可。已实现一般C/S结构展现界面的实现,如菜单、快捷工具栏、主窗口等。

    Flex 3 发现之旅

    在Flex 3中,开发者们可以体验到一系列新特性,其中AdvancedDataGrid是一个引人注目的组件,它是DataGrid的增强版。AdvancedDataGrid并非包含在标准的Flex 3 SDK中,因为它与Charting Enhancements一起构成了Flex ...

    flex学习笔记 flex学习总结 flex学习教程

    Flex是Adobe公司推出的一种用于构建富互联网应用程序(RIA)的技术,它基于ActionScript编程语言和Flex框架,可以创建交互性强、用户体验优秀的...通过阅读这些材料,你将能够逐步掌握Flex开发技术,踏上Flex开发之旅。

    Flex技术入门之如何创建flex的web工程

    【Flex技术入门:创建Web工程详解】 Flex技术是Adobe公司为了解决Flash开发难题而推出的一种专门面向程序开发人员的...在开始Flex开发之旅之前,了解其优缺点和创建Web工程的基本流程,将有助于你更好地掌握这项技术。

    Flex简介Flex简介Flex简介Flex简介

    Flex是Adobe公司推出的一种用于构建富互联网应用(Rich ...对于初学者,按照官方文档或教程逐步配置即可开始Flex开发之旅。总的来说,Flex为开发者提供了一个强大的工具集,使得创建富互联网应用变得更加容易和高效。

    flex4 学习全部资料

    安装完成后,你可以创建新的Flex项目,选择Flex SDK版本,开始你的编程之旅。 二、Flex4 API Flex4 API是Flex4开发的核心,它包含了大量的类库和组件,如Spark和MX组件集,以及ActionScript3的类库。Spark组件提供...

    flex教程,flex基础教程,其中有些程序的编写

    Flex教程详解:初识Flex与基础应用 Flex是由Adobe公司开发的一种开源框架,主要用于构建富互联网应用程序(RIA,Rich Internet Applications)。它结合了MXML和ActionScript两种语言,...加油,Flex学习之旅就此启程!

    《Flex完全自学手册》源码+电子教案(PPT)

    《Flex完全自学手册》是一本深入探讨Adobe Flex技术的专业书籍,该书的源码和电子教案(PPT)提供了一套全面的学习资源,旨在帮助...无论你是初学者还是有经验的开发者,这套资源都将为你的Flex之旅提供坚实的支撑。

    flex基础教程 富客户端技术

    Flex基础教程:富客户端技术详解 Flex是一种强大的富互联网应用程序(RIA)开发框架,由Adobe公司推出,专门用于创建交互式、动态的Web应用程序。...开始你的Flex之旅,探索这个强大工具的无限可能吧!

    Flex 帮助教程中文版

    Flex是Adobe公司开发的一种开源框架,主要用于构建富互联网应用程序(RIA),它基于ActionScript和MXML,能够创建具有丰富用户体验的交互式应用。...希望这个中文版的Flex帮助教程能为你的Flex开发之旅打下坚实的基础。

    python语言web之旅(python, mod_python, pyamf, flex, apache)

    在Python世界里,Web开发是一项重要的任务,而“python语言web之旅”则是一个关于如何使用Python构建Web应用程序的探讨。这个话题涵盖了多个关键组件和技术,包括Python语言本身、mod_python模块、PyAMF库、Flex前端...

    FLEX helloworld实例源码

    Flex是Adobe公司开发的一种开源框架,主要用于构建富互联网应用程序(RIA)。它基于ActionScript和MXML,提供了丰富的用户界面...希望这个实例能帮助你开启Flex开发之旅,也鼓励你和其他开发者共享你的学习资源和成果。

    flex中文帮助文档

    Flex是Adobe公司开发的一种用于创建富互联网应用程序(RIA)的框架,主要基于ActionScript和MXML。...通过阅读这个“Flex中文帮助文档”,你可以逐步了解并掌握这些关键知识点,为你的Flex开发之旅打下坚实基础。

    搭建flex测试站点 可以好好看看啊

    通过以上步骤,你已经成功搭建了一个Flex测试站点,可以开始你的Flex应用程序开发之旅。记得定期更新软件以保持最佳性能和安全性。在开发过程中,遇到问题可以查阅官方文档或社区论坛,那里有丰富的资源和经验分享。

Global site tag (gtag.js) - Google Analytics