2010-11-26 18 views
10

Supposons que j'ai un objet avec une fonction membre qui se retourne:Puis-je créer un événement personnalisé en Javascript pour un objet que j'ai créé?

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

Dans la production:

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

Maintenant, supposons que je voulais créer un événement qui se déclenche lorsque Publish l'objet() méthode est appelée, mais après que l'image est renvoyée (quelque chose s'apparente à un événement "onPublished()"). Dire, pour changer les dimensions de l'image à 100x100. Comment pourrais-je le créer et où l'attacherais-je?

Si je ne suis pas assez clair, s'il vous plaît faites le moi savoir. C'est la démo la plus simple à laquelle je puisse penser.

Répondre

8

Un exemple simple:

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

Cela ressemble il exécutera l'événement onPublish() avant que l'image est renvoyée (si ce n'est pas le cas, s'il vous plaît laissez-moi savoir). Que ferais-je si je voulais qu'il tire après le retour, à la place? –

+0

Que voulez-vous dire "avant que la méthode de publication n'a renvoyé l'image"? La méthode onPublish() est appelée avant le retour de l'appel à publish(), mais voulez-vous dire après le chargement de l'image? – Zecc

+0

@ ajax81 - J'ai ** mis à jour ** l'exemple. Maintenant, il est asynchrone, donc il va ajouter le rappel à la boucle d'événements, tout comme un gestionnaire d'événements devrait être. – galambalazs

0

Alternativement, vous pouvez utiliser un cadre 3ème partie (comme bob.js) pour définir des événements personnalisés sur vos objets. Il existe deux approches, mais je vais montrer un seul:

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