- 浏览: 416219 次
- 性别:
- 来自: 济南
最新评论
-
nianshi:
slideDown就是show的滑动效果版本, slideUp ...
Jquery零碎代码收藏 -
nianshi:
以后编写JS代码,少写<div onclick=&quo ...
Jquery零碎代码收藏 -
nianshi:
获取匹配元素相对父元素的偏移var p = $("p ...
Jquery零碎代码收藏 -
nianshi:
获取匹配元素在当前窗口的相对偏移var p = $(" ...
Jquery零碎代码收藏 -
wuchu:
谢谢
Flex 读取XML配置文件总结
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小记录
2011-02-24 10:18 1287Flex读取XML: <mx:HTTPServic ... -
flex实现滑动显示隐藏效果
2010-12-30 15:30 1591鼠标划过的时候显示菜单栏 ,鼠标移开后隐藏菜单栏。比较常用 ... -
flex DataTimePicker时间控件
2010-12-27 11:54 1311两种DatatimePicker: 1.Datatim ... -
ActionScript 生成伪Guid
2010-12-24 09:52 1201在一个Flash制作的图片上传程序中(使用了FileRefer ... -
Flex中Image组件怎么才能非等比例拉伸图片
2010-12-23 15:49 1504Image组件怎么才能非等比例拉伸图片 设 ... -
Flex中Accordion用法
2010-12-23 11:45 3076<? xml version = & ... -
Flex(替代session过期)实现用户长时间不操作要求重新登录的处理
2010-12-23 11:08 1499flex(替代session过期)用户长时间不操作要求重新登录 ... -
ActionScript 3.0 Socket编程
2010-12-23 09:56 1168在使用ActionScript3.0进行编程 ... -
12个简单易用的flex函数
2010-12-21 10:10 11311.拷贝内容到剪贴板: ... -
Flex自定义控件——Pagebar分页控件
2010-12-20 09:41 5255开发时经常遇到用一个DataGrid分页显示 ... -
Flex资源,很全,很牛!
2010-12-20 09:30 14571、as3ebaylib http://code ... -
Flex 窗体 最大化、最小化实例
2010-12-20 09:28 2709---导入flexMdi.swc (http ... -
在Flex中复制文字到操作系统的剪贴板
2010-12-15 11:18 1232这个实例演示了怎么样使用System. ... -
Flex让Slider控件拖动时显示Tooltip
2010-12-14 16:10 1903格式化与自定义Slider中显示的Tooltip ... -
Flex给Alert加个Icon
2010-12-14 16:05 1278给Alert加个Icon 很简单只要先 Embed 一 ... -
在Flex中用Validator验证数字、字符串、Email、电话号码等
2010-12-14 09:54 4310mx.validators ... -
Flex中使用FileReference类下载文件
2010-12-14 09:47 1790下面的实例演示了Flex中的 File ... -
Flex使用ArrayCollection的filterFunction属性过滤DataGrid
2010-12-14 09:42 1793下面的实例演示了在Flex中怎样使用 ... -
Flex 树形控件(Tree )的使用
2010-12-13 16:24 3470一、树形控件的常用属性 1、dragMoveE ... -
FLEX3中应用CSS完全详解手册(下)
2010-12-13 11:40 877myTabs中的设置 cornerRadiusTab ...
相关推荐
Flex Cairngorm之旅,这是一次深入探讨Adobe Flex框架Cairngorm的实践教程,旨在通过一个小项目的实例来展示Cairngorm如何在实际开发中发挥作用。Cairngorm是面向服务架构(SOA)的轻量级MVC(Model-View-Controller...
程序缘 Flex AIR之旅-第六章 编写用户登录界面,用于学习借鉴的Flex Air的工程源码,导入flash builder4.6即可。已实现一般C/S结构展现界面的实现,如菜单、快捷工具栏、主窗口等。
程序缘 Flex AIR之旅-搭框架配套主程序,用于学习借鉴的Flex Air的工程源码,导入flash builder4.6即可。已实现一般C/S结构展现界面的实现,如菜单、快捷工具栏、主窗口等。
在Flex 3中,开发者们可以体验到一系列新特性,其中AdvancedDataGrid是一个引人注目的组件,它是DataGrid的增强版。AdvancedDataGrid并非包含在标准的Flex 3 SDK中,因为它与Charting Enhancements一起构成了Flex ...
Flex是Adobe公司推出的一种用于构建富互联网应用程序(RIA)的技术,它基于ActionScript编程语言和Flex框架,可以创建交互性强、用户体验优秀的...通过阅读这些材料,你将能够逐步掌握Flex开发技术,踏上Flex开发之旅。
【Flex技术入门:创建Web工程详解】 Flex技术是Adobe公司为了解决Flash开发难题而推出的一种专门面向程序开发人员的...在开始Flex开发之旅之前,了解其优缺点和创建Web工程的基本流程,将有助于你更好地掌握这项技术。
Flex是Adobe公司推出的一种用于构建富互联网应用(Rich ...对于初学者,按照官方文档或教程逐步配置即可开始Flex开发之旅。总的来说,Flex为开发者提供了一个强大的工具集,使得创建富互联网应用变得更加容易和高效。
安装完成后,你可以创建新的Flex项目,选择Flex SDK版本,开始你的编程之旅。 二、Flex4 API Flex4 API是Flex4开发的核心,它包含了大量的类库和组件,如Spark和MX组件集,以及ActionScript3的类库。Spark组件提供...
Flex教程详解:初识Flex与基础应用 Flex是由Adobe公司开发的一种开源框架,主要用于构建富互联网应用程序(RIA,Rich Internet Applications)。它结合了MXML和ActionScript两种语言,...加油,Flex学习之旅就此启程!
《Flex完全自学手册》是一本深入探讨Adobe Flex技术的专业书籍,该书的源码和电子教案(PPT)提供了一套全面的学习资源,旨在帮助...无论你是初学者还是有经验的开发者,这套资源都将为你的Flex之旅提供坚实的支撑。
Flex基础教程:富客户端技术详解 Flex是一种强大的富互联网应用程序(RIA)开发框架,由Adobe公司推出,专门用于创建交互式、动态的Web应用程序。...开始你的Flex之旅,探索这个强大工具的无限可能吧!
Flex是Adobe公司开发的一种开源框架,主要用于构建富互联网应用程序(RIA),它基于ActionScript和MXML,能够创建具有丰富用户体验的交互式应用。...希望这个中文版的Flex帮助教程能为你的Flex开发之旅打下坚实的基础。
在Python世界里,Web开发是一项重要的任务,而“python语言web之旅”则是一个关于如何使用Python构建Web应用程序的探讨。这个话题涵盖了多个关键组件和技术,包括Python语言本身、mod_python模块、PyAMF库、Flex前端...
Flex是Adobe公司开发的一种开源框架,主要用于构建富互联网应用程序(RIA)。它基于ActionScript和MXML,提供了丰富的用户界面...希望这个实例能帮助你开启Flex开发之旅,也鼓励你和其他开发者共享你的学习资源和成果。
Flex是Adobe公司开发的一种用于创建富互联网应用程序(RIA)的框架,主要基于ActionScript和MXML。...通过阅读这个“Flex中文帮助文档”,你可以逐步了解并掌握这些关键知识点,为你的Flex开发之旅打下坚实基础。
通过以上步骤,你已经成功搭建了一个Flex测试站点,可以开始你的Flex应用程序开发之旅。记得定期更新软件以保持最佳性能和安全性。在开发过程中,遇到问题可以查阅官方文档或社区论坛,那里有丰富的资源和经验分享。