- 浏览: 407431 次
- 性别:
- 来自: 济南
最新评论
-
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 1260Flex读取XML: <mx:HTTPServic ... -
flex实现滑动显示隐藏效果
2010-12-30 15:30 1544鼠标划过的时候显示菜单栏 ,鼠标移开后隐藏菜单栏。比较常用 ... -
flex DataTimePicker时间控件
2010-12-27 11:54 1292两种DatatimePicker: 1.Datatim ... -
ActionScript 生成伪Guid
2010-12-24 09:52 1168在一个Flash制作的图片上传程序中(使用了FileRefer ... -
Flex中Image组件怎么才能非等比例拉伸图片
2010-12-23 15:49 1479Image组件怎么才能非等比例拉伸图片 设 ... -
Flex中Accordion用法
2010-12-23 11:45 3048<? xml version = & ... -
Flex(替代session过期)实现用户长时间不操作要求重新登录的处理
2010-12-23 11:08 1476flex(替代session过期)用户长时间不操作要求重新登录 ... -
ActionScript 3.0 Socket编程
2010-12-23 09:56 1137在使用ActionScript3.0进行编程 ... -
12个简单易用的flex函数
2010-12-21 10:10 10971.拷贝内容到剪贴板: ... -
Flex自定义控件——Pagebar分页控件
2010-12-20 09:41 5189开发时经常遇到用一个DataGrid分页显示 ... -
Flex资源,很全,很牛!
2010-12-20 09:30 14261、as3ebaylib http://code ... -
Flex 窗体 最大化、最小化实例
2010-12-20 09:28 2679---导入flexMdi.swc (http ... -
在Flex中复制文字到操作系统的剪贴板
2010-12-15 11:18 1201这个实例演示了怎么样使用System. ... -
Flex让Slider控件拖动时显示Tooltip
2010-12-14 16:10 1872格式化与自定义Slider中显示的Tooltip ... -
Flex给Alert加个Icon
2010-12-14 16:05 1257给Alert加个Icon 很简单只要先 Embed 一 ... -
在Flex中用Validator验证数字、字符串、Email、电话号码等
2010-12-14 09:54 4267mx.validators ... -
Flex中使用FileReference类下载文件
2010-12-14 09:47 1764下面的实例演示了Flex中的 File ... -
Flex使用ArrayCollection的filterFunction属性过滤DataGrid
2010-12-14 09:42 1767下面的实例演示了在Flex中怎样使用 ... -
Flex 树形控件(Tree )的使用
2010-12-13 16:24 3437一、树形控件的常用属性 1、dragMoveE ... -
FLEX3中应用CSS完全详解手册(下)
2010-12-13 11:40 845myTabs中的设置 cornerRadiusTab ...
相关推荐
程序缘 Flex AIR之旅-第六章 编写用户登录界面,用于学习借鉴的Flex Air的工程源码,导入flash builder4.6即可。已实现一般C/S结构展现界面的实现,如菜单、快捷工具栏、主窗口等。
程序缘 Flex AIR之旅-搭框架配套主程序,用于学习借鉴的Flex Air的工程源码,导入flash builder4.6即可。已实现一般C/S结构展现界面的实现,如菜单、快捷工具栏、主窗口等。
创 建过Java多语言本地化应用的朋友应该都很熟悉Java的本地化资源访问的功能,现在好了,Flex2诸多激动人心更新中的一个就是本地化特性 (localization feature),这倒是Adobe加强推广Flex2的一个强助力了(这一...
NULL 博文链接:https://guangqiang.iteye.com/blog/790325
今天我们要说的是官方文档中用了整章介绍的AdvancedDataGrid,AdvancedDataGrid是DataGrid的高级版本,Flex 3 SDK并不包含它,其和Charting Enhancements一起构成了Flex Data Visualization package,TNND,也就是说...
Flex项呈示器自定义及使用实例,展示用户信息,包括头像及等级信息。与博客Flex之旅--项呈示器ItemRenderer对应
网站开发非常之旅。flex从入门到精通,聂晓霞著,强峰科技
NULL 博文链接:https://xiaying-hefei.iteye.com/blog/734078
New Relic One 可观察性包为您的特定用例提供即时价值,从而快速开启您的 New Relic 之旅。 它们包括: 检测服务的明确步骤 可观察性构建块,如仪表板和警报 所有这一切都可以通过一个开放的生态系统获得,在这个...
HouseTourVR-React360:使用React360库的虚拟现实房屋之旅
开始Adobe AIR之旅 1.1 什么是Adobe AIR 1.2 安装AIR运行时及例程 1.3 设置开发环境 1.4 分发,安装和运行AIR应用程序 1.5 关于AIR的安全性 1.6 AIR文件结构 第二章. 设置Flex Builder 2.1 关于...
Go语法树入门-开启自制编程语言和编译器之旅! Go语言QQ群:102319854,1055927514 光谷码农课堂: ://study.163.com/provider/480000001914454/index.htm 凹语言(凹读音“ Wa”)(Wa编程语言): : 蚂蚁金服招聘...
无论您是刚刚开始Vim之旅还是已经有一段时间了,此入门套件都可以为您节省大量的配置时间,以将Vim设置为真正的编码环境。 每个软件包都包含所有预安装的插件,因此,一旦获得该项目的本地副本,就可以在没有...
居家旅行,画图必备: 1、包含了几乎所有常用的元器件封装以及3D模型 2、包含了STM32的F系列、L1...3、包含了Altera FPGA 的 Stratix系列、MAX系列、Cyclone系列、APEX系列、EPC、FLEX、Arria等系列的封装库以及3D模型
本指南旨在让你快速开始你的gSOAP开发之旅。阅读本节的内容,需要你对SOAP 1.1协议及C/C++语法有大体的了解。虽然使用gSOAP编译器可 以直接用C/C++开始编写web服务及客户端程序而不需要了解SOAP协议的细节,但是...
在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中...