Brak opisu

EventTarget.js 1.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Copyright 2016 wkh237@github. All rights reserved.
  2. // Use of this source code is governed by a MIT-style license that can be
  3. // found in the LICENSE file.
  4. import Log from '../utils/log.js'
  5. const log = new Log('EventTarget')
  6. export default class EventTarget {
  7. listeners : any;
  8. constructor() {
  9. log.info('constructor called')
  10. this.listeners = {}
  11. }
  12. /**
  13. * Add an event listener to given event type
  14. * @param {string} type Event type string
  15. * @param {(Event) => void} cb Event handler function
  16. */
  17. addEventListener(type:string, cb : () => void) {
  18. log.info('add event listener', type, cb)
  19. if(!(type in this.listeners)) {
  20. this.listeners[type] = []
  21. }
  22. this.listeners[type].push(cb)
  23. }
  24. /**
  25. * Remove an event listener
  26. * @param {string} type Type of the event listener
  27. * @param {()=>void} cb Event listener function.
  28. * @return {[type]} [description]
  29. */
  30. removeEventListener(type:string, cb:() => void) {
  31. log.info('remove event listener', type, cb)
  32. if(!(type in this.listeners))
  33. return
  34. let handlers = this.listeners[type]
  35. for(let i in handlers) {
  36. if(cb === handlers[i]) {
  37. handlers.splice(i,1)
  38. return this.removeEventListener(type, cb)
  39. }
  40. }
  41. }
  42. /**
  43. * Dispatch an event
  44. * @param {Evnet} event Event data payload.
  45. */
  46. dispatchEvent(event:Event) {
  47. log.info('dispatch event', event)
  48. if(!(event.type in this.listeners))
  49. return
  50. let handlers = this.listeners[event.type]
  51. for(let i in handlers) {
  52. handlers[i].call(this, event)
  53. }
  54. }
  55. /**
  56. * Remove all registered listeners from this object.
  57. * @nonstandard
  58. * @return {[type]} [description]
  59. */
  60. clearEventListeners() {
  61. for(let i in this.listeners) {
  62. delete listeners[i]
  63. }
  64. }
  65. }