Toon posts:

prototype class events probleem...

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Goede morgen allemaal,

Ik heb een classje geschreven met het prototype framework.
Moet nog hoop aan gebeuren. Maar loop tegen een probleempje aan met meerdere instanties.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Fader = Class.create({
    initialize: function(id){
        this._id = id;
        this._opacity = 1;
        this._interval = null;
        self = this;
        Event.observe(window, 'load', function(){
            Event.observe(id, 'mouseout',  self.delayedUp.bindAsEventListener(self), false);
            Event.observe(id, 'mouseover', self.delayedDown.bindAsEventListener(self), false);
        });
    },
    up : function(){
        if(this._opacity < 1){
            this._opacity = this._opacity + 0.1;
            $(this._id).setStyle({opacity : this._opacity});
        }
        else{
            clearInterval(this._interval);
        }
    },
    down : function(){
        if(this._opacity > 0){
            this._opacity = this._opacity - 0.1;
            $(this._id).setStyle({opacity : this._opacity});
        }
        else{
            clearInterval(this._interval);
        }
    },
    delayedUp : function(){
        self = this;
        clearInterval( self._interval );
        this._interval = window.setInterval(function(){
            self.up()
        }, 100);
    },
    delayedDown : function(){
        self = this;
        clearInterval( self._interval );
        this._interval = window.setInterval(function(){
            self.down()
        }, 100);
    }
}); 


Werkt opzich tot zover redelijk naar behoren.
D.w.z. ik had wat meer cross browser verwachtingen, maar dat komt wel goed.


JavaScript:
1
2
new Fader('fade-outer0');
new Fader('fade-outer1'); 


Als ik echter de class meerdere keren aanroep, werkt het alleen op het laatste element.
Verder geen errors of iets dergelijks in FireBug.

Ben meer een backend scripter, dus wellicht kan iemand mij vertellen waarom dit niet helemaal goed gaat?
Misschien iets te maken met de eventlisteners of het meerdere keren aanroepen van observer window load ?
Of met clearInterval(); ?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als ik die window load uit de class haal en zo uitvoer:

JavaScript:
1
2
3
4
Event.observe(window, 'load', function(){
    x = new Fader('fade-outer');
    y = new Fader('fade-outer1');
});


Dan gaat het al iets beter...
Maar toch nog niet helemaal.

Acties:
  • 0 Henk 'm!

Verwijderd

JavaScript:
1
2
3
self = this; 
//moet zijn
var self = this; 

Je mag zelf opzoeken waarom ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Sorry net pas thuis.

En Mr E-buddy, je hebt helemaal gelijk! Dat is de oplossing.
Alleen met vriend google kom ik niet tot een verklaring.

Wellicht nog een duwtje in de goede richting?

Acties:
  • 0 Henk 'm!

  • H004
  • Registratie: Maart 2006
  • Laatst online: 28-05 19:55
Ik ben ook net begonnen met classen, en heb t even geprobeerd op te zoeken (leer ik zelf ook weer wat van):

Volgens mij komt dit omdat, zonder "var", self in de global scope gedefinieerd wordt, en dus ook elke keer overschreven wordt zodra je de class opnieuw aanmaakt (waardoor "Als ik echter de class meerdere keren aanroep, werkt het alleen op het laatste element" logisch is). Met var ervoor wordt de scope van self private (? ik weet niet zeker of dit de juiste term is...), en werkt t allemaal wel zoals verwacht.

Klopt dit?

Acties:
  • 0 Henk 'm!

Verwijderd

Ja d:)b (behalve dat het local scope heet)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Helemaal duidelijk nu na wat zoekwerk inderdaad! Hartelijk dank beiden!
Pagina: 1