1. 程式人生 > >as3事件流機制徹底理解

as3事件流機制徹底理解

as3和dom的事件流都分三個階段:捕獲階段、目標階段、冒泡階段。如果記不住這三個階段的順序,想象以下捕魚的過程,捕魚也分三個階段:撒網、捕捉,撈起,三個階段從上向下。

為什麼要事件流要分三個階段呢?

這一切都是因為“顯示列表”,沒有顯示列表,也就不會有事件流。在顯示列表中,假設,s:舞臺;c:容器;b:按鈕。

點選按鈕b,b應該發出click事件,這沒錯。從常識上來說,點選了b,也就間接點選了c吧,因為c包含b,那麼c也應該發出click事件,同理s也應該發出click事件。問題就來了,s、c、b發出click事件的順序該如何處理?

用盒子模型來理解,要想“摸東西”,肯定要從最外層的盒子開始摸起,層層向內摸,所以事件流的第一階段是捕獲階段,由外至內。接著就是目標階段。摸完東西,手就要縮回來,縮回來的過程就是冒泡階段。

捕獲階段和目標階段我們很容易理解,從外向內依次發出事件,那為什麼還要有冒泡階段呢?冒泡階段是為了滿足使用者靈活處理事件的需求而產生的。只有捕獲和目標階段,那麼使用者就必須先處理s的click事件,然後是c的click事件,最後才是b。但好多時候,使用者是想先處理b的click事件,然後才是c,最後是s,冒泡階段由此而生。

addEventListener(type:String, listener:Function, useCapture:Boolean= false, priority:int= 0, useWeakReference:Boolean= false):void

用addEventListener監聽事件,預設是目標階段或者冒泡階段,只有useCapture=true的時候,才是捕獲階段。b只有目標階段,s和c有捕獲和冒泡兩個階段。

function onClick(e:MouseEvent):void

{

    trace(e.target);

    trace(e.currentTarget);

}

b.addEventListener(MouseEvent.CLICK, onClick,  false); //e.target == e.currentTarget == b

b.addEventListener(MouseEvent.CLICK, onClick,  true); //不會有任何效果。

c.addEventListener(MouseEvent.CLICK, onClick,  false); //e.target ==  b,e.currentTarget == c

c.addEventListener(MouseEvent.CLICK, onClick,  true); //e.target ==  b,e.currentTarget == c

s.addEventListener(MouseEvent.CLICK, onClick,  false); //e.target ==  b,e.currentTarget == s

s.addEventListener(MouseEvent.CLICK, onClick,  true); //e.target ==  b,e.currentTarget == s

注意,假如b.mouseChildren=false; b.mouseEnabled=false; 那麼c的click事件中e.target ==  c。因此,InteractiveObject.mouseEnabled==true的時候,通過事件流使父容器發出事件的,InteractiveObject.mouseEnabled==false的時候,跟非InteractiveObject一樣,是通過填充父容器,使父容器直接發出事件。

記住,事件流因顯示列表而生,像捕魚一樣有三個階段:捕獲、目標、冒泡。

相關推薦

as3事件機制徹底理解

as3和dom的事件流都分三個階段:捕獲階段、目標階段、冒泡階段。如果記不住這三個階段的順序,想象以下捕魚的過程,捕魚也分三個階段:撒網、捕捉,撈起,三個階段從上向下。 為什麼要事件流要分三個階段呢? 這一切都是因為“顯示列表”,沒有顯示列表,也就不會有事件流。在

android 事件分發機制 概念理解

android 事件分發機制 參考資料 Android 事件分發機制原始碼和例項解析 Android View 事件分發機制詳解 圖解 Android 事件分發機制 圖解View的事件分發機制 原理 分發事件 的起始點: 從 Act

C#中的事件驅動機制如何理解

“事件驅動機制”裡的事件和c#中的event不是一回事。就像java和c++裡沒有event這個關鍵字並且不用delegate。但是它們在處理GUI程式時卻都是用事件驅動機制來完成。 從機制上講,事件就是你幹了什麼,你點選了一個button,選擇了一個下拉選單,點選關閉

js事件機制冒泡和捕獲

JavaScript與HTML之間的互動是通過事件實現的。事件,就是文件或瀏覽器視窗中發生的一些特定的互動瞬間。 事件流 從頁面中接收事件的順序稱為事件流。 IE --> 事件冒泡流 Netscape --> 事件捕獲流 事件冒泡 IE的事件流叫做事件冒泡(event bubbling),即事件

JS事件事件機制

眾所周知JS和HTMl元素的互動幾乎都是通過“事件”來完成的,事件從觸發到完成響應一般分為3個階段:捕獲階段,目標階段,和冒泡階段。 那麼事件是在捕獲階段響應 還是在冒泡階段響應那?? 我們是可以手動

事件機制

只要發生事件,Flash Player 或 AIR 就會排程事件物件。如果事件目標不在顯示列表中,則 Flash Player 或 AIR 將事件物件直接排程到事件目標。例如,Flash Player 將 progress 事件物件直接排程到 URLStream 物件。但是,如果事件目標在顯示列表中,則 F

Android事件分發機制完全解析,帶你從原始碼的角度徹底理解(上)-郭霖

