`
ahead_zhan
  • 浏览: 28764 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

深入理解FLEX事件机制

    博客分类:
  • Flex
 
阅读更多

 

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 事件机制,flex入门学习

    在深入理解 Flex 事件机制之前,我们需要先了解一下基本概念。 1. **事件的概念** 事件可以视为一种通知机制,当特定条件满足时,事件被触发并通知感兴趣的接收者。例如,`MouseEvent` 类表示与鼠标操作相关的事件...

    Flex事件机制(通俗易懂)

    本文将深入探讨Flex事件机制的基础概念、事件注册通道、事件触发方式、事件分发机制等关键知识点,并尝试以简单明了的方式进行解释。 #### 二、事件机制简介 ##### 1. 什么是事件机制? 事件机制是Flex中非常核心...

    flex事件机制分析

    Flex事件机制是Adobe Flex应用...总结,Flex事件机制是构建交互性应用的基础,理解并熟练掌握它能够帮助开发者编写出更加高效、响应迅速的Flex应用程序。通过合理地组织和管理事件,可以提高代码的可维护性和用户体验。

    Flex的事件机制笔记

    Flex事件机制是Adobe Flex应用程序开发中的核心组成部分,它允许组件之间进行有效的通信和交互。对于初级Flex程序员或爱好者来说,理解这一机制至关重要。在本文中,我们将深入探讨Flex事件的各个方面,包括事件流、...

    flex事件讲解

    阅读这份文档将有助于深入理解Flex事件机制,并在实际开发中更高效地利用它们。 总之,理解Flex的事件模型对于创建响应式和高效的RIA至关重要。熟练掌握事件处理可以让你的Flex应用程序更加互动,提升用户体验。...

    深入浅出讲解flex中的事件机制

    ### 深入浅出讲解Flex中的事件机制 #### 一、引言 Flex是一种用于构建高度交互式、跨平台的Web应用程序的技术框架。它基于Adobe的Flash平台,并且使用ActionScript 3作为编程语言。Flex的核心优势在于其强大的用户...

    关于flex事件的讲解.rar

    本资料“关于flex事件的讲解.pdf”将深入探讨Flex事件系统,帮助学习者更好地理解和应用这一关键概念。 1. **事件模型**:Flex采用发布/订阅模型处理事件,事件源(如UI组件)发布事件,而感兴趣的接收者(监听器)...

    关于flex事件的讲解

    本文将详细介绍Flex中的事件机制及其应用实例,帮助开发者更好地理解和运用这一机制。 #### 二、事件机制介绍 ##### 1. 什么是事件机制? 事件机制可以被视为一种触发机制,当满足特定条件时,系统会触发相应的...

    flex 事件流原理

    Flex 事件流是Flex应用程序中事件处理的核心机制,它使得组件之间能够有效地通信和响应用户交互。在深入探讨之前,我们需要理解几个基本概念。 1. **事件机制**:事件是Flex中的一种通信方式,当特定条件满足时,...

    flex打印机制详解

    通过分析这些示例,可以深入理解Flex打印机制的各种可能性和实际应用。 总的来说,Flex的打印机制提供了丰富的功能,使得开发者能够轻松地将应用程序中的内容输出到纸上。通过熟练掌握`PrinterJob`类及其相关的打印...

    Flex事件解析以及Flex基础功能介绍

    #### 二、Flex事件解析:深入理解交互逻辑 Flex的核心之一在于其强大的事件处理机制。事件是Flex中实现用户交互的关键,涵盖了从用户操作(如点击、键盘输入)到数据变化(如数据绑定更新)的各个方面。理解并掌握...

    flex-event.zip_flex

    首先,让我们深入探讨Flex事件的生命周期。当一个事件被触发时,例如用户点击按钮,该按钮会创建一个事件对象并将其 dispatch(分发)到事件流。事件流分为三个阶段:冒泡阶段、捕获阶段和目标阶段。 1. 冒泡阶段:...

    FLEX事件监听样例(JAVA代码)

    在本文中,我们将深入探讨基于Java的Flex事件监听机制,这是一种强大的工具,允许开发者响应用户交互和应用程序状态的变化。Flex事件模型是ActionScript 3.0的核心组成部分,它与Java的事件处理方式有所不同,但可以...

    Flex TitleWindow父子页面的事件派发

    总之,通过深入理解Flex的事件机制和熟练掌握事件派发技巧,开发者能够构建出响应迅速、交互丰富的应用程序。TitleWindow及其子组件之间的事件传递是这一过程中的关键环节,它不仅促进了组件间的通信,还增强了应用...

    flex控件事件

    通过深入了解和应用这些Flex控件事件,开发者能够构建更加动态和响应式的Flex应用程序,提供丰富的用户交互体验。在实际开发过程中,结合MXML和ActionScript的使用,可以灵活地控制事件处理逻辑,提升程序的灵活性...

    flex skinning 机制实践

    Flex Skinning机制是Adobe Flex框架中的一个重要特性,它允许开发者为UI组件自定义外观和行为,从而实现应用程序的独特设计和交互体验。...深入理解并熟练运用这一机制,对于Flex开发者来说是至关重要的。

    flex 事件学习

    Flex事件学习是Adobe Flex框架中的一个重要组成部分,它允许开发者创建响应用户交互的动态应用程序。Flex事件模型基于ActionScript 3.0的事件模型...通过实践`EventDemo1`这样的示例,你可以更深入地掌握Flex事件机制。

    flexevent.rar_flex

    Flex事件机制是Adobe Flex应用程序开发中的...通过深入理解并掌握以上Flex事件机制的关键点,开发者将能够更高效地构建交互性强、响应及时的Flex应用程序。同时,不断实践和应用这些知识,可以提升Flex编程的技能水平。

    flex自定义组件事件DEMO

    总之,"flex自定义组件事件DEMO"提供了一个深入理解Flex自定义组件和事件机制的实践平台。通过这个DEMO,开发者可以学习到如何有效地扩展Flex组件库,构建具有交互性和复杂性的用户界面。记得动手实践,不断探索和...

Global site tag (gtag.js) - Google Analytics