2010-02-13 9 views
6

Hola ... Estoy usando mucho Flash y mis clases usan la clase EventDispatcher que me permite definir eventos personalizados de una clase. ¿Cómo puedo hacer esto en javascript?Javascript dispatchEvent

me gustaría hacer algo como esto:

var MyClass = function() { 
}; 
MyClass.prototype = { 
    test : function() { 
    dispatchEvent('ON_TEST'); 
    } 
}; 

var mc = new MyClass(); 
mc.addEventListener('ON_TEST', handler); 
function handler() { alert('working...') } 

¿Cómo es posible este con Javascript?

Respuesta

20

Tienes que hacer el tuyo. Aquí hay solo una forma.

var MyClass = function() { 
    this._events = {}; 
}; 
MyClass.prototype = { 
    addListener: function(eventName, callback) { 
     var events = this._events, 
      callbacks = events[eventName] = events[eventName] || []; 
     callbacks.push(callback); 
    }, 
    raiseEvent: function(eventName, args) { 
     var callbacks = this._events[eventName]; 
     for (var i = 0, l = callbacks.length; i < l; i++) { 
      callbacks[i].apply(null, args); 
     } 
    }, 
    test : function() { 
    this.raiseEvent('ON_TEST', [1,2,3]); // whatever args to pass to listeners 
    } 
}; 

probablemente debería también añadir un 'removeListener', que tendría que buscar la devolución de llamada en la matriz y sacarlo de la matriz (o, posiblemente, eliminar todos los oyentes de todo un evento si no hay devolución de llamada dada).

+0

esto es genial, después de todos estos años sigue siendo una muy buena solución :) – luschn

+0

pregunta rápida, dentro addListener, ¿por qué todas las variables? ¿No podría hacer 'function (eventName, callback) {(this._events [eventName] = this._events [eventName] || []) push (callback); }, '? o es solo una cuestión de legibilidad? – WORMSS

+0

Legibilidad, seguro, ¿por qué favorecer la astucia? Pero también, técnicamente, estás accediendo a esto._eventos dos veces allí. – InfinitiesLoop