事件物件

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

在新的事件處理系統中,事件物件的主要作用有兩種:第一,事件物件會將特定事件的相關資訊儲存在一組屬性中,以代表實際的事件。第二,事件物件包含一組方法,可讓您處理這些事件物件,並影響事件處理系統的行為。

為了能方便存取這些屬性和方法,Flash Player API 會定義做為所有事件物件之基底類別的 Event 類別。Event 類別會定義一組對所有事件物件都通用的基本屬性與方法。

本節將以對 Event 類別屬性的論述做為開頭,並進而說明 Event 類別方法,然後再以 Event 類別的子類別為何存在做為結語。

瞭解 Event 類別的屬性

Event 類別會定義數個唯讀屬性及常數,它們可提供關於事件物件的重要資訊。其中,下列項目更是特別重要:

  • 事件物件類型會以常數表示,並且會儲存在 Event.type 屬性中。

  • 是否能避免事件的預設行為會以 Boolean 值表示,並且會儲存在 Event.cancelable 屬性中。

  • 事件流程資訊會包含在其餘的屬性中。

事件物件類型

每一個事件物件都有相關聯的事件類型,而且這些事件類型都會以字串值的形式儲存在 Event.type 屬性中。知道事件物件的類型會很有用,因為這樣可以讓您的程式碼能分辨不同類型的物件。例如,下列程式碼會指定 clickHandler() 偵聽程式函數必須對任何傳遞給 myDisplayObject 的滑鼠按一下事件物件做出回應:

myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

約有 24 種事件類型與 Event 類別本身相關聯,並且會以 Event 類別常數來表示。以下顯示其中某些類型 (摘錄自 Event 類別定義):

package flash.events 
{ 
    public class Event 
    { 
        // class constants 
        public static const ACTIVATE:String = "activate"; 
        public static const ADDED:String= "added"; 
        // remaining constants omitted for brevity 
    } 
}

這些常數可提供簡單的方式,讓您參考特定的事件類型。您應該使用這些常數,而非這些常數所代表的字串。如果您在程式碼中拼錯了常數名稱,編譯器將能捕捉到錯誤;但是如果您使用的是字串,則在編譯期間可能就不會出現打字上的錯誤,進而造成難以除錯的未預期行為。例如,新增事件偵聽程式時,請使用下列程式碼:

myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

而不要使用下列程式碼:

myDisplayObject.addEventListener("click", clickHandler);

預設行為資訊

您的程式碼會存取 cancelable 屬性,檢查所有特定事件物件的預設行為是否能加以避免。 cancelable 屬性具有 Boolean 值,可指出是否能避免某項預設行為。您可以使用 preventDefault() 方法,避免 (或取消) 與一小部分事件相關聯的預設行為。如需詳細資訊,請參閱 瞭解 Event 類別的方法 下的「取消預設事件行為」。

事件流程資訊

其餘的 Event 類別屬性不但包含關於事件物件的重要資訊,也包含了事件物件與事件流程的關聯性資訊。下表將會加以說明:

  • bubbles 屬性包含關於事件物件有參與其中之事件流程的資訊。

  • eventPhase 屬性代表目前事件流程中的階段。

  • target 屬性會儲存事件目標的參考。

  • currentTarget 屬性會儲存目前正在處理事件物件之顯示清單物件的參考。

bubbles 屬性

如果某個事件的事件物件參與事件流程的反昇階段,該稱為該事件在「反昇」。這表示該事件物件是從目標節點傳遞經過它的祖先,直到回到 Stage 為止。 Event.bubbles 會儲存 Boolean 值,它會指出該事件物件是否參與反昇階段。因為所有反昇的事件也都有參與捕捉及目標階段,這就表示任何反昇的事件都會參與全部三個事件流程階段。如果值為 true ,就表示該事件物件有參與全部三個階段。如果值為 false ,就表示該事件物件沒有參與反昇階段。

eventPhase 屬性

您可以調查任何事件物件的 eventPhase 屬性,判斷該事件物件的事件階段。 eventPhase 屬性包含無正負號的整數值,表示事件流程中的其中一個階段。Flash Player API 會定義不同的 EventPhase 類別,它包含三個常數,分別對應至三個無正負號的整數值,如下列摘錄的程式碼所示:

package flash.events 
{ 
    public final class EventPhase 
    { 
        public static const CAPTURING_PHASE:uint = 1; 
        public static const AT_TARGET:uint = 2; 
        public static const BUBBLING_PHASE:uint= 3; 
    } 
}

這些常數會對應至 eventPhase 屬性的三個有效值。您可以使用這些常數,讓程式碼更易於閱讀。如果要確保只有在事件目標位於目標舞台中時,才呼叫名為 myFunc() 的函數,您可以使用下列程式碼來測試這個條件:

if (event.eventPhase == EventPhase.AT_TARGET) 
{ 
    myFunc(); 
}

target 屬性

target 屬性具有物件的參考,而該物件為事件的目標。在某些情況下,這會是直接參考,例如當麥克風成為使用中狀態時,事件物件的目標就是 Microphone 物件。不過,如果該目標位於顯示清單中,您就必須將顯示清單階層列入考慮。例如,假設使用者以滑鼠按一下某個點,而且這個點包含重疊的顯示清單物件,則 Flash Player 和 AIR 就一定會選擇距離 Stage 最遠的物件做為事件目標。

對於複雜的 SWF 檔,特別是其中通常以較小子物件來裝飾的檔案,可能就不會經常使用 target 屬性,因為這個屬性通常是指向某個按鈕的子物件,而非該按鈕。在這些情況下,一般的作法就是將事件偵聽程式加入至該按鈕,並使用 currentTarget 屬性 (因為它會指向該按鈕,而 target 屬性則是指向該按鈕的子系)。

currentTarget 屬性

currentTarget 屬性包含正在處理事件物件之物件的參考。雖然不去瞭解目前是哪個節點正在處理您正在檢查的事件物件似乎很奇怪,但是請記住,您可以將偵聽程式函數加入至該事件物件之事件流程中的任何顯示物件,並且可以將該偵聽程式函數置於任意位置。此外,您也可以將相同的偵聽程式函數加入至不同的顯示物件。隨著專案的大小和複雜程度提高, currentTarget 屬性也會變得愈來愈有用。

瞭解 Event 類別的方法

Event 類別方法共有三種:

  • 公用程式方法,這些方法可以建立事件物件的副本,或將事件物件轉換為字串

  • 事件流程方法,這些方法會從事件流程移除事件物件

  • 預設行為方法,這些方法會避免預設行為,或檢查是否已避免該行為

Event 類別的公用程式方法

Event 類別中有兩種公用程式方法。 clone() 方法可讓您建立事件物件的副本。 toString() 方法可讓您產生事件物件之屬性的字串表示,以及這些屬性的值。這兩種方法都是由事件模型系統在內部使用,但是會公開讓開發人員做為一般用途。

對於建立 Event 類別之子類別的進階開發人員,您必須覆寫並實作這兩種公用程式方法的版本,以確保此事件子類別能正常運作。

停止事件流程

您可以呼叫 Event.stopPropagation() Event.stopImmediatePropagation() 方法,避免事件物件在事件流程中持續傳遞。這兩個方法除了是否允許目前節點的其它事件偵聽程式執行之外,幾乎完全相同:

  • Event.stopPropagation() 方法可避免事件物件移動到下一個節點,但是只有在允許執行目前節點上的其它任何事件偵聽程式之後,才能這麼做。

  • Event.stopImmediatePropagation() 方法也能避免事件物件移動到下一個節點,但是卻不會允許執行目前節點上的其它任何事件偵聽程式。

呼叫上述兩方法的其中一個,並不會影響與某個事件相關聯的預設行為是否會發生。您可以使用 Event 類別的預設行為方法,避免預設行為發生。

取消預設事件行為

與取消預設行為有關的兩個方法為 preventDefault() isDefaultPrevented() 方法。您可以呼叫 preventDefault() 方法,取消與某個事件相關聯的預設行為。若要檢查是否已針對事件物件呼叫 preventDefault() ,請呼叫 isDefaultPrevented() 方法,如果已經呼叫該方法,它會傳回 true 值;否則會傳回 false

只有在可以取消事件的預設行為時, preventDefault() 方法才能運作。您可以參考該事件類型的 API 說明文件,或是使用 ActionScript 檢查該事件物件的 cancelable 屬性,藉以得知目前的情況是否符合上述條件。

取消預設行為並不會對事件流程中事件物件的傳遞進度造成影響。您可以使用 Event 類別的事件流程方法,從事件流程中移除事件物件。

Event 類別的子類別

對許多事件來說,Event 類別中所定義的一般屬性集已經足夠使用。不過,其它事件卻都具有無法以 Event 類別中可用之屬性所捕捉的唯一特性。針對這些事件,ActionScript 3.0 會定義數個 Event 類別的子類別。

每一個子類別都會提供額外的屬性和事件類型,它們對於這些事件的分類而言,都是獨一無二的。例如,與滑鼠輸入動作有關的事件都具有數個唯一特性,這些特性都無法以 Event 類別中所定義的屬性加以捕捉。藉由新增包含像是滑鼠事件位置,以及在滑鼠事件期間是否有按下特定按鍵這類資訊的十項屬性,MouseEvent 類別便可擴充 Event 類別。

Event 子類別也包含代表與該子類別相關聯之事件類型的常數。例如,MouseEvent 類別會為數個滑鼠事件類型定義常數,這些事件類型包括 click doubleClick mouseDown mouseUp

事件物件 底下關於 Event 類別公用程式方法的內容所述,建立 Event 子類別時,您必須覆寫 clone() toString() 方法,以提供該子類別專屬的功能。