事件流程

每當發生事件時,Flash Player 都會傳送事件物件。如果事件目標不是顯示清單,Flash Player 就會直接將事件物件傳送至該事件目標。例如,Flash Player 會將進度事件物件直接傳送至 URLStream 物件。但是,如果該事件目標位於顯示清單中,則 Flash Player 會將事件物件傳送至顯示清單,而且該事件物件會傳遍顯示清單,直到到達該事件目標為止。

「事件流程」會說明事件物件在顯示清單中移動的方式。顯示清單是以階層的形式所組成,能以樹狀結構來說明。顯示清單階層的頂端就是 Stage,它是特殊的顯示物件容器,作用就像是顯示清單的根。這個 Stage 是由 flash.display.Stage 類別來表示,而且只能透過顯示物件來存取。每一個顯示物件都有名為 stage 的屬性,此屬性指的就是該應用程式的「舞台」。

當 Flash Player 傳送事件物件時,會將該事件物件從 Stage 傳送至「目標節點」,然後再回到 Stage。「DOM 事件規格」是將目標節點定義為代表事件目標的節點,換句話說,目標節點也就是在其位置發生該事件的顯示清單物件。例如,假設使用者按一下名為 child1 的顯示清單物件,Flash Player 便會以 child1 做為目標節點來傳送事件物件。

事件流程在概念上可分為三個階段:第一個階段稱為「捕捉階段」,這個階段是由從 Stage 到目標節點之間的所有節點組成。第二個階段稱為「目標階段」,這個階段是由目標節點單獨組成。第三個階段稱為「反昇」(Bubbling) 階段,這個階段是由事件物件從目標節點的父輩回到 Stage 途中所遇到的節點組成。

如果您將顯示清單認為是 Stage 在頂端的垂直式階層架構,則這些階段的名稱可以幫助您更容易瞭解,如下圖所示:


假設性的顯示清單圖表,其中頂端是名為 Stage 的節點,其它還包含名為 Parent Node 的節點,此節點中包含了名為 Child1 Node 和 Child2 Node 的節點。

如果使用者按一下「Child1 Node」,Flash Player 便會將事件物件傳送至事件流程中。如下圖所示,該物件會從 Stage 向下移動到 Parent Node,接著再移動到 Child1 Node,然後「反昇」回到 Stage。在返回 Stage 期間,該物件會再次經過 Parent Node


顯示事件反昇的圖表。捕捉階段會從 Stage 開始,並經過 Parent Node。目標階段會發生在 Child1 Node。反昇階段會繼續經過 Parent Node 並回到 Stage。

在此範例中,捕捉階段包含在首次向下移動期間經過的 StageParent Node;目標階段包含在 Child1 Node 所耗費的時間;而反昇階段則包含在向上移動回到根節點期間所遇到的 Parent NodeStage

這種事件流程可讓 ActionScript 程式設計人員使用功能更強大的事件處理系統。在舊版 ActionScript 中並沒有事件流程,這表示您只能將事件偵聽程式加入至可產生事件的物件;而在 ActionScript 3.0 中,您不僅可以將事件偵聽程式加入至目標節點,也可以加入至事件流程中的任一節點。

當使用者介面組件包含一個以上的物件時,將事件偵聽程式加入至事件流程是很有用的功能。例如,按鈕物件通常會包含當做該按鈕物件之標籤的文字物件。如果不能將事件偵聽程式加入至事件串流,您就必須將偵聽程式加入至該按鈕與文字物件,以確保按一下按鈕時,能夠收到按一下事件。然而,事件物件能夠讓您將單一事件偵聽程式置於按鈕物件上,以處理發生在文字物件、或是文字物件未遮蔽到之按鈕物件區域的按一下事件。

然而,不是每一個事件物件都會參與事件流程的所有三個階段。某些類型 (例如 enterFrameinit 事件類型) 的事件會直接傳送至目標節點,並且不會參與捕捉階段或反昇階段;而其它事件則可能會將目標設定為不在顯示清單中的物件,例如傳送至 Socket 類別之實體的事件。這些事件物件也將會直接傳送至目標物件,而不會參與捕捉階段與反昇階段。

若要得知某個特定事件類型的行為,您可以檢查 API 說明文件,或檢查該事件物件的屬性。下節將針對檢查事件物件的屬性進行說明。


Flash CS3

 

有新的意見加入至這個頁面時,傳送電子郵件給我 | 意見報告

目前頁面: http://livedocs.adobe.com/flash/9.0_tw/main/00000137.html