<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    gembin

    OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

    HBase, Hadoop, ZooKeeper, Cassandra

    Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

    There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

    About Me

     

    Flex事件機(jī)制的工作流程

    事件機(jī)制的工作流程

    關(guān)于事件流

    目標(biāo)對象:派發(fā)事件的對象
    當(dāng)事件發(fā)生后生成一個(gè)攜帶數(shù)據(jù)的對象,然后檢查目標(biāo)對象是否存在顯示層中,并遍歷從根容器一直到目標(biāo)對象所在位置的所有對象,以樹形勢表示。自動(dòng)檢測所經(jīng)過的節(jié)點(diǎn)是否注冊了監(jiān)聽器。

    事件流暗運(yùn)行流程分為3步:
    • 捕獲階段:捕獲事件 capturing,從根節(jié)點(diǎn)開始順序而下,檢測每個(gè)節(jié)點(diǎn)是否注冊了監(jiān)聽器。同時(shí),Flex 將事件對象的currentTarget 值改為當(dāng)前正在檢測的對象。如果注冊了監(jiān)聽器,則調(diào)用監(jiān)聽函數(shù)。
    • 目標(biāo)階段:檢測目標(biāo)的監(jiān)聽器 targeting:觸發(fā)在目標(biāo)對象本身注冊的監(jiān)聽程序
    • 冒泡階段:事件冒泡 bubbling:從目標(biāo)節(jié)點(diǎn)到根節(jié)點(diǎn),檢測每個(gè)節(jié)點(diǎn)是否注冊了監(jiān)聽器,如果有,則調(diào)用監(jiān)聽函數(shù)。

    每個(gè)事件對象都有以下屬性:
    target:事件的派發(fā)者
    currentTarget:當(dāng)前正在檢測的的對象,幫助跟蹤事件傳播的過程。

    默認(rèn)情況下,捕獲功能處于關(guān)閉狀態(tài),一般沒有必要進(jìn)行捕獲跟蹤。
    事件只在bubbles 屬性為true 時(shí)才進(jìn)行冒泡,可以冒泡的事件包括:change、click、doubleClick、keyDown、keyUp、mouseDown、 mouseUp。并且不能在一個(gè)監(jiān)聽器中同時(shí)打開捕獲和冒泡功能,要做到這一點(diǎn),只能注冊兩個(gè)監(jiān)聽器,分別實(shí)現(xiàn)。

    現(xiàn)在來看一個(gè)例子:
    Xml代碼
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="initApp()">     
    3.     <mx:Style source="style.css" />  
    4.      
    5.     <mx:Script>  
    6.         <![CDATA[ 
    7.             import flash.events.MouseEvent; 
    8.             
    9.             internal function initApp():void{ 
    10.                 canvas_1.addEventListener(MouseEvent.CLICK,pressBtn,true); 
    11.                 canvas_2.addEventListener(MouseEvent.CLICK,pressBtn); 
    12.                 btn_1.addEventListener(MouseEvent.CLICK,pressBtn); 
    13.                 btn_2.addEventListener(MouseEvent.CLICK,pressBtn); 
    14.             } 
    15.             internal function output(msg:String):void{ 
    16.                 debug_txt.text += msg+"\n"; 
    17.             }            
    18.             internal function pressBtn(evt:MouseEvent):void{ 
    19.                 output("是否冒泡--"+evt.bubbles); 
    20.                 output("目標(biāo)對象-- "+evt.target+" -- "+evt.eventPhase); 
    21.                 output("遍歷對象-- "+evt.currentTarget); 
    22.                 output("------------"); 
    23.             } 
    24.         ]]>  
    25.     </mx:Script>  
    26.     <mx:Canvas id = "canvas_1" styleName="box" x="37" y="63" width="445" height="216">  
    27.         <mx:Text x="13" y="10" text="Canvas_1"/>  
    28.         <mx:Canvas id="canvas_2" styleName="box" x="10" y="102" width="173" height="90">  
    29.             <mx:Text x="10" y="10" text="Canvas_2"/>  
    30.             <mx:Button id = "btn_2" x="10" y="38" label="Button_2"/>             
    31.         </mx:Canvas>  
    32.         <mx:Button id="btn_1" x="16" y="38" label="Button_1"/>  
    33.     </mx:Canvas>  
    34.     <mx:TextArea id="debug_txt" styleName="textBox" x="37" y="304" height="198" width="445"/>  
    35.      
    36. </mx:Application>  
     
    在監(jiān)聽函數(shù) pressBtn 中的屬性說明:
    • target:派發(fā)事件的目標(biāo)對象
    • currentTarget:事件流當(dāng)前正經(jīng)過的目標(biāo)對象
    • bubbles:是否打開了冒泡功能
    • eventPhase:事件流當(dāng)前的階段,1:捕獲,2:目標(biāo),3:冒泡


    addEventListener(
      type:String,    事件的類型
      listener:Function,    監(jiān)聽函數(shù)
      useCapture:Boolean = false,    是否打開捕獲功能
      priority:int = 0,    監(jiān)聽器優(yōu)先級(jí)別
      useWeakReference:Boolean = false    是否使用弱引用
    )

    如果useCapture 為true,打開了捕獲功能,則該組件的冒泡階段被取消。
    只有可視化的對象有3個(gè)階段,而像XML等非可視化對象只有目標(biāo)階段。

     

     

    8.2.2 事件對象

    EventDispatcher 是派發(fā)事件的武器,經(jīng)它派發(fā)的事件對象必須是Event類型或者Event的子類。
    Event對象中包含目標(biāo)對象存放的數(shù)據(jù),這些數(shù)據(jù)都成為Event的屬性,以供偵聽器使用:
    Event的屬性:
    • bubbles:只讀,布爾,事件是否開啟冒泡功能
    • cancelable:只讀,布爾,處理事件的默認(rèn)行為是否可以停止。主要針對一些系統(tǒng)事件,如果值為true,則Event的preventDefault方法可以使用,否則不可用。
    • currentTarget:只讀,對象,當(dāng)前正在調(diào)用監(jiān)聽器的對象
    • eventPhase:只讀,整數(shù),返回事件流正經(jīng)歷的階段。1:捕獲,2:目標(biāo),3:冒泡
    • target:只讀,派發(fā)事件的目標(biāo)對象
    • type:只讀,字符,事件類型。比如鼠標(biāo)點(diǎn)擊事件的類型:click,并被定義為常量:MouseEvent.CLICK

    構(gòu)造函數(shù):
    Event(
      type:String,    事件類型
      bubbles:Boolean = false,   是否冒泡
      cancelable:Boolean = false  是否可以停止
    )

    Event 的方法:
    • isDefaultPrevented:判斷preventDefault 是否已經(jīng)被調(diào)用
    • preventDefault:停止事件的默認(rèn)行為。針對一些系統(tǒng)事件,cancelable為true時(shí)才可用。
    • stopImmediatePropagation:停止當(dāng)前的事件流傳播,包括當(dāng)前正在處理的對象
    • stopPropagation:停止當(dāng)前的事件流傳播,但不會(huì)停止當(dāng)前正在處理的對象

     

    Xml代碼
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="initApp()">     
    3.     <mx:Style source="style.css" />  
    4.      
    5.     <mx:Script>  
    6.         <![CDATA[ 
    7.             import flash.events.MouseEvent; 
    8.             
    9.             internal function initApp():void{ 
    10.                 canvas_1.addEventListener(MouseEvent.CLICK,CanvasHandler); 
    11.                 canvas_2.addEventListener(MouseEvent.CLICK,CanvasHandler); 
    12.                 canvas_2.addEventListener(MouseEvent.CLICK,pressBtn); 
    13.                 btn_1.addEventListener(MouseEvent.CLICK,pressBtn); 
    14.             } 
    15.             internal function output(msg:String):void{ 
    16.                 debug_txt.text += msg+"\n"; 
    17.             } 
    18.             
    19.             internal function pressBtn(evt:MouseEvent):void{ 
    20.  
    21.                 output("是否冒泡--"+evt.bubbles); 
    22.                 output("目標(biāo)對象-- "+evt.target+" -- "+evt.eventPhase); 
    23.                 output("遍歷對象-- "+evt.currentTarget); 
    24.                 output("------------");        
    25.             } 
    26.             internal function CanvasHandler(evt:MouseEvent):void{ 
    27.                 
    28.                 output("目標(biāo)對象-- "+evt.currentTarget+" -- "+evt.eventPhase); 
    29.                 //停止事件流的傳播 
    30.                 evt.stopImmediatePropagation(); 
    31.                 //evt.stopPropagation(); 
    32.             } 
    33.         ]]>  
    34.     </mx:Script>  
    35.     <mx:Canvas id = "canvas_1" styleName="box" x="37" y="63" width="425" height="160">  
    36.         <mx:Text x="13" y="10" text="Canvas_1"/>  
    37.         <mx:Canvas id="canvas_2" styleName="box" x="10" y="52" width="173" height="90">  
    38.             <mx:Text x="10" y="10" text="Canvas_2"/>  
    39.             <mx:Button id = "btn_1" x="10" y="38" label="Button_1"/>             
    40.         </mx:Canvas>  
    41.     </mx:Canvas>  
    42.     <mx:TextArea id="debug_txt" styleName="textBox" x="37" y="245" height="198" width="425"/>  
    43.      
    44. </mx:Application>  

     

    8.2.3 偵聽和響應(yīng)事件--一個(gè)偵聽鍵盤事件的例子

    要偵聽一個(gè)事件,首先要?jiǎng)?chuàng)建一個(gè)函數(shù)來作為事件處理器,然后將這個(gè)函數(shù)注冊給相應(yīng)的時(shí)間類型。
    this.addEventListener(KeyboardEvent.KEY_DOWN,keyHandler);
    注冊鍵盤按下事件,交給keyHandler處理,也可以在Application標(biāo)簽添加事件:
    keyDown="keyHandler(event)"  這種情況無法移除事件。

    注冊了事件監(jiān)聽器,使用完畢后,必須使用removeEcentListener 方法刪除監(jiān)聽函數(shù):
    removeEcentListener(
      type:String,   事件類型
      listener:Function,   監(jiān)聽函數(shù)
      useCapture:Boolean = false    是否開啟捕獲功能,如果注冊時(shí)打開,移除也要打開。
    )

    Xml代碼
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"  
    3.      creationComplete="initApp()">  
    4.     <mx:Style source="style.css" />     
    5.     <mx:Script>  
    6.         <![CDATA[ 
    7.             import flash.events.KeyboardEvent; 
    8.  
    9.             internal function initApp():void{ 
    10.                 this.addEventListener(KeyboardEvent.KEY_DOWN,keyHandler); 
    11.             } 
    12.  
    13.             private function keyHandler(e:KeyboardEvent):void{ 
    14.  
    15.                 var str:String = "你按下的是: "+e.keyCode;                
    16.                 debug_txt.text += str +"\n"; 
    17.             } 
    18.         ]]>  
    19.     </mx:Script>     
    20.     <mx:TextArea id="debug_txt" styleName="textBox" x="25" y="78" height="198" width="212" editable="false"/>  
    21.     <mx:Text x="25" y="50" text="按鍵盤上的任意鍵"/>  
    22. </mx:Application> 

    posted on 2008-08-22 10:17 gembin 閱讀(665) 評(píng)論(0)  編輯  收藏 所屬分類: Flex

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(6)

    隨筆分類(440)

    隨筆檔案(378)

    文章檔案(6)

    新聞檔案(1)

    相冊

    收藏夾(9)

    Adobe

    Android

    AS3

    Blog-Links

    Build

    Design Pattern

    Eclipse

    Favorite Links

    Flickr

    Game Dev

    HBase

    Identity Management

    IT resources

    JEE

    Language

    OpenID

    OSGi

    SOA

    Version Control

    最新隨筆

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    free counters
    主站蜘蛛池模板: 午夜寂寞在线一级观看免费| 亚洲va中文字幕| 亚洲国产成人精品女人久久久 | 污视频网站在线免费看| 麻豆亚洲av熟女国产一区二| 亚洲国产主播精品极品网红| 毛片a级毛片免费播放100| 免费无码成人AV在线播放不卡| 黄色三级三级三级免费看| 亚洲性线免费观看视频成熟| 亚洲短视频男人的影院| 亚洲中文久久精品无码ww16| 免费看国产曰批40分钟| 午夜小视频免费观看| 国产成在线观看免费视频| 久久成人国产精品免费软件| 国产一精品一av一免费爽爽| av片在线观看永久免费| 美女视频黄a视频全免费网站一区| 精品日韩99亚洲的在线发布| 亚洲精品视频观看| 在线电影你懂的亚洲| 亚洲精品成人av在线| 亚洲国产精品国自产拍AV| 亚洲国产精品VA在线观看麻豆 | 亚洲欧美国产国产综合一区| 激情亚洲一区国产精品| 亚洲人成电影青青在线播放| 亚洲无成人网77777| 亚洲国产视频网站| 亚洲免费闲人蜜桃| 亚洲AV无码一区二区三区在线| 亚洲av无码片在线观看| 亚洲一区二区三区免费视频| 亚洲国产成人综合| 亚洲国产精品成人久久久| 亚洲成综合人影院在院播放| 亚洲综合伊人制服丝袜美腿| 99亚偷拍自图区亚洲| 综合偷自拍亚洲乱中文字幕 | 亚洲综合色区在线观看|