as3.0中如何阻止事件冒泡?
as3.0中的事件冒泡機制有時候會很煩人,比如一個Sprite(方便下文描述就命名為Container吧)把另一外Sprite(稱為Child吧)做為子元素套進來以后,如果兩個Sprite都注冊了Mouse_Down事件,要想在Child上點擊鼠標時系統只響應Child的Mouse_Down事件,默認是不行的,因為事件冒泡會讓Container也響應Mouse_Down事件,示例代碼:
package
{import flash.display.*;import flash.events.MouseEvent;public class EventTest extends Sprite{public function EventTest(){var _container:Sprite = createRectangle();var _child:Sprite = createRectangle(50,50,0x00ff00);var _sub_child:Sprite = createRectangle(25,25,0x0000ff); _child.addChild(_sub_child);_container.addChild(_child); addChild(_container);_container.y = _container.x = 50;_child.x = _container.width/2-_child.width/2;_child.y = _container.height/2-_child.height/2; _sub_child.x = _child.width/2-_sub_child.width/2;_sub_child.y = _child.height/2-_sub_child.height/2; _container.addEventListener(MouseEvent.MOUSE_DOWN,containerMouseDownHandler); _child.addEventListener(MouseEvent.MOUSE_DOWN,childMouseDownHandler); _sub_child.addEventListener(MouseEvent.MOUSE_DOWN,subChildMouseDownHandler);}private function subChildMouseDownHandler(e:MouseEvent):void{ trace("_sub_child.MOUSE_DOWN");}private function subChildMouseDownHandler2(e:MouseEvent):void{ trace("_sub_child.MOUSE_DOWN_2");}private function childMouseDownHandler(e:MouseEvent):void{trace("_child.MOUSE_DOWN"); }private function containerMouseDownHandler(e:MouseEvent):void{trace("_container.MOUSE_DOWN");} private function createRectangle(width:uint=100,height:uint=100,color:uint=0xff0000):Sprite{var s:Sprite = new Sprite();s.graphics.beginFill(color,1);s.graphics.drawRect(0,0,width,height);s.graphics.endFill();return s;}}
}
鼠標點擊最小的矩形后,輸出如下:
_sub_child.MOUSE_DOWN
_child.MOUSE_DOWN
_container.MOUSE_DOWN
相當于點一個,觸發了三個,要想阻止事件冒泡,可以調用e.stopImmediatePropagation()或stopPropagation()方法,即:
private function subChildMouseDownHandler(e:MouseEvent):void{e.stopImmediatePropagation(); //或//e.stopPropagation();trace("_sub_child.MOUSE_DOWN");
}
這樣在_sub_Child上點擊時,另外二個Sprite就不會響應Mouse_Down事件,但是stopImmediatePropagation方法與stopPropagation有什么區別呢?Adobe總不至于傻到弄二個功能一樣的東東吧
?
官方的解釋:
stopImmediatePropagation():void
防止對事件流中當前節點中和所有后續節點中的事件偵聽器進行處理。?
stopPropagation():void
防止對事件流中當前節點的后續節點中的所有事件偵聽器進行處理。
?
有點繞口,?還是直接來看代碼吧,把上面的示例改造一下,讓_sub_Child的Mouse_Down事件同時添加二個監聽
package
{import flash.display.*;import flash.events.MouseEvent;public class EventTest extends Sprite{public function EventTest(){var _container:Sprite = createRectangle();var _child:Sprite = createRectangle(50,50,0x00ff00);var _sub_child:Sprite = createRectangle(25,25,0x0000ff); _child.addChild(_sub_child);_container.addChild(_child); addChild(_container);_container.y = _container.x = 50;_child.x = _container.width/2-_child.width/2;_child.y = _container.height/2-_child.height/2; _sub_child.x = _child.width/2-_sub_child.width/2;_sub_child.y = _child.height/2-_sub_child.height/2; _container.addEventListener(MouseEvent.MOUSE_DOWN,containerMouseDownHandler); _child.addEventListener(MouseEvent.MOUSE_DOWN,childMouseDownHandler);//注意:這里同時添加了二個監聽,并設置了優點級(subChildMouseDownHandler2的優先級高于subChildMouseDownHandler1)_sub_child.addEventListener(MouseEvent.MOUSE_DOWN,subChildMouseDownHandler1,false,1);_sub_child.addEventListener(MouseEvent.MOUSE_DOWN,subChildMouseDownHandler2,false,2);}private function subChildMouseDownHandler1(e:MouseEvent):void{ trace("_sub_child.MOUSE_DOWN_1");}private function subChildMouseDownHandler2(e:MouseEvent):void{ trace("_sub_child.MOUSE_DOWN_2");}private function childMouseDownHandler(e:MouseEvent):void{trace("_child.MOUSE_DOWN"); }private function containerMouseDownHandler(e:MouseEvent):void{trace("_container.MOUSE_DOWN");} private function createRectangle(width:uint=100,height:uint=100,color:uint=0xff0000):Sprite{var s:Sprite = new Sprite();s.graphics.beginFill(color,1);s.graphics.drawRect(0,0,width,height);s.graphics.endFill();return s;}}
}
重復剛才的測試,在最小的矩形_sub_Child上點擊,輸入如下:
_sub_child.MOUSE_DOWN_2
_sub_child.MOUSE_DOWN_1
_child.MOUSE_DOWN
_container.MOUSE_DOWN
然后把subChildMouseDownHandler2改成:
private function subChildMouseDownHandler2(e:MouseEvent):void{e.stopImmediatePropagation();trace("_sub_child.MOUSE_DOWN_2");
}
重復剛才的測試,輸出如下:
_sub_child.MOUSE_DOWN_2
再試下stopPropagation方法
private function subChildMouseDownHandler2(e:MouseEvent):void{e.stopPropagation();trace("_sub_child.MOUSE_DOWN_2");
}
這回輸出不同了:
_sub_child.MOUSE_DOWN_2
_sub_child.MOUSE_DOWN_1
小結:如果某對象的一個事件同時添加多個監聽,stopPropagation將把該事件注冊的所有監聽處理函數執行完后,再阻止該事件繼續向上冒泡;而stopImmediatePropagation方法將本次處理函數執行完后就立即阻止事件繼續向上冒泡(即同一事件的其它監聽函數將不會執行)。
轉載于:https://www.cnblogs.com/yjmyzz/archive/2010/07/13/1776761.html
總結
以上是生活随笔為你收集整理的as3.0中如何阻止事件冒泡?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 烟花多少钱啊?
- 下一篇: java类加载的表现形式