2010-11-26 9 views
10

Supongamos que tengo un objeto con una función miembro que devuelve sí:¿Puedo crear un evento personalizado en Javascript para un objeto que creé?

/* -- Object 1 -- */ 
function Object1(){ 
    this.me  = new Image(10,10); 
    this.me.src = "someImgUrl.jpg"; 
    this.publish = function(){ 
     return this.me; 
    } 
} 

En la producción:

var Obj1 = new Object1(); 
document.body.appendChild(Obj1.publish()); 

Ahora, supongamos que se quiere crear un evento que se activa cuando publican del objeto() método se llama, pero después de que se devuelve la imagen (algo similar a un evento "onPublished()"). Diga, para cambiar las dimensiones de la imagen a 100x100. ¿Cómo podría crearlo y dónde lo "adjuntaría"?

Si no estoy siendo lo suficientemente claro, házmelo saber. Esta es la demostración más simple que pude pensar.

Respuesta

8

Un ejemplo sencillo:

function Object1() { 
    'use strict'; 

    this.me = new Image(10, 10); 
    this.me.src = "someImgUrl.jpg"; 
    this.publish = function() { 
     if (typeof this.onPublish === "function") { 
      setTimeout(this.onPublish, 1); 
     } 

     return this.me; 
    }; 
} 

var Obj1 = new Object1(); 
Obj1.onPublish = function() { 
    // do stuff 
}; 

Obj1.publish(); 
+2

Esto parece que va a ejecutar el evento onPublish() antes del envío de la imagen (si ese no es el caso, por favor hágamelo saber). ¿Qué haría si quisiera disparar después del regreso, en su lugar? –

+0

¿Qué quiere decir con "antes de que el método de publicación haya devuelto la imagen"? Se llama al método onPublish() antes de que la llamada a publish() regrese, por supuesto, pero ¿quiere decir después de que se cargó la imagen? – Zecc

+0

@ ajax81 - He ** actualizado ** el ejemplo. Ahora es asíncrono, por lo que agregará la devolución de llamada al ciclo de eventos, al igual que debería ser un controlador de eventos. – galambalazs

0

Como alternativa, puede utilizar algún marco del partido tercero (como bob.js) para definir eventos personalizados en sus objetos. Hay dos enfoques, pero voy a mostrar sólo una:

var DataListener = function() { 
    var fire = bob.event.namedEvent(this, 'received'); 
    this.start = function(count) { 
     for (var i = 0; i < count; i++) { 
      fire(i + 1); 
     } 
    }; 
}; 
var listener = new DataListener(); 
listener.add_received(function(data) { 
    console.log('data received: ' + data); 
}); 
listener.start(5); 
// Output: 
// data received: 1 
// data received: 2 
// data received: 3 
// data received: 4 
// data received: 5 
Cuestiones relacionadas