Benutzung von timer.js
offizielle Funktionen zur Benutzung des Timers
Alle meine Animationen werden über einen einzigen Timer gesteuert. Dies ist notwendig, da nicht jeder Browser das gleichzeitige Ausführen mehrerer Timer erlaubt. Solch ein Kandidat ist beispielsweise der Konqueror in der Version 1.9.8. Auch wenn man mehrere Animationen laufen läßt sollte man also nur einen Timer erzeugen, was ich meinen Animationen durch die Einbindung von timer.js ermögliche. Soviel zum Zweck dieser JavaScript-Bibliothek.
FunktionBedeutung
u_timer_start(elapse) Startet den Timer.
elapse ist die Anzahl der Millisekunden, die zwischen den Timer-Ticks vergehen soll. Der Timer muß immer explizit über diese Funktion gestartet werden, damit sich bei meinen Animationen ein Rad dreht.
u_timer_continue() Setzt die Aktivität des gestoppten Timers fort.
u_timer_stop() Stoppt den Timer.
u_timer_set_event_handler(eventhandler) Setzt die Funktion eventhandler, die aufgerufen wird, wenn der Timer gestartet oder gestoppt wird.
Die Eventhandler-Funktion bekommt eine Zahl übergeben: 0 beim Stop und 1 beim Start des Timers.
u_timer_add_object(object) Fügt ein Objekt in die Timerliste ein.
Das Objekt muß folgende Attribute besitzen:
TimerFunc: Funktion, die vom Zeitgeber aufgerufen wird
timestep: aller wieviel Timer-Ticks TimerFunc aufgerufen wird
timeval: Timer-Tick-Zähler
Alle Objekte in den zugehörigen Beispielen fügen sich bei der Erzeugung selbst in die Timer-Liste ein, ein separater Aufruf dieser Funktion ist somit nur für neue Objekte sinnvoll.


Quelltext von timer.js
/* (c) 2001 Ulrich Kritzner */

var u_timer_elapse=0;
var u_timer_running=0;
var u_timer_objects=new Array();
var u_timer_objcount=0;
var u_timer_active;
var u_timer_event_handler;

function u_timer_set_event_handler(eventhandler)
{
  u_timer_event_handler=eventhandler;
}

function u_timer_timer()
{
  var i;
  var r=0;
  if (u_timer_running)
  {
    for (i=0;i<u_timer_objcount;i++)
    {
      if (u_timer_objects[i].timestep>0)
      {
        r++;
        u_timer_objects[i].timeval=(u_timer_objects[i].timeval+1)%u_timer_objects[i].timestep;
	if (u_timer_objects[i].timeval==0)
        {
	  u_timer_objects[i].timeval=0;
	  u_timer_objects[i].TimerFunc();
        }
      }
    }
    if (r>0)
      u_timer_active=window.setTimeout("u_timer_timer()",u_timer_elapse);
    else
      u_timer_stop();
  }
}

function u_timer_add_object(object)
{
  if (object.TimerFunc)
  {
    u_timer_objects[u_timer_objcount]=object;
    u_timer_objcount++;
  }
}

function u_timer_stop()
{
  u_timer_running=0;
  if (u_timer_active)
    window.clearTimeout(u_timer_active);
  if (u_timer_event_handler)
    u_timer_event_handler(0);
}

function u_timer_start(elapse)
{
  u_timer_stop();
  if (u_timer_event_handler)
    u_timer_event_handler(1);
  u_timer_elapse=elapse;
  u_timer_running=1;
  u_timer_active=window.setTimeout("u_timer_timer()",u_timer_elapse);
}

function u_timer_continue()
{
  if (u_timer_running==0)
  {
    if (u_timer_event_handler)
      u_timer_event_handler(1);
    u_timer_running=1;
    u_timer_active=window.setTimeout("u_timer_timer()",u_timer_elapse);
  }
}