AS3的事件流二个重要的应用知识

来源:互联网 发布:电视看最新电影软件 编辑:程序博客网 时间:2024/06/05 23:01

  1. AS3的事件流二个重要的应用知识  
  2. 在AS3的事件流应用过程中,会出现一些冒名奇妙的事情,但很多网站、很多教程上都没有介绍这些不是BUG的BUG是如何产生的,其实与下面二个重要的应用知识有关。  
  3.   
  4. 1、显示层次结构改变与事件流:  
  5. 被通知某事件的事件对象列表顺序,是先于事件调度之前被确定的。也就是说:一个事件调度开始至这个事件调度结束,所有事件流经过的对象显示层次结构即便是被修改了,事件流经过对象的过程还是保持不变(附:事件流过程不变,但事实上显示结构层次已经变了)。如,当一个显示对象的子对象在事件流过程中被父对象的监听器从显示列表中移去,哪怕是被删除引用,事件流还是会经过子对象,如果子对象上存在监听器,它的监听器还是会被继续执行。  
  6. 2、事件监听器列表固化:  
  7. 在一个事件流过程中,事件被传送到每一个对象时,该对象的监听器列表将被固化,不可改变,如:在当前对象捕获阶段的监听器中给当前对象继续添加一个监听器,将会无效,但他会在后面的事件流中生效,如添加一个冒泡阶段的监听器。事件被传送到每一个对象时,该对象的监听器列表虽然被固化,但它并不固化事件流中子对象的监听器列表,仍然可以使用当前对象的监听器移除或添加子对象的监听器,并且在事件流到达子对象时,监听器有效,监听器列表在到达子对象时也是被固化的。  
  8. 事件流  
  9. 只要发生事件,Flash Player就会调试事件对象。如果事件目标不在显示列表中,则Flash Player将事件对象直接调度到事件目标。例如,Flash Player将Progress事件对象直接调试到URLStream对象。但是,如果事件目标在显示列表中,则Flash Player将事件对象调试到显示列表,事件对象将在显示列表中穿行,直到到达事件目标。  
  10. “事件流”说明事件对象如何在显示列表中穿行。显示列表以一种可以描述为树的层次结构形式进行组织。位于显示列表层次结构顶部的是舞台,它是一种特殊的显示对象容器,用作显示列表的根。舞台由Flash.display.Stage类表示,且只能通过显示对象访问。每个显示对象都有一个名为stage的属性,该属性表示应用程序的舞台。  
  11. 当Flash Player调度事件对象时,该事件对象进行一次从舞台到“目标节点”的往返行程。DOM事件规范将目标节点定义为代表事件目标的节点。也就是说,目标节点是发生了事件的显示列表对象。  
  12. 从概念上来说, 事件流分为三部分。  
  13. 第一部分称为捕获阶段,该阶段包括从舞台到目标节点的父节点范围内的所有节点。  
  14. 第二部分称为目标阶段,该阶段仅包括目标节点。  
  15. 第三部分称为冒泡阶段。冒泡阶段包括从目标节点的父节点返回到舞台(从底到顶)的行程中遇到的节点。  
  16.    
  17. 早期版本的ActionScript中没有事件流,这意味着事件侦听器只能添加到生成事件的对象。在ActionScript 3.0中,您不但可以将事件侦听器添加到目标节点,还可以将它们添加到事件流中的任何节点。  
  18. 不过,并所有事件对象都参与事件流的所有三个阶段。某些类型的事件(例如enterFrame和init类型的事件)会直接调度到目标节点,并不参与捕获阶段和冒泡阶段。其它事件可能以不在显示列表中的对象为目标,例如调度到Socket类的实例的事件。这些事件对象也将直接流至目标对象,而不参与捕获和冒泡阶段  
  19. 总结:  
  20. 1.事件流是面向DisplayObject的一个过程机制,但凡显示对象触发的事件,必有这个流过程,自上而下,再自下而上  
  21. 2.事件流机制是在同一条路径上的父子关系的显示对象都会参与的(默认)  
  22. 4.最重要的一点就是,子对象触发的事件,只要父对象有侦听,那么无论如何,父对象都会触发一次所侦听的事件  
  23. 而且顺序是子对象先触发事件,然后父对象再触发(这是由冒泡阶段的顺序触发的)  
  24. 5.将addEventListener函数中的第三个参数设为true,则只在捕获阶段侦听,对于没有子对象的元素,事件是不会触发的,只有当子对象同样侦听相同事件时,才会触发事件(因为没有目标阶段)  
  25.   
  26. 反正要理解事件机制,三个阶段的执行顺序及执行因素理解好后,下面的原理就很好理解了  
  27.   
  28. 如果设置addEventListener函数的第三个参数为true,会中断目标阶段的检测,但它始终会参加事件流,  
  29. 所以ROLL_OVER和ROLL_OUT是实现不  参加事件流(捕获和冒泡均不参加)操作的方法  

原创粉丝点击