1. AS3中的事件为什么要分三个阶段,即捕获、目标、冒泡。
这要从FLEX使用的脚本语言ActionScript3的老大哥Javascript说起,熟悉Javascript的朋友都知道在DOM中完整的事件生命周期包括捕获、目标与冒泡三个阶段。
事件的处理过程将从事件目标所在DOM层次的根节点开始,而不是从派发事件的目标开始,并且最终会回到根节点。
捕获阶段:事件从目标所在DOM树的根节点依次往下层传递,一直到目标节点之前的过程。在这个过程中,事件将会被从根节点到事件目标之前的所有父节点对象所捕获。如果事件在被注册时设置了useCapture属性为true,那么它会被这期间的所有注册了该事件的父元素对象依次派发。
目标阶段:事件到达目标元素。目标元素如果注册了该事件并且设置了useCapture属性为false,则目标会派发该事件。
冒泡阶段:事件到达目标元素后会接着通过DOM节点向上层父节点冒泡,并最终回到目标所在DOM树的根节点的过程。在这个过程中如果事件是可冒泡事件(最典型的例子就是click事件)并且在被注册时设置了useCapture属性为false,那么它会被这期间的所有注册了该事件的父元素对象派发。
AS3也采用这套机制。上图就是Adobe官方文档中的插图。真个AS3事件的生命周期与DOM对象上JS事件的生命周期完全相同。
我认为这套机制这样最大的好处就是可以减少了同一个UI树上对象监听器数量,从而带来性能优化。
举个简单而常见的例子:
canvas上有n个button,如果给每个button注册一个click事件,那么内存中就需要维护n个listener。由于click事件是可冒泡事件,那么更好的解决办法就是给canvas注册一个click事件,即
canvas.addEventListener(MouseEvent.CLICK, onMouseClickHandler);
|
调通过事件的冒泡阶段由n个button共同的父元素canvas来派发click事件,并且可以通过事件参数的target属性来决定调用哪个button对应的处理函数。这样做的的好处就可以只注册一个事件监听从而代替为n个button注册n个事件。
2.target和currentTarget究竟谁是事件的派发者?
target:事件指向的目标,但并非事件的派发者。 在一个事件整个生命周期中所有被派发的事件处理函数内部的target对象是一样的,每个被监听者派发的事件处理函数中的target一定都是同一个对象。
currentTarget:事件的派发者。调用注册在事件上的回调函数的那个对象,简单的说就是派发事件的对象。
3.useCapture到底有何用?
首先看看AS3中为IEventDispatcher类型对象注册事件监听的接口(完全符合W3C标准)
addEventListener(type:String, listener:Function, useCapture:Boolean = false , priority:int = 0, useWeakReference:Boolean = false ):void
|
最显而易见的用处,如果没有这个参数,那么走完事件的生命周期,所有目标父节点上注册的事件都会被执行两次(捕获阶段一次+冒泡阶段一次)!也正因为有useCapture这个参数,整个事件机制的运作才有了分支,或者更说是被分成两个独立部分。
拿上面“n个button的例子”来说,如果用户点击某一个button将会触发click事件,首先我们来看下整个click事件的生命周期中将会经历的UI对象:
stage → canvas → button → canvas → stage
然后我们再看分析一下事件流的三个阶段。
首先是捕获阶段:
事件从该button所处显示对象树的根出发,也就是stage,stage上未注册click事件,不会做出任何响应。然后来到stage的子节点即canvas,注意我们在canvas上注册了click事件,而此时click事件不会被派发,因为例子中我们注册的click事件使用的是默认的useCapture=false参数,即click事件必须在目标和冒泡阶段才能被派发。
然后进入目标阶段:
尽管目标是button,但由于其并未注册任何click事件监听所以也不作出任何响应。
由于click事件是可冒泡事件,所以最后会进入冒泡阶段:
从button到canvas,canvas上注册了click事件监听,所以canvas派发该事件,进入事件处理函数,此时target是button,currentTarget是canvas。
如果useCapture=true呢?
还是“n个button的例子”,我们给canvas注册一个useCapture=true的click事件会怎么样呢即
canvas.addEventListener(MouseEvent.CLICK, onMouseClickHandler, true );
|
这样有三点好处:
1. 事件不会经历目标和捕获阶段,这样只有当且仅当事件的target为监听对象的子对象时,事件才会被派发。“n个button的例子”当监听器的参数useCapture=true,用户点击目标如果是canvas自己,则事件不会被派发。换言之只有点击canvas上的子对象,比如某个button或是canvas上的其他UIcomponent,click事件才会触发。再解释一遍为什么吧。点击canvas本身,事件流首先进入捕获阶段从目标(canvas)所在显示对象列表的根stage开始向下,来到canvas上,这时因为event.target==canvas,进入目标阶段,尽管canvas注册了click事件,但useCapture参数是true,那就是说事件只能在捕获阶段被派发,所以这个事件并不会被派发出来,也就是点击canvas没有任何响应。
想象一下应用场景,比如那种点击小球会得分的游戏,我们可以给小球的容器对象加上监听,但又不想在事件处理函数中接判断用户是否点到了容器本身上,这时我们大可放心的给容器对象加上useCapture=true的点击事件监听,让事件在捕获阶段就派发出来,这样就再也不用在函数中check来check去了,管它event.target是谁呢。
2. 不用考虑事件是否支持冒泡。
3. 由于少了两个阶段,必然少折腾一些传递。
分享到:
相关推荐
在深入理解 Flex 事件机制之前,我们需要先了解一下基本概念。 1. **事件的概念** 事件可以视为一种通知机制,当特定条件满足时,事件被触发并通知感兴趣的接收者。例如,`MouseEvent` 类表示与鼠标操作相关的事件...
本文将深入探讨Flex事件机制的基础概念、事件注册通道、事件触发方式、事件分发机制等关键知识点,并尝试以简单明了的方式进行解释。 #### 二、事件机制简介 ##### 1. 什么是事件机制? 事件机制是Flex中非常核心...
Flex事件机制是Adobe Flex应用...总结,Flex事件机制是构建交互性应用的基础,理解并熟练掌握它能够帮助开发者编写出更加高效、响应迅速的Flex应用程序。通过合理地组织和管理事件,可以提高代码的可维护性和用户体验。
Flex事件机制是Adobe Flex应用程序开发中的核心组成部分,它允许组件之间进行有效的通信和交互。对于初级Flex程序员或爱好者来说,理解这一机制至关重要。在本文中,我们将深入探讨Flex事件的各个方面,包括事件流、...
阅读这份文档将有助于深入理解Flex事件机制,并在实际开发中更高效地利用它们。 总之,理解Flex的事件模型对于创建响应式和高效的RIA至关重要。熟练掌握事件处理可以让你的Flex应用程序更加互动,提升用户体验。...
### 深入浅出讲解Flex中的事件机制 #### 一、引言 Flex是一种用于构建高度交互式、跨平台的Web应用程序的技术框架。它基于Adobe的Flash平台,并且使用ActionScript 3作为编程语言。Flex的核心优势在于其强大的用户...
本资料“关于flex事件的讲解.pdf”将深入探讨Flex事件系统,帮助学习者更好地理解和应用这一关键概念。 1. **事件模型**:Flex采用发布/订阅模型处理事件,事件源(如UI组件)发布事件,而感兴趣的接收者(监听器)...
本文将详细介绍Flex中的事件机制及其应用实例,帮助开发者更好地理解和运用这一机制。 #### 二、事件机制介绍 ##### 1. 什么是事件机制? 事件机制可以被视为一种触发机制,当满足特定条件时,系统会触发相应的...
Flex 事件流是Flex应用程序中事件处理的核心机制,它使得组件之间能够有效地通信和响应用户交互。在深入探讨之前,我们需要理解几个基本概念。 1. **事件机制**:事件是Flex中的一种通信方式,当特定条件满足时,...
通过分析这些示例,可以深入理解Flex打印机制的各种可能性和实际应用。 总的来说,Flex的打印机制提供了丰富的功能,使得开发者能够轻松地将应用程序中的内容输出到纸上。通过熟练掌握`PrinterJob`类及其相关的打印...
#### 二、Flex事件解析:深入理解交互逻辑 Flex的核心之一在于其强大的事件处理机制。事件是Flex中实现用户交互的关键,涵盖了从用户操作(如点击、键盘输入)到数据变化(如数据绑定更新)的各个方面。理解并掌握...
首先,让我们深入探讨Flex事件的生命周期。当一个事件被触发时,例如用户点击按钮,该按钮会创建一个事件对象并将其 dispatch(分发)到事件流。事件流分为三个阶段:冒泡阶段、捕获阶段和目标阶段。 1. 冒泡阶段:...
在本文中,我们将深入探讨基于Java的Flex事件监听机制,这是一种强大的工具,允许开发者响应用户交互和应用程序状态的变化。Flex事件模型是ActionScript 3.0的核心组成部分,它与Java的事件处理方式有所不同,但可以...
总之,通过深入理解Flex的事件机制和熟练掌握事件派发技巧,开发者能够构建出响应迅速、交互丰富的应用程序。TitleWindow及其子组件之间的事件传递是这一过程中的关键环节,它不仅促进了组件间的通信,还增强了应用...
通过深入了解和应用这些Flex控件事件,开发者能够构建更加动态和响应式的Flex应用程序,提供丰富的用户交互体验。在实际开发过程中,结合MXML和ActionScript的使用,可以灵活地控制事件处理逻辑,提升程序的灵活性...
Flex Skinning机制是Adobe Flex框架中的一个重要特性,它允许开发者为UI组件自定义外观和行为,从而实现应用程序的独特设计和交互体验。...深入理解并熟练运用这一机制,对于Flex开发者来说是至关重要的。
Flex事件学习是Adobe Flex框架中的一个重要组成部分,它允许开发者创建响应用户交互的动态应用程序。Flex事件模型基于ActionScript 3.0的事件模型...通过实践`EventDemo1`这样的示例,你可以更深入地掌握Flex事件机制。
Flex事件机制是Adobe Flex应用程序开发中的...通过深入理解并掌握以上Flex事件机制的关键点,开发者将能够更高效地构建交互性强、响应及时的Flex应用程序。同时,不断实践和应用这些知识,可以提升Flex编程的技能水平。
总之,"flex自定义组件事件DEMO"提供了一个深入理解Flex自定义组件和事件机制的实践平台。通过这个DEMO,开发者可以学习到如何有效地扩展Flex组件库,构建具有交互性和复杂性的用户界面。记得动手实践,不断探索和...