日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

as3.0中如何阻止事件冒泡?

發布時間:2023/11/27 生活经验 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中如何阻止事件冒泡?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。