event.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /**
  2. * The function for providing an Event object simply managing events.
  3. *
  4. * @author Naotoshi Fujita
  5. * @copyright Naotoshi Fujita. All rights reserved.
  6. */
  7. /**
  8. * The function for providing an Event object simply managing events.
  9. */
  10. export default () => {
  11. /**
  12. * Store all event data.
  13. *
  14. * @type {Array}
  15. */
  16. let data = [];
  17. const Event = {
  18. /**
  19. * Subscribe the given event(s).
  20. *
  21. * @param {string} events - An event name. Use space to separate multiple events.
  22. * Also, namespace is accepted by dot, such as 'resize.{namespace}'.
  23. * @param {function} handler - A callback function.
  24. * @param {Element} elm - Optional. Native event will be listened to when this arg is provided.
  25. * @param {Object} options - Optional. Options for addEventListener.
  26. */
  27. on( events, handler, elm = null, options = {} ) {
  28. events.split( ' ' ).forEach( event => {
  29. if ( elm ) {
  30. elm.addEventListener( event, handler, options );
  31. }
  32. data.push( { event, handler, elm, options } );
  33. } );
  34. },
  35. /**
  36. * Unsubscribe the given event(s).
  37. *
  38. * @param {string} events - A event name or names split by space.
  39. * @param {Element} elm - Optional. removeEventListener() will be called when this arg is provided.
  40. */
  41. off( events, elm = null ) {
  42. events.split( ' ' ).forEach( event => {
  43. data = data.filter( item => {
  44. if ( item && item.event === event && item.elm === elm ) {
  45. unsubscribe( item );
  46. return false;
  47. }
  48. return true;
  49. } );
  50. } );
  51. },
  52. /**
  53. * Emit an event.
  54. * This method is only for custom events.
  55. *
  56. * @param {string} event - An event name.
  57. * @param {*} args - Any number of arguments passed to handlers.
  58. */
  59. emit( event, ...args ) {
  60. data.forEach( item => {
  61. if ( ! item.elm && item.event.split( '.' )[0] === event ) {
  62. item.handler( ...args );
  63. }
  64. } );
  65. },
  66. /**
  67. * Clear event data.
  68. */
  69. destroy() {
  70. data.forEach( unsubscribe );
  71. data = [];
  72. },
  73. };
  74. /**
  75. * Remove the registered event listener.
  76. *
  77. * @param {Object} item - An object containing event data.
  78. */
  79. function unsubscribe( item ) {
  80. if ( item.elm ) {
  81. item.elm.removeEventListener( item.event, item.handler, item.options );
  82. }
  83. }
  84. return Event;
  85. }