Hoi mensen,

Ik heb een probleem met window.setInterval.
Ik heb een nieuwsdiv waarin ik de tekst wil laten bewegen. Dat doe ik met javascript. Ik verander iedere 50 miliseconden de style.top van de inhoud van de div. Nu ben ik object georienteerd bezig. Mijn setInterval geeft nu een fout omdat de functie die dan wordt uitgevoerd de eerdere objecten niet heeft. Dit klinkt misschien even vaag, maar als je het ziet snap je het wel.

Hier de javascript
http://www.speeldozen.eu/scripts/scrollbar2.js

En hier de php pagina
http://www.speeldozen.eu/index.php.

Weten jullie een oplossing voor dit probleem? Ik heb btw al op google gezocht en met "setInterval problem objects javascript" kreeg ik de meeste resultaten alleen kon geen een mij verder helpen.

B.v.d,
Herman Banken
Dit:

this.scrollbar_move = function(type){

mag niet in JavaScript. Mijn Firebug extensie klaagt er over en zegt dat 'scrollbar_move geen functie is. Het hoort er zo uit te zien:

function scrollbar_move (type) {
Typisch, volgens mij mag dat juist wel in Javascript.

Ik denk eerder dat het aan je setInterval aanroepen ligt. Daarin verwijs je naar window.this.scrollbar_move. Die bestaat niet. Je moet het zoeken in

window.setInterval(this.scrollbar_move, 50);

Je moet dan zelf even een alternatieve manier vinden om je parameters mee te geven. Kan ook simpel via closures bedenk ik net:

var _self = this; // omdat this niet lekker gaat icm losse functies
window.setInterval(function() {
   _self.scrollbar_move('up');
}, 50);


edit: Je kan scrollbar_move overigens ook gewoon aan een variabele hangen binnen de functie, zodat hij niet vanaf buiten aanroepbaar is. Via de closures komt het dan vanzelf wel goed:


function Scrollbar(div)
{
   var scrollbar = div;
   var moveInterval;
   var moveScrollbar = function(offset) {
      scrollbar.offset += offset;
   }

   var stopScrollbar = function() {
      if(moveInterval) {
         clearInterval(moveInterval);
         moveInterval = null;
      }
   }

   this.moveUp = function() {
      stopScrollbar();
      setInterval(function() {
         moveScrollbar(10);
      });
   }

   this.moveDown = function() {
      stopScrollbar();
      setInterval(function() {
         moveScrollbar(-10);
      });
   }

   this.stop = function() {
      stopScrollbar();
   }
}

myScrollbar = new Scrollbar(window);
myScrollbar.moveUp();


Op deze manier kan je dus private & public methods simuleren in Javascript. Alleen de functies die aan this zijn vastgebonden zijn van buiten af aanroepbaar.
Bedankt Jelmer,

Het klopt. Het moest via closures.
Ik wist niet dat je binnen de setInterval ook zonder ''haakjes mocht werken. Waarom mag
setInterval(function() {
   _self.scrollbar_move('up');
},50); 

wel en
setInterval(_self.scrollbar_move('up'),50); 

niet?
Wat is het verschil tussen die twee?

Btw: Het script werkt nu, de this.scrollbar_move('up') wordt nu uitgevoerd (getest met alertje), hij doet nog een beetje gek maar dat ligt aan de code binnen scrollbar_move.

Bedankt!

Herman
In je 2e code-blokje roep je _self.scrollbar_move aan, terwijl je in blokje 1 een functie teruggeeft die _self.scrollbar_move uit zal gaan voeren.

In blokje 2 zal scrollbar_move dus maar 1 keer aangeroepen worden, en de uitvoer van die functie (return-value) zal als argument aan setInterval gegeven worden, terwijl je in blokje 1 een functie als argument geeft. Je zou bijvoorbeeld ook scrollbar_move als argument mee kunnen geven, ware het niet dat je nu geen parameters meer aan scrollbar_move kan geven:


setInterval(_self.scrollbar_move, 50);


Merk op dat ik nu geen haakjes achter scrollbar_move zet. scrollbar_move is namelijk gewoon een object dat je aan vanalles mee kan geven. Dat is de grap van Javascript: Alles is een object (behalve true & false dan) en een functie is een object dat je uit kan voeren.

Reageren