Home Reference Source

js/util/ListenerManager.js

  1. /**
  2. * @typedef EventListenerEntry
  3. * @type {{
  4. * evt: string,
  5. * listener: EventListener
  6. * }}
  7. */
  8.  
  9. /**
  10. * 이벤트 리스너들을 한번에 정리할 수 있도록 도와주는 매니저.
  11. */
  12. export default class ListenerManager {
  13. constructor () {
  14. /** @type {Map<any, EventListenerEntry>} */
  15. this.listeners = []
  16. }
  17.  
  18. /**
  19. * 이벤트 리스너를 추가합니다.
  20. * @param {any} target 이벤트 리스너를 추가할 대상
  21. * @param {string} evt 이벤트 이름
  22. * @param {EventListener} listener 이벤트 리스너
  23. * @param {...any} args `addEventListener`에 전달할 추가 인수들
  24. */
  25. add (target, evt, listener, ...args) {
  26. if ('addEventListener' in target) {
  27. target.addEventListener(evt, listener, ...args)
  28. } else if ('on' in target) {
  29. target.on(evt, listener, ...args)
  30. }
  31.  
  32. const entry = {
  33. evt,
  34. listener
  35. }
  36. this.listeners.push([target, entry])
  37. }
  38.  
  39. /**
  40. * 모든 이벤트 리스너들을 정리합니다.
  41. */
  42. clear () {
  43. for (const [target, entry] of this.listeners) {
  44. if ('removeEventListener' in target) {
  45. target.removeEventListener(entry.evt, entry.listener)
  46. } else if ('off' in target) {
  47. target.off(entry.evt, entry.listener)
  48. }
  49. }
  50. this.listeners.length = 0
  51. }
  52. }