1. 程式人生 > >as3:事件機制原理

as3:事件機制原理

addEventListener () 方法
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
— 事件的型別。
— 處理事件的偵聽器函式。此函式必須接受 Event 物件作為其唯一的引數,並且不能返回任何結果,如下面的示例所示:
function(evt:Event):void

函式可以有任何名稱。

useCapture
:Boolean
(default = false) — 確定偵聽器是運行於捕獲階段、目標階段還是冒泡階段。如果將 useCapture 設定為 true,則偵聽器只在捕獲階段處理事件,而不在目標或冒泡階段處理事件。如果 useCapturefalse,則偵聽器只在目標或冒泡階段處理事件。要在所有三個階段都偵聽事件,請呼叫 addEventListener 兩次:一次將 useCapture 設定為 true,一次將 useCapture 設定為 false.
priority:int (default = 0) — 事件偵聽器的優先順序。優先順序由一個帶符號的 32 位整數指定。數字越大,優先順序越高。優先順序為 n
的所有偵聽器會在優先順序為 n -1 的偵聽器之前得到處理。如果兩個或更多個偵聽器共享相同的優先順序,則按照它們的新增順序進行處理。預設優先順序為 0。
useWeakReference:Boolean (default = false) — 確定對偵聽器的引用是強引用,還是弱引用。強引用(預設值)可防止您的偵聽器被當作垃圾回收。弱引用則沒有此作用。

類級別成員函式不屬於垃圾回收的物件,因此可以對類級別成員函式將 useWeakReference 設定為 true 而不會使它們受垃圾回收的影響。如果對作為巢狀內部函式的偵聽器將 useWeakReference 設定為 true,則該函式將作為垃圾回收並且不再是永久函式。如果建立對該內部函式的引用(將該函式儲存到另一個變數中),則該函式將不作為垃圾回收並仍將保持永久。

我們先看第四個引數,就是priority。。這個優先順序應該是很好理解了,就是優先順序高的先執行,低的後執行,數字大的為高,小的為低。預設的都是0。也就是說按定義先後執行。比如:

A.addEventListener(MouseEvent.CLICK,onClick1);

A.addEventListener(MouseEvent.CLICK,onClick2);

那麼預設的,在點A的時候就會是onClick1執行,onClick2執行。這樣的順序。

如果是:

A.addEventListener(MouseEvent.CLICK,onClick1,false,1);

A.addEventListener(MouseEvent.CLICK,onClick2,false,0);

這樣的話,在點A的時候就會是onClick2執行,onClick1執行。這樣的順序。

然後再看第三個引數:useCapture

從定義可以看出,這個引數是一個Boolean型別,就是true OR false。而且預設不寫的話是false.

他主要是控制我們的偵聽是發生在捕獲階段、目標階段和冒泡階段中的哪個階段的。是不是有點懵。沒關係,下面我們先講講這三個階段。

上面是兩個圖,左邊一個是說明一種層次關係,就是舞臺上有一個東東,東東里面又有兩個小東東。

第二個圖是說如果小東東一被點選的話會出現的現像。我們知道addEventListener只是新增一個事件偵聽,也就是說你做不做這個工作,只要你點選了元件,事件流是客觀存在的。下面我們就第二個圖看看這個客觀存在是什麼樣的。

可以看見的有三個箭頭,第一個Capture Phase(捕獲階段)第二個Target Phase(目標階段)第三個Bubbing Phase(冒泡階段)。

什麼意思呢,就是說你點了Child1這個東東。那麼事件會從舞臺開始,往下到你點的東東,再向上到舞臺.明白一點說,就是首先系統會認為你點選了舞臺,然後是點選了Parent,然後是點選了你的目標Child1.然後再回上去。其中事件從stage跑到Child1之前,叫做捕獲階段,到達Child1叫做目標階段(真正點選的目標),再回上去叫做冒泡階段(很形像吧)。

三個階段搞清楚了吧。那你是不是對這個Capture,捕獲階段這個單詞有點眼熟呢,不錯就是第三個引數裡面useCapture.(終於又繞回來了)。現在想想,我們為Parent上註冊了一個事件,其實就相當於在他上面放了一隻耳朵,用來聽聽事件是不是經過了那裡,經過就執行函式,那麼三個階段下來,事件是不是兩次都經過了它,那耳朵是不是聽到了兩次事件。那函式不是要執行兩次??這個問題的解決,就是應用useCapture這個引數,這個引數在預設為false表示,事件只能在目標階段和冒泡階段被偵聽到,假如上圖stage 和parent都有監聽click事件的話,那就是child1先執行、再parent、最後stage。但是如果為true的話,表示只能在捕獲階段被偵聽到,所以stage會先執行、再parent、最後才是目標currentchild1執行。

