螢幕上顯示彩色語法突顯的程式碼,代表事件監聽程式開發

← INSIGHTS & PERSPECTIVES | 前端開發

AS3 hasEventListener() 與 willTrigger() 的區別:事件監聽檢查完整解析

深入解析 ActionScript 3 的 hasEventListener() 與 willTrigger() 差異:hasEventListener() 只檢查物件本身的事件監聽器,willTrigger() 會連父容器一起檢查。附事件流物件階層實例與 trace 結果對照表,幫你快速搞懂 AS3 事件機制。

承上一篇介紹 Event 事件流的基本概念 AS3 的事件傳遞機制(Event、dispatchEvent 及 addEventListener),這篇再來介紹兩個相關的檢查函數:hasEventListener()willTrigger()。看完你會清楚知道:兩者只差在「要不要連父容器一起檢查」。

hasEventListener() 和 willTrigger() 有什麼不同?

  • hasEventListener() 方法:檢查這個 EventDispatcher 物件本身是否註冊了這個事件的監聽器。
  • willTrigger() 方法:檢查這個 EventDispatcher 物件或其父容器是否註冊了這個事件。

所以兩者的區別是:hasEventListener() 只檢查它所屬的物件本身;而 willTrigger() 會檢查物件以及物件的父容器是否有註冊這個事件(不管 capture 的值)。

方法檢查範圍是否含父容器
hasEventListener()物件本身
willTrigger()物件 + 整條事件流

實例驗證:用物件階層 trace 出差異

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

物件階層示意圖:stage 底下有 box 等顯示物件

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

今天我們對 stage 註冊事件:

stage.addEventListener(MouseEvent.CLICK, stageClick);

則檢查 box 的 willTrigger()hasEventListener()

trace(box.willTrigger(MouseEvent.CLICK));
trace(box.hasEventListener(MouseEvent.CLICK));

結果為:

true
false

因為事件會沿著事件流經過 box,所以 willTrigger() 回傳 true;但監聽器並不是註冊在 box 身上,所以 hasEventListener() 回傳 false

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

而若我們對 box 註冊事件:

box.addEventListener(MouseEvent.CLICK, stageClick);

則檢查 box 的 willTrigger()hasEventListener()

trace(box.willTrigger(MouseEvent.CLICK));
trace(box.hasEventListener(MouseEvent.CLICK));

結果為:

true
true

監聽器就註冊在 box 本身,兩個方法都回傳 true

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

同樣對 box 註冊事件,改檢查 stage 的 willTrigger()hasEventListener()

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

結果為:

false
false

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

常見問題

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

hasEventListener() 只檢查該物件本身有沒有註冊這個事件的監聽器;willTrigger() 則會沿著顯示清單,檢查物件本身及其父容器(整條事件流)有沒有註冊,且不受 capture 參數影響。

Q為什麼對 stage 註冊事件後,box.willTrigger() 是 true 但 hasEventListener() 是 false?

因為事件會在顯示清單中沿著事件流經過 box,willTrigger() 檢查的是「這個事件會不會觸發到這個物件」,所以回傳 true;但監聽器實際註冊在 stage 身上,hasEventListener() 只看物件本身,因此回傳 false。

QwillTrigger() 會受到 useCapture 參數影響嗎?

不會。willTrigger() 檢查的是整條事件流上有沒有註冊該事件,不管監聽器是在 capture 階段還是 bubble 階段註冊,都會被檢查到。

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

想確認「事件會不會傳遞到這個物件」時用 willTrigger(),例如除錯事件流問題;想確認「這個物件自己有沒有掛上監聽器」時用 hasEventListener(),例如避免重複註冊同一個監聽器。

參考資料

延伸閱讀

最後更新

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

關於作者

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

首次發布:2013-08-30