142 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| window.EventPubSub=function EventPubSub() {
 | |
|   this._events_={};
 | |
|   this.publish=this.trigger=this.emit=emit;
 | |
|   this.subscribe=this.on=on;
 | |
|   this.once=once;
 | |
|   this.unSubscribe=this.off=off;
 | |
|   this.emit$=emit$;
 | |
| 
 | |
|   function on(type,handler,once){
 | |
|       if(!handler){
 | |
|           throw new ReferenceError('handler not defined.');
 | |
|       }
 | |
| 
 | |
|       if(!this._events_[type]){
 | |
|           this._events_[type]=[];
 | |
|       }
 | |
| 
 | |
|       if(once){
 | |
|           handler._once_ = once;
 | |
|       }
 | |
|       this._events_[type].push(handler);
 | |
|       return this;
 | |
|   }
 | |
| 
 | |
|   function once(type,handler){
 | |
|       return this.on(type, handler, true);
 | |
|   }
 | |
| 
 | |
|   function off(type,handler){
 | |
|       if(!this._events_[type]){
 | |
|           return this;
 | |
|       }
 | |
| 
 | |
|       if(!handler){
 | |
|           throw new ReferenceError('handler not defined. if you wish to remove all handlers from the event please pass "*" as the handler');
 | |
|       }
 | |
| 
 | |
|       if(handler=='*'){
 | |
|           delete this._events_[type];
 | |
|           return this;
 | |
|       }
 | |
| 
 | |
|       var handlers=this._events_[type];
 | |
| 
 | |
|       while(handlers.includes(handler)){
 | |
|           handlers.splice(
 | |
|               handlers.indexOf(handler),
 | |
|               1
 | |
|           );
 | |
|       }
 | |
| 
 | |
|       if(handlers.length<1){
 | |
|           delete this._events_[type];
 | |
|       }
 | |
| 
 | |
|       return this;
 | |
|   }
 | |
| 
 | |
|   function emit(type){
 | |
|       this.emit$.apply(this, arguments);
 | |
|       if(!this._events_[type]){
 | |
|           return this;
 | |
|       }
 | |
|       arguments.splice=Array.prototype.splice;
 | |
|       arguments.splice(0,1);
 | |
| 
 | |
|       var handlers=this._events_[type];
 | |
|       var onceHandled=[];
 | |
| 
 | |
|       for(var i in handlers){
 | |
|           var handler=handlers[i];
 | |
|           handler.apply(this, arguments);
 | |
|           if(handler._once_){
 | |
|             onceHandled.push(handler);
 | |
|           }
 | |
|       }
 | |
| 
 | |
|       for(var i in onceHandled){
 | |
|           this.off(
 | |
|             type,
 | |
|             onceHandled[i]
 | |
|           );
 | |
|       }
 | |
| 
 | |
|       return this;
 | |
|   }
 | |
| 
 | |
|   function emit$(type, args){
 | |
|       if(!this._events_['*']){
 | |
|           return this;
 | |
|       }
 | |
| 
 | |
|       var catchAll=this._events_['*'];
 | |
| 
 | |
|       args.shift=Array.prototype.shift;
 | |
|       args.shift(type);
 | |
| 
 | |
|       for(var handler of catchAll){
 | |
|           handler.apply(this, args);
 | |
|       }
 | |
| 
 | |
|       return this;
 | |
|   }
 | |
| 
 | |
|   return this;
 | |
| }
 | |
| 
 | |
| if (!Array.prototype.includes) {
 | |
|   Array.prototype.includes = function(searchElement /*, fromIndex*/) {
 | |
|     'use strict';
 | |
|     if (this == null) {
 | |
|       throw new TypeError('Array.prototype.includes called on null or undefined');
 | |
|     }
 | |
| 
 | |
|     var O = Object(this);
 | |
|     var len = parseInt(O.length, 10) || 0;
 | |
|     if (len === 0) {
 | |
|       return false;
 | |
|     }
 | |
|     var n = parseInt(arguments[1], 10) || 0;
 | |
|     var k;
 | |
|     if (n >= 0) {
 | |
|       k = n;
 | |
|     } else {
 | |
|       k = len + n;
 | |
|       if (k < 0) {k = 0;}
 | |
|     }
 | |
|     var currentElement;
 | |
|     while (k < len) {
 | |
|       currentElement = O[k];
 | |
|       if (searchElement === currentElement ||
 | |
|          (searchElement !== searchElement && currentElement !== currentElement)) { // NaN !== NaN
 | |
|         return true;
 | |
|       }
 | |
|       k++;
 | |
|     }
 | |
|     return false;
 | |
|   };
 | |
| }
 |