js/util/ListenerManager.js
- /**
- * @typedef EventListenerEntry
- * @type {{
- * evt: string,
- * listener: EventListener
- * }}
- */
-
- /**
- * 이벤트 리스너들을 한번에 정리할 수 있도록 도와주는 매니저.
- */
- export default class ListenerManager {
- constructor () {
- /** @type {Map<any, EventListenerEntry>} */
- this.listeners = []
- }
-
- /**
- * 이벤트 리스너를 추가합니다.
- * @param {any} target 이벤트 리스너를 추가할 대상
- * @param {string} evt 이벤트 이름
- * @param {EventListener} listener 이벤트 리스너
- * @param {...any} args `addEventListener`에 전달할 추가 인수들
- */
- add (target, evt, listener, ...args) {
- if ('addEventListener' in target) {
- target.addEventListener(evt, listener, ...args)
- } else if ('on' in target) {
- target.on(evt, listener, ...args)
- }
-
- const entry = {
- evt,
- listener
- }
- this.listeners.push([target, entry])
- }
-
- /**
- * 모든 이벤트 리스너들을 정리합니다.
- */
- clear () {
- for (const [target, entry] of this.listeners) {
- if ('removeEventListener' in target) {
- target.removeEventListener(entry.evt, entry.listener)
- } else if ('off' in target) {
- target.off(entry.evt, entry.listener)
- }
- }
- this.listeners.length = 0
- }
- }