承接我上一篇介紹Event事件流的基本概念AS3的事件傳遞機制(Event、dispatchEvent及addEventListener),這篇繼續介紹兩個相關的檢查函數:`hasEventListener()`與`willTrigger()`。我用一個具體的物件階層範例,實際trace兩種方法的回傳結果,一看就懂差別在哪裡。
hasEventListener()與willTrigger()各檢查什麼?
`hasEventListener()`方法:檢查EventDispatcher對象本身是否有註冊這個事件的監聽器。
`willTrigger()`方法:檢查此EventDispatcher對象或其父容器是否有註冊這個事件的監聽器。
所以兩者的區別是:
| 方法 | 檢查範圍 | 是否看capture值 |
|---|---|---|
| `hasEventListener()` | 只檢查它所屬的對象 | — |
| `willTrigger()` | 檢查對象以及對象的父容器 | 不管capture的值 |
實際trace的結果長什麼樣?
假如像下面這樣的物件階層來說:

對stage註冊事件,box會回傳什麼?
今天我對stage註冊事件:
```actionscript
stage.addEventListener(MouseEvent.CLICK, stageClick);
```
則檢查box的willTrigger及hasEventListener:
```actionscript
trace(box.willTrigger(MouseEvent.CLICK));
trace(box.hasEventListener(MouseEvent.CLICK));
```
結果為:
```
true
false
```
對box註冊事件,box自己會回傳什麼?
而若我對box註冊事件:
```actionscript
box.addEventListener(MouseEvent.CLICK, stageClick);
```
則檢查box的willTrigger及hasEventListener:
```actionscript
trace(box.willTrigger(MouseEvent.CLICK));
trace(box.hasEventListener(MouseEvent.CLICK));
```
結果為:
```
true
true
```
對box註冊事件,stage會回傳什麼?
同樣是對box註冊事件,這次檢查stage的willTrigger及hasEventListener:
```actionscript
trace(stage.willTrigger(MouseEvent.CLICK));
trace(stage.hasEventListener(MouseEvent.CLICK));
```
結果為:
```
false
false
```
這代表box不在stage完整可能有的事件流的動線裡。
延伸閱讀
- AS3 hasEventListener() 與 willTrigger() 的區別:事件監聽檢查完整解析:同樣聚焦 Event,可接著比較不同情境的做法。
- Starling Display Objects 介紹:Starling 啟動、物件樹與 Stage:同樣聚焦 ActionScript,可接著比較不同情境的做法。
- Starling Display Objects:Button 與 Sprite 實作重點:同樣聚焦 ActionScript,可接著比較不同情境的做法。
常見問題
hasEventListener()和willTrigger()最大的差別是什麼?
`hasEventListener()`只檢查該EventDispatcher物件本身是否註冊了這個事件的監聽器;`willTrigger()`則會檢查物件本身以及它的父容器整條鏈,且不管capture的值。所以對父層註冊事件時,子物件的`willTrigger()`回傳true,`hasEventListener()`回傳false。
為什麼對stage註冊事件後,box的willTrigger()是true?
因為`willTrigger()`會沿著顯示清單往上檢查物件與其父容器。stage是box的父容器且已註冊監聽器,所以box的`willTrigger()`回傳true,但box本身沒註冊,`hasEventListener()`回傳false。
什麼時候該用hasEventListener()、什麼時候該用willTrigger()?
想知道「這個物件自己有沒有掛監聽器」就用`hasEventListener()`,適合避免重複註冊。想知道「這個事件傳遞過程中會不會被處理」就用`willTrigger()`,適合在事件流除錯時確認監聽器是否在動線上。
參考資料
最後更新
2026-08-28(原文發布於 2013-08-30,本文保留原始筆記內容並補上 GEO 結構。)
關於作者 {#author}
Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。
首次發布:2013-08-30
