as学习笔记(十六)--mouseout与rollout
sshong 发表于2008年4月18日 22:28:00 更新于2008年10月26日 08:49:00
  还是由于flv全屏时,当鼠标下移到底部时要出现控制栏,鼠标移出底部时要隐藏控制栏。接上篇,为什么对控制栏侦听mouseout不行,要改为rollout呢?
  查阅帮助,可知,as3的事件流机制。
  首先,一个事件触发,将经历 捕获---目标---冒泡 三个阶段。按照层次结构一直到事件触发的元件再冒泡。如下图

  其次,对于一个EventDispatcher,其addEventListener方法中,第三个形参useCapture:Boolean = false,默认false。
  其作用就是确定侦听器是运行于捕获阶段、目标阶段还是冒泡阶段。
  如果将 useCapture 设置为 true,则侦听器只在捕获阶段处理事件,而不在目标或冒泡阶段处理事件。
  如果useCapture为false,则侦听器只在目标或冒泡阶段处理事件。
  第三,在一个触发的event事件,有一个属性eventPhase,这个属性就是获取其对应的所在阶段。1为捕获,2为目标,3为冒泡。
  第四,对于某一个系统定义的event,如一个mouseout和一个rollout等等,有些事件是不存在冒泡阶段,对应于event的bubbles : Boolean 属性。
  
  有了以上知识,我们来解释下为什么控制栏ctrbar添加mouseover侦听会出错!  如:ctrbar.addEventListener(MouseEvent.MOUSE_OUT, moveoutctrbar);这个时候useCapture为false,也就是捕获目标和冒泡阶段。
  因为控制栏上有很多更深层次的子元件,一旦鼠标移出这些子元件,将对这些子元件产生mouseout事件,这个事件流中讲两次找到这些子元件的容器控制栏!而只侦听了目标和冒泡阶段,这样在冒泡阶段中找到了控制栏,调用了控制栏的mouseout侦听!
  而把其改为rollout后,如ctrbar.addEventListener(MouseEvent.ROLL_OUT, moveoutctrbar);这个时候useCapture为false,也就是捕获目标和冒泡阶段。当鼠标移出某子元件时,将产生目标为这个子元件的事件流,因为rollout不是冒泡事件,而目标又不是控制栏,而是其某子元件,自然不会调用控制栏的rollout侦听!
  
  经上,是不是就是mouseout和rollout就这些区别呢?我们用下面的例子来验证。有四个方形container,container中有一个圆形的名字son子元件,分别侦听了mouseout和rollout的true和false(useCapture)。移动鼠标,察看左边侦听输出,你发现了什么?

  

  有一个奇怪的现象,将鼠标移入son时,会触发一个目标为container的mouseout事件!而不会触发目标为container的rollout事件!
  不晓得这个为什么设计。

  附测试代码:
containerA.addEventListener(MouseEvent.MOUSE_OUT, onovercontainer, false);
containerB.addEventListener(MouseEvent.MOUSE_OUT, onovercontainer, true);
containerC.addEventListener(MouseEvent.ROLL_OUT, onovercontainer, false);
containerD.addEventListener(MouseEvent.ROLL_OUT, onovercontainer, true);
clearbtn.addEventListener(MouseEvent.CLICK, oncleartxt);
function onovercontainer(evt:MouseEvent):void
{
    outtxt.appendText( "目标:" + evt.target.name + "  当前目标:" + evt.currentTarget.name + "n" );
    outtxt.appendText( "当前阶段:" + getPhaseString(evt.eventPhase) + "nn" );
}
function getPhaseString(phase:int):String
{
    switch( phase )
    {
        case 1:
            return "捕获阶段";
        case 2:
            return "目标阶段";
        case 3:
            return "冒泡阶段";
        default:
            return "错误";
    }
}
function oncleartxt(evt:MouseEvent):void
{
    outtxt.text = "";
}

  好了,以下摘录自ActionScript 3.0 语言和组件参考:
---------
mouseout
bubbles true
buttonDown 如果按下鼠标主按键,则为 true;否则为 false。
cancelable false;不能取消默认行为。
ctrlKey 如果 Ctrl 键处于活动状态,则为 true;如果处于非活动状态,则为 false。
currentTarget 当前正在使用某个事件侦听器处理 Event 对象的对象。
relatedObject 指针设备指向的显示列表对象。
localX 事件发生点的相对于包含 Sprite 的水平坐标。
localY 事件发生点的相对于包含 Sprite 的垂直坐标。
shiftKey 如果 Shift 键处于活动状态,则为 true;如果处于非活动状态,则为 false。
stageX 事件发生点在全局舞台坐标中的水平坐标。
stageY 事件发生点在全局舞台坐标中的垂直坐标。
target 指针设备下的 InteractiveObject 实例。 target 不一定是显示列表中注册此事件侦听器的对象。 请使用 currentTarget 属性来访问显示列表中当前正在处理此事件的对象。

rollout
bubbles false
buttonDown 如果按下鼠标主按键,则为 true;否则为 false。
cancelable false;没有要取消的默认行为。
ctrlKey 如果 Ctrl 键处于活动状态,则为 true;如果处于非活动状态,则为 false。
currentTarget 当前正在使用某个事件侦听器处理 Event 对象的对象。
relatedObject 指针设备指向的显示列表对象。
localX 事件发生点的相对于包含 Sprite 的水平坐标。
localY 事件发生点的相对于包含 Sprite 的垂直坐标。
shiftKey 如果 Shift 键处于活动状态,则为 true;如果处于非活动状态,则为 false。
stageX 事件发生点在全局舞台坐标中的水平坐标。
stageY 事件发生点在全局舞台坐标中的垂直坐标。
target 指针设备下的 InteractiveObject 实例。 target 不一定是显示列表中注册此事件侦听器的对象。 请使用 currentTarget 属性来访问显示列表中当前正在处理此事件的对象。
标签:无分类:As3&Flex阅读:3797
评论
暂无评论
添加评论
您的大名,限长10汉字,20英文(*)
电子信箱(*)
您的网站
正文,限长500汉字,1000英文(*)
验证码(*) 单击刷新验证码
联系我
博客订阅