只要發生事件,flash player 或 air 就會排程事件物件。如果事件目標不在顯示列表中,則 flash player 或 air 將事件物件直接排程到事件目標。例如,flash player 將 progress 事件物件直接排程到 urlstream 物件。但是,如果事件目標在顯示列表中,則 flash player 將事件物件排程到顯示列表,事件物件將在顯示列表中穿行,直到到達事件目標。
「事件流」說明事件物件如何在顯示列表中穿行。顯示列表以一種可以用樹結構來描述的層次形式進行組織。位於顯示列表層次頂部的是舞台,它是乙個特殊的顯示物件容器,用作顯示列表的根。舞台由 flash.display.stage 類表示,且只能通過顯示物件訪問。每個顯示物件都有乙個名為 stage 的屬性,該屬性表示應用程式的舞台。
當 flash player 或 air 為顯示列表相關的事件排程事件物件時,該事件物件將進行一次從舞台到「目標節點」的往返行程。dom 事件規範將目標節點定義為代表事件目標的節點。也就是說,目標節點是發生了事件的顯示列表物件。例如,如果使用者單擊名為 child1 的顯示列表物件,flash player 或 air 將使用 child1 作為目標節點來排程事件物件。
從概念上來說,事件流分為三部分。第一部分稱為捕獲階段,該階段包括從舞台到目標節點的父節點範圍內的所有節點。第二部分稱為目標階段,該階段僅包括目標節點。第三部分稱為冒泡階段。冒泡階段包括從目標節點的父節點返回到舞台的行程中遇到的節點。
如果將顯示列表想像為乙個垂直的層次,其中舞台位於頂層(如下圖顯示),那麼這些階段的名稱就更容易理解了:
如果使用者單擊 child1 node,flash player 或 air 將向事件流排程乙個事件物件。如下面的影象所示,物件的行程從舞台開始,向下移到父節點,然後移到 child1 節點,再「冒泡」返回到舞台(即在行程中重新經過父節點,再返回到舞台)。
在此示例中,捕獲階段在首次向下行程中包括舞台和父節點。目標階段包括在 child1 花費的時間。冒泡階段包括在向上返回到根節點的行程中遇到的父節點和舞台。
事件流使現在的事件處理系統比 actionscript 程式設計師以前使用的事件處理系統功能更為強大。早期版本的 actionscript 中沒有事件流,這意味著事件偵聽器只能新增到生成事件的物件。在 actionscript 3.0 中,您不但可以將事件偵聽器新增到目標節點,還可以將它們新增到事件流中的任何節點。
當使用者介面元件包含多個物件時,沿事件流新增事件偵聽器的功能十分有用。例如,按鈕物件通常包含乙個用作按鈕標籤的文字物件。如果無法將偵聽器新增到事件流,您將必須將偵聽器新增到按鈕物件和文字物件,以確保您收到有關在按鈕上任何位置發生的單擊事件的通知。而事件流的存在則使您可以將乙個事件偵聽器放在按鈕物件上,以處理文字物件上發生的單擊事件或按鈕物件上未被文字物件遮住的區域上發生的單擊事件。
不過,並非每個事件物件都參與事件流的所有三個階段。某些型別的事件(例如 enterframe 和 init 型別的事件)會直接排程到目標節點,並不參與捕獲階段和冒泡階段。其他事件可能以不在顯示列表中的物件為目標,例如排程到 socket 類的例項的事件。這些事件物件也將直接流至目標物件,而不參與捕獲和冒泡階段。
要查明特定事件型別的行為,可以檢視 api 文件或檢查事件物件的屬性。下面的部分介紹了如何檢查事件物件的屬性。
javascript中事件流機制
1.js中事件流機制,分為三個階段,事件捕獲階段 處於目標階段 事件冒泡階段 2.事件捕獲階段,瀏覽器會從根節點開始由外到內進行事件傳播 事件傳播的順序是 window document div div 結點 通過函式新增 element.addeventlistener event,functio...
as3事件流機制徹底理解
as3的事件流分三個階段 捕獲階段 目標階段 冒泡階段。如果記不住這三個階段的順序,想象以下捕魚的過程,捕魚也分三個階段 撒網 捕捉,撈起,三個階段從上向下。為什麼要事件流要分三個階段呢?這一切都是因為 顯示列表 沒有顯示列表,也就不會有事件流。在顯示列表中,假設,s 舞台 c 容器 b 按鈕。點選...
事件流 事件捕獲?事件冒泡?
事件流 從頁面中接收事件的順序。也就是說當乙個事件產生時,這個事件的傳播過程,就是事件流。ie中的事件流叫事件冒泡 事件冒泡 事件開始時由最具體的元素接收,然後逐級向上傳播到較為不具體的節點 文件 對於html來說,就是當乙個元素產生了乙個事件,它會把這個事件傳遞給它的父元素,父元素接收到了之後,還...