55 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
/**
 | 
						|
 * Simple global events manager
 | 
						|
 */
 | 
						|
class Events {
 | 
						|
    constructor() {
 | 
						|
        this.listeners = {};
 | 
						|
        this.stack = [];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Emit a custom event for any handlers to pick-up.
 | 
						|
     * @param {String} eventName
 | 
						|
     * @param {*} eventData
 | 
						|
     * @returns {Events}
 | 
						|
     */
 | 
						|
    emit(eventName, eventData) {
 | 
						|
        this.stack.push({name: eventName, data: eventData});
 | 
						|
        if (typeof this.listeners[eventName] === 'undefined') return this;
 | 
						|
        let eventsToStart = this.listeners[eventName];
 | 
						|
        for (let i = 0; i < eventsToStart.length; i++) {
 | 
						|
            let event = eventsToStart[i];
 | 
						|
            event(eventData);
 | 
						|
        }
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Listen to a custom event and run the given callback when that event occurs.
 | 
						|
     * @param {String} eventName
 | 
						|
     * @param {Function} callback
 | 
						|
     * @returns {Events}
 | 
						|
     */
 | 
						|
    listen(eventName, callback) {
 | 
						|
        if (typeof this.listeners[eventName] === 'undefined') this.listeners[eventName] = [];
 | 
						|
        this.listeners[eventName].push(callback);
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Emit an event for public use.
 | 
						|
     * Sends the event via the native DOM event handling system.
 | 
						|
     * @param {Element} targetElement
 | 
						|
     * @param {String} eventName
 | 
						|
     * @param {Object} eventData
 | 
						|
     */
 | 
						|
    emitPublic(targetElement, eventName, eventData) {
 | 
						|
        const event = new CustomEvent(eventName, {
 | 
						|
            detail: eventData,
 | 
						|
            bubbles: true
 | 
						|
        });
 | 
						|
        targetElement.dispatchEvent(event);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
export default Events; |