查阅帮助,可知,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 属性来访问显示列表中当前正在处理此事件的对象。