<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事件機制的工作流程

    事件機制的工作流程

    關于事件流

    目標對象:派發事件的對象
    當事件發生后生成一個攜帶數據的對象,然后檢查目標對象是否存在顯示層中,并遍歷從根容器一直到目標對象所在位置的所有對象,以樹形勢表示。自動檢測所經過的節點是否注冊了監聽器。

    事件流暗運行流程分為3步:
    • 捕獲階段:捕獲事件 capturing,從根節點開始順序而下,檢測每個節點是否注冊了監聽器。同時,Flex 將事件對象的currentTarget 值改為當前正在檢測的對象。如果注冊了監聽器,則調用監聽函數。
    • 目標階段:檢測目標的監聽器 targeting:觸發在目標對象本身注冊的監聽程序
    • 冒泡階段:事件冒泡 bubbling:從目標節點到根節點,檢測每個節點是否注冊了監聽器,如果有,則調用監聽函數。

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

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

    現在來看一個例子:
    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("目標對象-- "+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>  
     
    在監聽函數 pressBtn 中的屬性說明:
    • target:派發事件的目標對象
    • currentTarget:事件流當前正經過的目標對象
    • bubbles:是否打開了冒泡功能
    • eventPhase:事件流當前的階段,1:捕獲,2:目標,3:冒泡


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

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

     

     

    8.2.2 事件對象

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

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

    Event 的方法:
    • isDefaultPrevented:判斷preventDefault 是否已經被調用
    • preventDefault:停止事件的默認行為。針對一些系統事件,cancelable為true時才可用。
    • stopImmediatePropagation:停止當前的事件流傳播,包括當前正在處理的對象
    • stopPropagation:停止當前的事件流傳播,但不會停止當前正在處理的對象

     

    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("目標對象-- "+evt.target+" -- "+evt.eventPhase); 
    23.                 output("遍歷對象-- "+evt.currentTarget); 
    24.                 output("------------");        
    25.             } 
    26.             internal function CanvasHandler(evt:MouseEvent):void{ 
    27.                 
    28.                 output("目標對象-- "+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 偵聽和響應事件--一個偵聽鍵盤事件的例子

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

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

    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 閱讀(664) 評論(0)  編輯  收藏 所屬分類: Flex

    導航

    統計

    常用鏈接

    留言簿(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

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    free counters
    主站蜘蛛池模板: 亚洲国产精品人人做人人爱| 色窝窝免费一区二区三区| 国产精品成人四虎免费视频| 亚洲熟妇av午夜无码不卡| 成人免费视频软件网站| 亚洲最大成人网色香蕉| 无码一区二区三区免费视频| 亚洲国产精品18久久久久久| 国产精品极品美女免费观看| 美女视频黄a视频全免费网站色| 免费成人午夜视频| 国产美女视频免费观看的网站| 国产日韩亚洲大尺度高清| 日日麻批免费40分钟无码| 亚洲成AV人综合在线观看| 成人午夜18免费看| 本道天堂成在人线av无码免费| 亚洲性猛交XXXX| 91免费在线播放| 亚洲精品女同中文字幕| 亚洲精品国产精品乱码不卡| 免费视频精品一区二区三区| 亚洲午夜久久久久久尤物| 国产精品免费看香蕉| 丝瓜app免费下载网址进入ios| 久久久亚洲AV波多野结衣| 免费网站看v片在线香蕉| jizz免费观看| 亚洲一区二区三区久久久久| www国产亚洲精品久久久日本| 久久性生大片免费观看性| 亚洲精品无码久久毛片波多野吉衣| 在线免费视频一区| 中国在线观看免费的www| 国产成人精品日本亚洲11| 亚洲男人天堂2020| 久久受www免费人成_看片中文| 黄色一级毛片免费| 亚洲精品日韩专区silk| 亚洲伊人久久综合中文成人网 | 国内成人精品亚洲日本语音|