2011-01-11 2 views
0
  1. J'ai un objet qui crée un diaporama.
  2. Je veux avoir plusieurs diaporamas sur une page
  3. J'ai un gestionnaire d'événements pour l'élément diaporama à l'intérieur
  4. Je veux que le gestionnaire d'événements pour connaître l'objet diaporama a créé un élément cliqué

-Javascript Technique de fermeture

slideshow=function(){ 

    var g = document.createElement(...); 

    ... 

    g.onclick = f1; 

    f1 = function(slideshow_instance, event) { 
     //EXPLAIN ME HOW TO GET THE slideshow_instance 
    } 

} 

var sl1 = new slideshow(); 
var sl2 = new slideshow(); 

en cliquant sur un diaporama élément a créé devrait revenir soit

SL1

ou

SL2

J'explique bien?

+0

Où l'instance slideshow_instance a-t-elle été créée? – Epeli

+0

Avoir une lecture de ceci: http://stackoverflow.com/questions/4584845/broken-closure-please-help-me-fix-it/4585189#4585189 – mplungjan

+0

@Epeli l'slideshow_instance est le même que ce mot-clé ... Mais je ne peux pas l'utiliser à l'intérieur d'un gestionnaire d'événements – Dan

Répondre

5

Réponse courte, utiliser: this.

réponse plus longue, ce que vous voulez est:

slideshow=function(){ 
    /* ... */ 

    var self = this;  

    f1 = function(event) { 
     // do stuff with self. 
    } 

} 

La raison pour laquelle vous devez pointer vers this en utilisant self est que les gestionnaires d'événements vont changer le sens de this quand ils sont appelés. Mais au moment où l'objet est créé this se référer correctement à l'objet correct (une instance de diaporama). La raison pour laquelle nous pouvons accéder à la variable self au cours du rappel d'événement est qu'il a été capturé par une fermeture. N'hésitez pas à google ou chercher sur stackoverflow n'importe quel mot/terminologie de la description ci-dessus si vous avez besoin d'explications supplémentaires.

+0

+1 pour être un peu plus propre et plus facile à lire que le mien :) –

1
slideshow=function(){ 

    var g = document.createElement(...); 
    g._objRef = this; 

    ... 

    g.onclick = f1; 

    f1 = function(event) { 
     alert(this._objRef); 
    } 

} 

var sl1 = new slideshow(); 
var sl2 = new slideshow(); 

Un peu un hack imo, mais ça devrait faire l'affaire.

+0

vous êtes tous les deux bons! La solution était si simple mais je ne pouvais pas le voir! – Dan

+0

Vous pouvez simplement utiliser la fermeture ici au lieu de la renvoyer via l'élément dom (qui peut être lent). – Epeli