EventDispatcher.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /**
  2. * This modules allows to dispatch event objects on custom JavaScript objects.
  3. *
  4. * Main repository: [eventdispatcher.js]{@link https://github.com/mrdoob/eventdispatcher.js/}
  5. *
  6. * Code Example:
  7. * ```js
  8. * class Car extends EventDispatcher {
  9. * start() {
  10. * this.dispatchEvent( { type: 'start', message: 'vroom vroom!' } );
  11. * }
  12. *};
  13. *
  14. * // Using events with the custom object
  15. * const car = new Car();
  16. * car.addEventListener( 'start', function ( event ) {
  17. * alert( event.message );
  18. * } );
  19. *
  20. * car.start();
  21. * ```
  22. */
  23. class EventDispatcher {
  24. /**
  25. * Adds the given event listener to the given event type.
  26. *
  27. * @param {string} type - The type of event to listen to.
  28. * @param {Function} listener - The function that gets called when the event is fired.
  29. */
  30. addEventListener( type, listener ) {
  31. if ( this._listeners === undefined ) this._listeners = {};
  32. const listeners = this._listeners;
  33. if ( listeners[ type ] === undefined ) {
  34. listeners[ type ] = [];
  35. }
  36. if ( listeners[ type ].indexOf( listener ) === - 1 ) {
  37. listeners[ type ].push( listener );
  38. }
  39. }
  40. /**
  41. * Returns `true` if the given event listener has been added to the given event type.
  42. *
  43. * @param {string} type - The type of event.
  44. * @param {Function} listener - The listener to check.
  45. * @return {boolean} Whether the given event listener has been added to the given event type.
  46. */
  47. hasEventListener( type, listener ) {
  48. const listeners = this._listeners;
  49. if ( listeners === undefined ) return false;
  50. return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;
  51. }
  52. /**
  53. * Removes the given event listener from the given event type.
  54. *
  55. * @param {string} type - The type of event.
  56. * @param {Function} listener - The listener to remove.
  57. */
  58. removeEventListener( type, listener ) {
  59. const listeners = this._listeners;
  60. if ( listeners === undefined ) return;
  61. const listenerArray = listeners[ type ];
  62. if ( listenerArray !== undefined ) {
  63. const index = listenerArray.indexOf( listener );
  64. if ( index !== - 1 ) {
  65. listenerArray.splice( index, 1 );
  66. }
  67. }
  68. }
  69. /**
  70. * Dispatches an event object.
  71. *
  72. * @param {Object} event - The event that gets fired.
  73. */
  74. dispatchEvent( event ) {
  75. const listeners = this._listeners;
  76. if ( listeners === undefined ) return;
  77. const listenerArray = listeners[ event.type ];
  78. if ( listenerArray !== undefined ) {
  79. event.target = this;
  80. // Make a copy, in case listeners are removed while iterating.
  81. const array = listenerArray.slice( 0 );
  82. for ( let i = 0, l = array.length; i < l; i ++ ) {
  83. array[ i ].call( this, event );
  84. }
  85. event.target = null;
  86. }
  87. }
  88. }
  89. export { EventDispatcher };
粤ICP备19079148号