分享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中的事件的時候有一些不明白,仔細(xì)看了文檔之后終于明白了,在此記錄一下。

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

          1.事件的傳播過程。

          Flex事件有下面三個階段,當(dāng)事件發(fā)生時依次為:

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

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

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

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

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

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

          兩者唯一的區(qū)別就是stopPropagation()是在當(dāng)前對象的所有l(wèi)istener執(zhí)行完畢之后再中止事件的傳播,而另外一個是立刻終止。

          2.Flex事件中的target和currentTarget

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

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

           

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

           

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

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



           

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


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 于田县| 兴安县| 瑞金市| 岑溪市| 双城市| 黑水县| 双桥区| 平乡县| 临西县| 雅安市| 红河县| 泌阳县| 如东县| 二手房| 读书| 宾川县| 牡丹江市| 锡林郭勒盟| 堆龙德庆县| 新兴县| 淮北市| 开阳县| 柘城县| 黄大仙区| 安福县| 瑞丽市| 卢龙县| 团风县| 大化| 盘锦市| 丘北县| 东阿县| 工布江达县| 贞丰县| 滦平县| 元谋县| 永州市| 溧水县| 淮北市| 汉阴县| 汉寿县|