其實我一直準備寫一篇關於Android事件分發機制的文章,從我的第一篇部落格開始,就零零散散在好多地方使用到了Android事件分發的知識。也有好多朋友問過我各種問題,比如:onTouch和onTouchEvent有什麼區別,又該如何使用?為什麼給ListView引入了一

Android事件分發機制完全解析,帶你從原始碼的角度徹底理解(下)-郭霖

記得在前面的文章中,我帶大家一起從原始碼的角度分析了Android中View的事件分發機制,相信閱讀過的朋友對View的事件分發已經有比較深刻的理解了。 還未閱讀過的朋友,請先參考 Android事件分發機制完全解析,帶你從原始碼的角度徹底理解(上) 。 那麼今天我們將繼

Android事件分發機制完全解析,帶你從原始碼的角度徹底理解(上)

其實我一直準備寫一篇關於Android事件分發機制的文章,從我的第一篇部落格開始,就零零散散在好多地方使用到了Android事件分發的知識。也有好多朋友問過我各種問題,比如:onTouch和onTouchEvent有什麼區別,又該如何使用?為什麼給ListView引入

Android事件分發機制完全解析,帶你從原始碼的角度徹底理解(下)

記得在前面的文章中,我帶大家一起從原始碼的角度分析了Android中View的事件分發機制,相信閱讀過的朋友對View的事件分發已經有比較深刻的理解了。那麼今天我們將繼續上次未完成的話題,從原始碼的角度分析ViewGroup的事件分發。首先我們來探討一下,什麼是ViewGro

Android事件分發機制完全解析,帶你從原始碼的角度徹底理解(下) (出自郭林老師)

記得在前面的文章中,我帶大家一起從原始碼的角度分析了Android中View的事件分發機制,相信閱讀過的朋友對View的事件分發已經有比較深刻的理解了。 那麼今天我們將繼續上次未完成的話題,從原始碼的角度分析ViewGroup的事件分發。 首先我們來探討一下,什

Android事件分發機制完全解析,帶你從原始碼的角度徹底理解(上) (出自郭霖老師)

其實我一直準備寫一篇關於Android事件分發機制的文章,從我的第一篇部落格開始,就零零散散在好多地方使用到了Android事件分發的知識。也有好多朋友問過我各種問題,比如:onTouch和onTouchEvent有什麼區別,又該如何使用?為什麼給ListView引入了

從零開始理解JAVA事件處理機制(2)

extend nds 接下來 htm ref param 簡單 tostring ansi 第一節中的示例過於簡單《從零開始理解JAVA事件處理機制(1)》,簡單到讓大家覺得這樣的代碼簡直毫無用處。但是沒辦法,我們要繼續寫這毫無用處的代碼,然後引出下一階段真正有益的代碼。

深入理解JS的事件繫結、事件模型

https://www.jb51.net/article/139997.htm 一、JS事件 (一)JS事件分類 1.滑鼠事件: click/dbclick/mouseover/mouseout 2.HTML事件:  onload/onunload/onsubmit/onresize/o

Android事件分發機制2--自定義事件分發

還記得第一篇文章我們要解決的問題嗎? java.lang.IllegalArgumentException Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.ch

setTimeOut引發的思考——初步理解JS事件迴圈機制 Event Loop

JS是單執行緒引擎,線上程中擁有唯一一個事件迴圈(web workder涉及到了多執行緒,再做補充) JS程式碼執行過程中,除了依靠函式呼叫棧順序執行JS程式碼,還依靠任務佇列(task queue)執行一些程式碼。 一個執行緒中,事件迴圈是唯一的,但是任務佇列

關於Android事件分發機制的巨集觀理解(簡單)

我儘量不打錯別字,用詞準確,不造成閱讀障礙。 之所以說是巨集觀,是因為我不會寫demo,一步步截圖給你看,我會拿原始碼然後剔除暫時用不到的部分,讓你從大脈絡上理解事件分發機制,這樣你會發現,很簡單。 首先在腦海中應該有一個例子,一個LinearLayout裡

徹底理解瀏覽器快取機制

先看上圖,如果對圖中的(a)(b)(c)(d)四個過程的處理方式都很清楚了,那麼請不用再看本文了。 兩個概念 強快取使用者傳送的請求,直接從客戶端快取中獲取,不傳送請求到伺服器,不與伺服器發生互動行為。 協商快取使用者傳送的請求,傳送到伺服器後,由伺服器判定是否從快取中獲取資源。

js的事件事件機制

(1)冒泡型事件:事件按照從最特定的事件目標到最不特定的事件目標(document物件)的順序觸發。 IE 5.5: div -> body -> document IE 6.0: div -> body -> html -> document Mozilla 1.0: d

通過點選事件監聽 setOnClickListener 徹底理解回撥-Android

前言 老司機們對於回撥肯定熟悉得不能再熟悉了,但是新司機可能還是一臉懵逼的,我比較笨,當年懵逼了好久,看夏安明的這一篇部落格地址,雖然下邊的留言都是,寫得好!懂了懂了!但是我當時看了三遍還是不懂好嗎 - -,現在我站在我的角度,用我理解的方式給大家講解回撥,我這麼笨都理解了,聰明的新司機們肯定也