2011-07-29 12 views
17

Estoy tratando de obtener una mejor comprensión de las técnicas orientadas a objetos en el script de Java.cómo crear un evento personalizado desde un objeto de script java

Tengo el siguiente objeto (Trivial).

function CustomObject() { 
    this.size = 1; 
}; 

CustomObject.prototype.addSize = function() { 
    this.size += 1; 
    if(this.size > 5) { 
     //Raise custom Event 
    } 
}; 

Y lo estoy instalando así.

var myObject = new CustomObject(); 
    myObject.addSize(); 

    // Add listener for custom event from with in my Custom Object. 
    // Something like this.... 
    myObject.addEventListener("CustomEvent", handelCustomEvent, false); 

    function handelCustomEvent() {} 

¿Cómo criar a un evento personalizado en mi objeto personalizado y luego escuchar a ese evento en la matriz? ¿Es esto posible incluso en el script de Java?

+0

Gracias por eso. Eché un vistazo a las cosas de jquery, se ve bien, excepto que parece que requiere elementos DOM. –

Respuesta

12

Puede hacerlo creando su clase de evento personalizado que tiene funciones relacionadas con detector y desencadenador. Encontré un good article sobre esto. La clase se implementa así:

//Copyright (c) 2010 Nicholas C. Zakas. All rights reserved. 
//MIT License 

function EventTarget(){ 
    this._listeners = {}; 
} 

EventTarget.prototype = { 

    constructor: EventTarget, 

    addListener: function(type, listener){ 
     if (typeof this._listeners[type] == "undefined"){ 
      this._listeners[type] = []; 
     } 

     this._listeners[type].push(listener); 
    }, 

    fire: function(event){ 
     if (typeof event == "string"){ 
      event = { type: event }; 
     } 
     if (!event.target){ 
      event.target = this; 
     } 

     if (!event.type){ //falsy 
      throw new Error("Event object missing 'type' property."); 
     } 

     if (this._listeners[event.type] instanceof Array){ 
      var listeners = this._listeners[event.type]; 
      for (var i=0, len=listeners.length; i < len; i++){ 
       listeners[i].call(this, event); 
      } 
     } 
    }, 

    removeListener: function(type, listener){ 
     if (this._listeners[type] instanceof Array){ 
      var listeners = this._listeners[type]; 
      for (var i=0, len=listeners.length; i < len; i++){ 
       if (listeners[i] === listener){ 
        listeners.splice(i, 1); 
        break; 
       } 
      } 
     } 
    } 
}; 

Pero, como dijo el escritor, esta clase no está completa. Tiene algunas limitaciones. Entonces recomiendo usar jQuery en su lugar. Puede usar su evento personalizado fácilmente con la función bind() y trigger(). Hay un buen hilo acerca de esto. Si ve Custom events in jQuery?, descubrirá cómo implementarlo con jQuery.

2

Gracias a @Sangdol por el enlace al objeto de evento personalizado. El uso de las ideas en que se me ocurrió con la siguiente solución

function CustomObject (type, listener) { 
    this.size = 1; 
    this.subscriberType = type; 
    this.subscriberListener = listener; 
}; 

CustomObject.prototype.addSize = function() { 
    this.size += 1; 
    if (this.size > 5) { 
     this.subscriberListener.call(this.subscriberType); 
    } 
}; 

// Test the event 
var myObject = new CustomObject(Document, handelCustomEvent); 

myObject.addSize(); 
myObject.addSize(); 
myObject.addSize(); 
myObject.addSize(); 
myObject.addSize(); 
myObject.addSize(); 
myObject.addSize();  

function handelCustomEvent() { alert("Event"); } 

No es una solución perfecta, pero es lo suficientemente para mis propósitos.

Cuestiones relacionadas