オリジナルJavaScriptで実現したEventEmitter

3810 ワード

NodejsのEventEmitter機能と似ています.ブラウザのカスタムイベントクラスに適しています.イベントの発生回数をカスタマイズできる機能が新たに追加された.
詳しくは
https://github.com/webery/ajax/tree/master
ソースコードとテストコードが含まれている.厳密なテストは行われず、一時的に最初のバージョンとなる.まだ最適化の点がたくさんありますが、今はただの参考です.
使用方法
フロントエンドテストファイル:emit.ejs


  
    
    <link rel="stylesheet" href="/stylesheets/style.css"/>
	<script type="text/javascript" src="/javascripts/eventemitter.js"/>
  
  
    <input type="button" id="submit" value="click"/>
  
  <script type="text/javascript">
     document.getElementById('submit').onclick = function() {
	 /*
	    var emit = new EventEmitter();
		
		emit.on('click', function() {
		  console.log('clcik');
		}, 2);
		emit.trigger('click');
		emit.trigger('click');
		emit.trigger('click');
	 */
	 var Target = function(){};
	 EventEmitter.inherit(Target);
	 var test = new Target();
	  test.on('click', function() {
		  console.log('clcik');
		}, 2);
		 test.trigger('click');
		 test.trigger('click');

	 };
  </script>

</code></pre> 
  <br/> 
  <br/> 
  <p>   :eventemitter.js</p> 
   
  <pre><code>/**
   author:weber yang
   2015.7.31
         EventEmitter   ,       ,               ,
           EventEmiiter  。
**/
;(function (window, undefined) {
	'use strict';
	/*    */
	var EventEmitter = function() {
		this.events = {};//    ,     {'eventName1':[{listener:function     , time:     }], 'eventName2':[],}
	};
	
	EventEmitter.prototype.once = function(evt, listener) {
		 return this.addListener(evt, listener, 0);
	};
	/*       */
	EventEmitter.prototype.getEvents = function() {
		return this.events || (this.events = {});
	}
	/*             */
	EventEmitter.prototype.getListeners = function(evt) {
		 var events = this.getEvents();
		 return events[evt] || (events[evt] = []);
	};
	/**
	          
	  evet:    
	  listener:      
	  time:  ,         ,-1     ,   -1
	**/
	EventEmitter.prototype.on = function(evt, listener, time) {
		time = typeof(time) == 'number' ? time : -1;
		time = time >= -1 ? time : -1; 
		var listeners = this.getListeners(evt);
		var listenerWrapper = {
			listener:listener,
			time:time,
		};
		listeners.push(listenerWrapper);
		
        return this;
	};
	/*addListener  on    */
	EventEmitter.prototype.addListener = EventEmitter.prototype.on;
	/*           */
	EventEmitter.prototype.off = function(evt) {
		var events = this.getEvents();
		events[evt] = [];
	};
	EventEmitter.prototype.removeEvent = EventEmitter.prototype.off;
	
	/**
	             listener
	**/
	EventEmitter.prototype.removeListener = function(evt, listener) {
		var listeners = this.getListeners(evt);
		for(var i=0; i<listeners.length i="" if="" listener="" delete="" listeners="" eventemitter.prototype.trigger="function(evt," args="" var="" for="" listener.time--="" this.removelistener="" listener.listener="" listener.listener.apply="" eventemitter.prototype.fire="EventEmitter.prototype.trigger;" eventemitter.prototype.emit="function(evt)" return="" this.trigger="" eventemitter.inherit="function(target)" throw="" target="" have="" prototype="" soupto="EventEmitter.prototype;" tarpto="target.prototype;" key="" in="" window.eventemitter="EventEmitter;"/></code></pre> 
  <br/> 
  <br/> 
 </div> 
</div>
                            </div>
                        </div>