1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- /**
- * The function for providing an Event object simply managing events.
- *
- * @author Naotoshi Fujita
- * @copyright Naotoshi Fujita. All rights reserved.
- */
- /**
- * The function for providing an Event object simply managing events.
- */
- export default () => {
- /**
- * Store all event data.
- *
- * @type {Array}
- */
- let data = [];
- const Event = {
- /**
- * Subscribe the given event(s).
- *
- * @param {string} events - An event name. Use space to separate multiple events.
- * Also, namespace is accepted by dot, such as 'resize.{namespace}'.
- * @param {function} handler - A callback function.
- * @param {Element} elm - Optional. Native event will be listened to when this arg is provided.
- * @param {Object} options - Optional. Options for addEventListener.
- */
- on( events, handler, elm = null, options = {} ) {
- events.split( ' ' ).forEach( event => {
- if ( elm ) {
- elm.addEventListener( event, handler, options );
- }
- data.push( { event, handler, elm, options } );
- } );
- },
- /**
- * Unsubscribe the given event(s).
- *
- * @param {string} events - A event name or names split by space.
- * @param {Element} elm - Optional. removeEventListener() will be called when this arg is provided.
- */
- off( events, elm = null ) {
- events.split( ' ' ).forEach( event => {
- data = data.filter( item => {
- if ( item && item.event === event && item.elm === elm ) {
- unsubscribe( item );
- return false;
- }
- return true;
- } );
- } );
- },
- /**
- * Emit an event.
- * This method is only for custom events.
- *
- * @param {string} event - An event name.
- * @param {*} args - Any number of arguments passed to handlers.
- */
- emit( event, ...args ) {
- data.forEach( item => {
- if ( ! item.elm && item.event.split( '.' )[0] === event ) {
- item.handler( ...args );
- }
- } );
- },
- /**
- * Clear event data.
- */
- destroy() {
- data.forEach( unsubscribe );
- data = [];
- },
- };
- /**
- * Remove the registered event listener.
- *
- * @param {Object} item - An object containing event data.
- */
- function unsubscribe( item ) {
- if ( item.elm ) {
- item.elm.removeEventListener( item.event, item.handler, item.options );
- }
- }
- return Event;
- }
|