as3 事件机制 三个阶段(优化别人的代码)
import flash.display.* var mc1=new Sprite(); var mc2=new Sprite(); var mc3=new Sprite(); this.addChild(mc1); mc1.addChild(mc2); mc2.addChild(mc3); drawRect(mc1,0xff9900,200); drawRect(mc2,0x0000FF,100); drawRect(mc3,0xffbbff,50); function drawRect(obj,c,l):void { obj.graphics.beginFill(c) obj.graphics.drawRect(0,0,l,l) } this.addEventListener("click",clickFunc,true);//将addEventListener函数中的第三个参数设为true,则只在捕获阶段侦听,对于没有子对象的元素,事件是不会触发的,只有当子对象同样侦听相同事件时,才会触发事件(因为没有目标阶段). mc1.addEventListener("click",clickFunc); mc2.addEventListener("click",clickFunc); mc3.addEventListener("click",clickFunc); function clickFunc(evt:Event):void { trace("阶段:",evt.target.name+" 是发出事件的目标对象") ; trace("阶段:",evt.currentTarget.name+" 是当前捕获事件的目标对象") ; trace("阶段:",getPhase(evt.eventPhase)) ; trace("") ; //空行 } function getPhase(phase:int):String { switch (phase) { case 1: return "捕获阶段";break; case 2: return "目标阶段";break; case 3: return "冒泡阶段";break; default: return""; } }
output:
阶段: mc3 是发出事件的目标对象
阶段: root1 是当前捕获事件的目标对象
阶段: 捕获阶段
阶段: mc3 是发出事件的目标对象
阶段: mc3 是当前捕获事件的目标对象
阶段: 目标阶段
阶段: mc3 是发出事件的目标对象
阶段: mc2 是当前捕获事件的目标对象
阶段: 冒泡阶段
阶段: mc3 是发出事件的目标对象
阶段: mc1 是当前捕获事件的目标对象
阶段: 冒泡阶段
按三级来分的话,点击mc3时:
捕获阶段是在root上的,然后直接到最里层的mc3上是目标阶段,然后mc2,mc1是冒泡阶段,
捕获阶段---》目标阶段----》冒泡阶段-----》冒泡阶段
浙公网安备 33010602011771号