云下的天空

          堅持 隨心而動 走自己的路

           

          (轉載)冒泡事件理解3

           

            我花了一天的時間總算理解了冒泡事件  這篇文章給了我很大的幫助
            原文鏈接:http://enboga.iteye.com/blog/214780





          8.2 事件機制的工作流程
           


          8.2.1 關于事件流 

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

          事件流暗運行流程分為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 2011-06-05 22:29 天空布藍 閱讀(786) 評論(0)  編輯  收藏 所屬分類: Flex4

          導航

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          Flex學習鏈接

          搜索

          •  

          最新評論

          • 1.?re: tomcat7的配置
          • 新建變量名: TOMCAT_HOME 應該為CATALINA_HOME
          • --houkai
          • 2.?re: tomcat7的配置
          • 確實是的@寒澈
          • --houkai
          • 3.?re: tomcat7的配置
          • @ftp123
            你娘里個大雪碧 里面會有common這個文件夾嗎 不知道還尼瑪在這瞎比比 純尼瑪誤導人 我最惡心的就是這樣沒事裝逼的人 艸
          • --cao
          • 4.?re: tomcat7的配置
          • 從哪抄來的,是抄的,你也說聲啊,要不自己測試下也可以,害人測試半天。
          • --ftp123
          • 5.?re: tomcat7的配置
          • %TOMCAT_HOME%\common\lib 從tomcat6.0開始已經沒有common文件夾了,直接用\lib,害我找了半天common文件夾啊,趕快改過來吧
          • --寒澈

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 阳东县| 定南县| 贵州省| 繁峙县| 中西区| 碌曲县| 饶河县| 南涧| 张家川| 如东县| 宣城市| 科技| 樟树市| 灌阳县| 金堂县| 永泰县| 舟山市| 师宗县| 阿拉善右旗| 西乌珠穆沁旗| 应城市| 尉氏县| 湖州市| 吉木萨尔县| 临湘市| 黄平县| 普兰县| 罗田县| 朝阳市| 天峻县| 聂荣县| 大冶市| 罗源县| 大英县| 奉新县| 平塘县| 明水县| 体育| 乌拉特前旗| 曲水县| 承德县|