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

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

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

    分享java帶來的快樂

    我喜歡java新東西

    flex 事件機制穿透

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" click="onAppClick(event)">
     <mx:Script>
      <![CDATA[
       import mx.controls.Alert;

      private function onButtonClick(event:Event)
      {
       trace("onButtonClick");
      }
      
      private function onPanelClick(event:Event)
      {
       trace("onPanelClick");
      }
      
      private function onAppClick(event:Event)
      {
       trace("onAppClick");
      }
      ]]>
     </mx:Script>
    <mx:Panel click="onPanelClick(event)">
    <mx:Button label="click" click="onButtonClick(event)" />
    </mx:Panel>
    </mx:Application>

    今天寫了一些Flex代碼,在處理Flex中的事件的時候有一些不明白,仔細看了文檔之后終于明白了,在此記錄一下。

    Flex的事件其實很容易明白,象JAVA語言一樣,給某個控件注冊一個listener,然后事件發生的時候觸發相應的函數,這點我相信大多數人都能夠明白。今天我想要說的不是這個,而是更加細節的一些東西。

    1.事件的傳播過程。

    Flex事件有下面三個階段,當事件發生時依次為:

    1.capturing(捕捉)
    2.targeting(定位)
    3.bubbling(起泡或者回溯)

    在這些階段,程序中從根節點到觸發事件的節點(這里的節點就是指可以把整個MXML文件看作是一個XML,那么節點就是各個標簽)都有機會來響應事件。假設用戶點擊了HBox容器中的一個Button,在capturing階段Flex會檢查Application和HBox是否對此事件定義了listener,然后在targeting階段Flex觸發Button的listener,在bubbling階段Flex又會檢查Application和HBox,不過這次的順序和capturing狀態時相反。也就是說,事件發生的時候從根節點到目標節點的父節點有兩次機會可以響應事件。

    整個事件的這三個階段也就形成了一個事件流。所以你可以在工作流中的任意節點上注冊listener而不用擔心不會被觸發。還有一點需要說明的是,只有可視的對象(比如一些容器和控件)才有第一個和第三個階段,而像Socket這種沒有界面的對象只能在targeting時被觸發,它無法參與第一個和第三個階段。

    雖然每個對象都有兩次響應事件的機會,但是在默認情況下,capturing狀態時沒有對象會響應事件,除非你特別聲明要在capturing階段響應。你可以把addEventListener() 中的use_capture參數設置為true,這樣就可以在capturing階段響應了。但是請注意,一旦在capturing中響應過之后在bubbling階段就不會再響應了。如果你想要讓listener在capturing和bubbling階段都響應的話,只能兩次調用addEventListener() ,一次把use_capture參數設置為true,第二次把它設置為false

    另外,你只能為可以觸發一個事件的對象注冊此事件的listener。比如,你就不能為一個Form定義一個Click事件,即使它包含一個Button控件,因為Form無法觸發Click事件。

    你可以使用下面兩個函數來中止事件的傳播:
    stopPropagation()
    stopImmediatePropagation()

    兩者唯一的區別就是stopPropagation()是在當前對象的所有listener執行完畢之后再中止事件的傳播,而另外一個是立刻終止。

    2.Flex事件中的target和currentTarget

    每個Event對象都有target和currentTarget屬性,他們可以幫助你跟蹤事件傳播過程。target指的是觸發事件的對象,而currentTarget則是指當前階段正在被檢測到的對象。這樣說可能不太好理解,拿上面的那個例子來說吧,在單擊事件中target就是那個button(或者其子組件),不會變,而currentTarget則首先是Application,然后是HBox,然后……明白了吧?currentTarget就是當前正在被事件所檢測的對象。currentTarget在Flex 1.5中是沒有的,是Flex 2新加入的。

    當我點擊一個Button時,target很有可能并不是這個Button,而是Button的UITextField,就是顯示按鈕文字的組件。但是大多數時候你都是想操作Button對象或者其他注冊了listener的對象,很少有人為UITextField對象注冊listener。所以大多數時候你都用currentTarget而不是target來操作他們。舉個例子:

     

    <mx:Button label="OK" click="trace(event.currentTarget.label)"/>

     

    在這種情況下,currentTarget就是指Button,而target指什么就取決于用戶點擊了Button上哪個地方了。所以一般你很少用到target屬性,大多數情況下都應該使用currentTarget。

    終于總結完了,好像事件還有許多其他我沒注意的地方,如果你認為我疏忽了什么,please leave a comment。Thank you.



     

    posted on 2011-05-13 06:57 強強 閱讀(681) 評論(0)  編輯  收藏 所屬分類: flex 技術分類

    主站蜘蛛池模板: 婷婷亚洲综合一区二区| 亚洲人配人种jizz| 国产精品一区二区三区免费| 日本高清免费不卡视频| 大桥未久亚洲无av码在线| 国产精品色午夜视频免费看| 国产精品亚洲专区一区| 免费国产在线观看老王影院| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 成人免费ā片在线观看| 亚洲精品~无码抽插| 在线观看免费播放av片| 亚洲一二成人精品区| 免费无码又爽又刺激聊天APP| 亚洲午夜无码毛片av久久京东热| 精品少妇人妻AV免费久久洗澡| 国产成人+综合亚洲+天堂| 亚洲一区二区三区偷拍女厕| 免费观看成人久久网免费观看| 精品亚洲A∨无码一区二区三区| 国产大片免费网站不卡美女| 亚洲欧美自偷自拍另类视 | 亚洲国产一成久久精品国产成人综合| 在线播放国产不卡免费视频| 亚洲无av在线中文字幕| 91香蕉国产线在线观看免费| 亚洲色偷偷色噜噜狠狠99| 亚洲成片观看四虎永久| 人人揉揉香蕉大免费不卡| 欧洲 亚洲 国产图片综合| www亚洲精品少妇裸乳一区二区| 久久免费线看线看| 亚洲色最新高清av网站| av在线亚洲欧洲日产一区二区| 久久午夜无码免费| 亚洲精品无码久久久久APP| 亚洲人成伊人成综合网久久久| 999久久久免费精品国产| 国产精品免费视频观看拍拍| 亚洲国产视频一区| 国产亚洲精品影视在线产品|