********************************************************************************

在場景中再一個矩形影片剪輯,例項名mc
雙擊進入後,再畫一個矩形(稍小的),做成影片剪輯,例項名a
這樣做成了一個父子套的關係,
然後寫程式碼

*************************************************************************

stopImmediatePropagation () 方法   public function stopImmediatePropagation():void

防止對事件流中當前節點中和所有後續節點中的事件偵聽器進行處理。此方法會立即生效,並且會影響當前節點中的事件偵聽器。相比之下,在當前節點中的所有事件偵聽器都完成處理之前,stopPropagation() 方法不會生效。

程式碼:
mc.a.addEventListener(MouseEvent.CLICK,onFunA)
mc.addEventListener(MouseEvent.CLICK,onFunB)
function onFunA(_evt:MouseEvent){
trace(_evt.currentTarget.name,"_",_evt.target.name)
}
function onFunB(_evt:MouseEvent){
trace(_evt.currentTarget.name,"_",_evt.target.name)
}

執行,在單純mc的範圍上單擊,返回的target是mc,currentTarget也是mc
輸出結果:
mc _ mc
而如果滑鼠再移入一點,在a影片剪輯上單擊的時候,
事件流先到達目標階段,觸發a的偵聽,然後冒泡階段,再到mc
所以target一直是a,但currentTarget目標會在兩次觸發中分別為a(內層)和mc(外層)
輸出結果:
a _ a
mc _ a
上面這個實驗就是想證明自己的一個想法,冒泡事件是否觸發的順序是從底到頂的,上面的輸出證實了這點理解.


總結:
1.事件流是面向DisplayObject的一個過程機制,但凡顯示物件觸發的事件,必有這個流過程,自上而下,再自下而上
2.事件流機制是在同一條路徑上的父子關係的顯示物件都會參與的(預設)
3.參與事件流的物件,對內部子物件,同樣會觸發MOUSE_OUT事件的
4.最重要的一點就是,子物件觸發的事件,只要父物件有偵聽,那麼無論如何,父物件都會觸發一次所偵聽的事件
而且順序是子物件先觸發事件,然後父物件再觸發(這是由冒泡階段的順序觸發的
)
5.將addEventListener函式中的第三個引數設為true,則只在捕獲階段偵聽,對於沒有子物件的元素,事件是不會觸發的,只有當子物件同樣偵聽相同事件時,才會觸發事件(因為沒有目標階段)

相關推薦

as3事件機制原理

addEventListener () 方法 public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useW

深入理解React事件機制原理

**目錄** - 序言 - DOM事件流 - 事件捕獲階段、處於目標階段、事件冒泡階段 - addEventListener 方法 - React 事件概述 - 事件註冊 - document 上註冊 - 回撥函式儲存 - 事件分發 - 小結 - 參考 **1.序言** React

Nodejs事件機制

