螢幕上顯示程式碼的開發環境特寫,象徵事件監聽與除碼檢查的過程

← INSIGHTS & PERSPECTIVES | 前端開發

hasEventListener()與willTrigger()區別

AS3的hasEventListener()只檢查物件本身是否註冊事件監聽器,willTrigger()則會連同父容器一起檢查。我用stage與box的實例trace兩者回傳結果,整理成對照表,幫你搞懂事件監聽檢查函數的差異。

承接我上一篇介紹Event事件流的基本概念AS3的事件傳遞機制(Event、dispatchEvent及addEventListener),這篇繼續介紹兩個相關的檢查函數:`hasEventListener()`與`willTrigger()`。我用一個具體的物件階層範例,實際trace兩種方法的回傳結果,一看就懂差別在哪裡。

hasEventListener()與willTrigger()各檢查什麼?

`hasEventListener()`方法:檢查EventDispatcher對象本身是否有註冊這個事件的監聽器。

`willTrigger()`方法:檢查此EventDispatcher對象或其父容器是否有註冊這個事件的監聽器。

所以兩者的區別是:

方法檢查範圍是否看capture值
`hasEventListener()`只檢查它所屬的對象
`willTrigger()`檢查對象以及對象的父容器不管capture的值

實際trace的結果長什麼樣?

假如像下面這樣的物件階層來說:

物件階層示意圖

Q對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

```

Q對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

```

Q對box註冊事件,stage會回傳什麼?

同樣是對box註冊事件,這次檢查stage的willTrigger及hasEventListener:

```actionscript

trace(stage.willTrigger(MouseEvent.CLICK));

trace(stage.hasEventListener(MouseEvent.CLICK));

```

結果為:

```

false

false

```

這代表box不在stage完整可能有的事件流的動線裡。

延伸閱讀

常見問題

QhasEventListener()和willTrigger()最大的差別是什麼?

`hasEventListener()`只檢查該EventDispatcher物件本身是否註冊了這個事件的監聽器;`willTrigger()`則會檢查物件本身以及它的父容器整條鏈,且不管capture的值。所以對父層註冊事件時,子物件的`willTrigger()`回傳true,`hasEventListener()`回傳false。

Q為什麼對stage註冊事件後,box的willTrigger()是true?

因為`willTrigger()`會沿著顯示清單往上檢查物件與其父容器。stage是box的父容器且已註冊監聽器,所以box的`willTrigger()`回傳true,但box本身沒註冊,`hasEventListener()`回傳false。

Q什麼時候該用hasEventListener()、什麼時候該用willTrigger()?

想知道「這個物件自己有沒有掛監聽器」就用`hasEventListener()`,適合避免重複註冊。想知道「這個事件傳遞過程中會不會被處理」就用`willTrigger()`,適合在事件流除錯時確認監聽器是否在動線上。

參考資料

最後更新

2026-08-28(原文發布於 2013-08-30,本文保留原始筆記內容並補上 GEO 結構。)

關於作者 {#author}

Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。

首次發布:2013-08-30