[ lukeguy @ 12.03.2006. 14:55 ] @
napisao sam JS klasu sa idejom da je ona povezana na jedan DIV i onda svakih n sekundi menja sadržaj tog diva u krug (korisno za prikazivanje tri po tri vesti, npr.). evo idejnog koda:
Code:

function Alternator(){
      var counter=0;
      var timeout=1000;
      var displayMax=3;
      var elementName = "all_news";
      var timer;
      var divs = new Array();
      this.addItem = addItem;
      this.alternate = alternate;
      this.pause = pause;
      this.go = go;
      
      function addItem(item){
        divs.push(item);
      }
      
      function alternate(){
        myEl=document.getElementById(elementName);
        myEl.innerHTML="";
        for(j=0;j<displayMax;j++) {
          if(divs[counter])
            myEl.innerHTML+=divs[counter];
          counter++;
          }
        if(counter>=divs.length)counter=0;
        timer=setTimeout("this.alternate()",timeout);
      }
      
      function go(){
        timer=setTimeout("this.alternate()",timeout);
      }
      
      function pause(){
        clearTimeout(timer);
      }
    }

problem je što ne radi setTimout, dobijam grešku "object doesn't support that property or method". jasno mi je da je greška u toj callback funkciji, da verovatno dolazi do gubljenja opsega promenljive pri pozivu. jedina situacija u kojoj je kod radio je ako se this zameni imenom objekta. npr ako u dokumentu stavim:
Code:

newsAlternator = new Alternator();

a problematični deo izmenim kao:
Code:

timer=setTimeout("newsAlternator.alternate()",timeout);

onda se DIV menja, ali ovo nema smisla, jer će svaka instanca klase pozivati metod alternate potpuno istog objekta...

pokušao sam da guglam, ali nisam našao ništa korisno. svi primeri na koje sam naleteo pozivaju setTimeout VAN objekta, a kod mene to ne bi imalo smisla.

inače, klasi naravno nedostaju metode za podešavanje osobina, ovo je samo ideja dok ne otklonim ovaj za mene najveći problem. a ako se neko pita zašto sebi "komplikujem" život, to je zbog toga što planiram da na stranici imam više nezavnisnih tih alternatora. čini mi se da je ovo u tom slučaju najjednostavniji način.

btw, evo i primera dokumenta:
Code:

<div id="all_news" style="height:114" onmouseover="newsAlternator.pause()" onmouseout="newsAlternator.go()">
</div>
<script>
newsAlternator = new Alternator();
newsAlternator.addItem('item 1');
newsAlternator.addItem('item 2');
newsAlternator.addItem('item 3');
newsAlternator.addItem('item ...');
newsAlternator.addItem('item n');
newsAlternator.alternate();
</script>
[ Br@nkoR @ 12.03.2006. 18:50 ] @
Dodaj u klasu npr:
Code:

var alter = this;


a problematičan deo promeni u:
Code:

timer=setTimeout(alter.alternate,timeout);
[ lukeguy @ 12.03.2006. 19:01 ] @
dakle, svaka instanca klase treba da sadrži referencu na samu sebe?