`

[AS3]事件流那点事儿

 
阅读更多

在群里有人问了个问题:
为什么我把父剪辑的 mouseEnabled 设置为 false 但父剪辑还是可以侦听到 鼠标事件?

很有意思的一个问题,不是么!

AS3 里使用了事件流机制。简单说来一个完整的事件流应该从 Flash Player 到目标然后再回到 Flash Player。我们用一个简单的例子看看如何描述这个问题。

假如有如下结构的SWF文件,场景里有一个MovieClip(以下简称MC) A,A 里面包含一个名为 B 的MC,B 里面又包含 MC D。 有些复杂了,还是画个简单的图吧。
|-stage
..|-A
….|-B
……|-D

然后我们假设 D 触发了CLICK 事件,那么事件流程应该是:

stage  ->  A  ->  B  -> D  ->  B  ->  A  -> stage

这里有几个定义, 先看这一段:[ stage  ->  A  ->  B ], 这段在事件流当中我们定义为  捕获阶段(是否记得addEventListener的第三个参数?);

我们触发事件的对象 [ D ] 也给它定义一个阶段,命名为:目标阶段;

最后 [ B  ->  A  -> stage ] 这阶段定义为 冒泡阶段。

PS:小建议,如果觉得搞不清为什么事件为什么会从stage跑到目标再回到stage这样的问题的话,还是别去管它了。只要记住不管这个事件在哪里发生, 总是会从stage 出发,然后找到触发事件的对象,再回到stage。

这样,一个完整的事件流由 捕获, 目标和冒泡 这三个阶段构成。

更多事件流的信息请访问黑羽博客:http://www.kingda.org/archives/kingda/2006/07/as305.html

扯了这么远,回到开始的话题。

当 我们设置对象的 mouseEnabled 值的时候,它只影响对象本身不会触发事件,但这并不影响对象在事件件中的地位。也就是说当对象的子对象触发鼠标事件的时候,自身也会伴随发送事件。想想整 个事件流,也就不难理解为什么我把父剪辑的 mouseEnabled 设置为 false 但父剪辑还是可以侦听到 鼠标事件。

所以,要禁止一个对象的触发交互事件,完整的做法是 mouseEnabled=false; mosueChildren=false; 同时设置这两个值。

好了,说了一堆全是文字。动手试一下:

  1. 在场景里画一个圆,选个红色或是什么的,保存为影片剪辑;
  2. 继续在场景里画一个方框,颜色和前面的圆区分开就行,位置最好重叠;
  3. 同时选中的圆(影片剪辑)和刚画好的方框,保存影片剪辑;
  4. 再在主时间轴上添加代码:getChildAt(0).addEventListener(MouseEevnt.MOUSE_OVER, function (e){trace(“overed”);});
  5. Ctrl+ENTER 运行测试,看看运行效果。
  6. 再添加一行代码:getChildAt(0).mouseEnabled = false;
  7. 再测试运行。是不是注意到区别了呢?
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics