Event 類別會定義數個唯讀屬性及常數,它們可提供關於事件物件的重要資訊。其中,下列項目更是特別重要:
事件物件類型
每一個事件物件都有相關聯的事件類型,而且這些事件類型都會以字串值的形式儲存在
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
屬性也會變得愈來愈有用。