UserBean.js var events = require("events"); var http = require("http"); function UserBean() { this.eventEmit = new events.EventEmitter();

Android跨程序通訊binder機制原理

個人閱讀收穫 通過binder驅動我們可以減少一次io操作,從而減少了我們程序通訊的花費的資源,加快了程序間通訊的速度。我們使用到了Linux的mmap()操作,從而實現了程序間的接收快取區與程序的空間區的對映,從而少了一次io操作。我們的客戶端會發送資訊通過我們io操作講

Node.js入門事件機制

Evented I/O for V8 JavaScript     基於V8引擎實現的事件驅動IO。 事件機制的實現     Node.js中大部分的模組,都繼承自Event模組(http://nodejs.org/docs/latest/api/events.html )。Event模組(ev

nginx 事件機制原理

取消 線性 程序設計 狀態 請求 方案 www 是否 產生 事件驅動模型是Nginx服務器保障完整功能和具有良好性能的重要機制之一。 事件驅動模型概述 實際上,事件驅動並不是計算機編程領域的專業詞匯,它是一種比較古老的響應事件的模型,在計算機編程、公共關系、經濟

Android開發知識(七)Android事件處理機制事件分發、傳遞、攔截、處理機制原理分析(上)

  在我們剛開始學習安卓的時候,總會一開始就接觸到Button,也就是對按鈕進行一個事件監聽的事件,當我們點選螢幕上的按鈕時就可以觸發一個點選事件。那麼,從我們點選螢幕到按鈕觸發事件這個過程,是什麼樣子的呢?本文我們就來談一下關於事件攔截處理機制的基本知識。

Android開發知識(八)Android事件處理機制事件分發、傳遞、攔截、處理機制原理分析(中)

  在本章節中,我們重點談論一下onTouch、onClick、onLongClick三個方法被回撥的過程。   在上一篇文章中,我們談到關於為View新增一個點選事件SetOnClickListener後,就可以通過回撥onClick方法來實現事件的響應

node.js零基礎詳細教程(4)node.js事件機制、node異步IO操作

nod server nbsp node i++ 兩個 con 錯誤 定時器 第四章 建議學習時間3小時 課程共10章 學習方式:詳細閱讀,並手動實現相關代碼 學習目標:此教程將教會大家 安裝Node、搭建服務器、express、mysql、mongodb、編寫後臺業務邏

Unity3D學習(一)簡單梳理下Unity跨平臺的機制原理

12px get 一個 bsp 嵌入 ram 屬於 開源 runtime 前言 首先需要了解的是,Unity3D的C#基礎腳本模塊是通過Mono來實現的。 什麽是Mono? 參考下百度百科:Mono是一個由Novell公司(由Xamarin發起)主持的項目,並由Migu

VC++/MFC訊息對映機制(4)鉤子函式原理

VC++/MFC訊息對映機制(4):附:鉤子函式原理 若對C++語法不熟悉,建議參閱《C++語法詳解》一書,電子工業出版社出版,該書語法示例短小精悍,對查閱C++知識點相當方便,並對語法原理進行了透徹、深入詳細的講解。 一、鉤子SetWindowsHookEx 注意:本文的鉤子和

很棒的開源監控系統原理系列文章UAV MOF工作原理之Agent注入機制原理

原文連結:https://mp.weixin.qq.com/s/eA6nuYPVvgoCWO4E3yP4BQ 也可關注公眾號:UAVStack智慧運維 大家好,UAVStack推送時間到~ 上月我們為大家介紹了UAVStack中的呼叫鏈技術,助力大家進行問題診斷和系統性能提升,希望大家有

Java核心機制反射機制原理及應用方法

一、java的核心機制 java有兩種核心機制:java虛擬機器(JavaVirtual Machine)與垃圾收集機制(Garbage collection): 1、Java虛擬機器:是執行所有Java程式的抽象計算機,是Java語言的執行環境,在其上面執行Java程式碼編譯後的位元組碼程式,

ALSA音效卡驅動中的DAPM詳解之七dapm事件機制(dapm event)

前面的六篇文章,我們已經討論了dapm關於動態電源管理的有關知識,包括widget的建立和初始化,widget之間的連線以及widget的上下電順序等等。本章我們準備討論dapm框架中的另一個機制:事件機制。通過dapm事件機制,widget可以對它所關心的dapm事

Qt學習筆記Qt 事件機制

一、Qt中的事件處理 1. 在Qt中,事件被封裝成一個個物件,所有的事件均繼承自抽象類QEvent. 事件處理的核心包括事件①產生、②分發、③接受和處理。 事件的產生: 誰來產生事件? 最容易想到的是我們的輸入裝置,比如鍵盤、滑鼠產生的keyPressEvent,keyR

筆記事件分發機制(二)ViewGroup的事件分發

前言 前面我根據郭大神的部落格做了View的事件分發的筆記 筆記:事件分發機制(一):View的事件分發 對View的事件分發有了一個比較深入的瞭解。 本篇還是就郭大神的部落格 Android事件分發機制完全解析,帶你從原始碼的角度徹底理解(下)

Android面試準備事件分發機制

View的事件分發機制舉例 為按鈕設定onClick點選事件和onTouch觸控事件的執行順序為: 1、onClick事件: button.setOnClickListener(new OnClickListener() { @Over

JS事件機制事件繫結、事件監聽、事件委託(代理)和事件執行順序總結

JS 對於使用者的操作做出響應,就必須對DOM元素繫結事件處理函式 事件繫結  1、在DMO中直接繫結事件 <input type="button" value="click me"

【譯】JavaScript的工作原理事件迴圈及非同步程式設計的出現和 5 種更好的 async/await 程式設計方式

此篇是JavaScript的工作原理的第四篇,其它三篇可以看這裡: 【譯】JavaScript的工作原理:引擎,執行時和呼叫堆疊的概述 【譯】JavaScript的工作原理:V8引擎內部+關於如何編寫優化程式碼的5個技巧 【譯】JavaScript的工作原理:記憶體管理和4種常見的記憶體洩漏

pyalgotrade原始碼閱讀事件分發機制dispatcher.py

from pyalgotrade import utils from pyalgotrade import observer from pyalgotrade import dispatchprio # This class is responsible for disp