Amtrax: Javascript Funktion mehrmals aufrufen, dazwischen pausieren

Hi,

ich möchte eine Javascript-Funktion mehrmals hintereinander ausführen. Zwischen jedem durchlauf soll diese Funktion kurz pausieren und auf eine Tasteneingabe warten. Unabhängig davon, ob eine key-Down Ereignis eintritt oder nicht, soll die Funktion mit dem nächsten Durchlauf weiter machen.

Was ich bisher habe:

Tastaturereignis abrufen

  
function readkey(ereignis)  
{  
	if(!ereignis)  
	{  
		ereignis = window.event;  
	}  
	if(ereignis.which)  
	{  
		taste = ereignis.which;  
	}  
	else if(ereignis.keyCode)  
	{  
		taste = ereignis.keyCode;  
	}  
	keyarray[counter] = taste;  
}  
document.onkeydown = readkey;  

Der Code der ausgeführt werden soll:

  
var counter = 0;  
function start()  
{  
	if (counter > 8)  
	{  
		clearInterval(timerid);  
	}  
	counter++;  
}  
var timerid = setInterval("start()", 350);  

Gespeichert werden die keydown-Events in einem Array (nur falls das wichtig sein sollte).

Wenn ich das ganze so jetzt starte und eine Taste drücke, bricht der mehrmalige aufruf bei counter > 8 nicht mehr ab.

Weiss da rein zufällig jemand, wie ich das a) entweder besser lösen kann oder überhautp lösen kann?

  1. Hallo, Amtrax!

    Prüfe erst einmal, ob die timerid und counter innerhalb der start-Funktion verfügbar sind.

    Gruß, LX

    --
    RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.
    1. Hallo, Amtrax!

      Prüfe erst einmal, ob die timerid und counter innerhalb der start-Funktion verfügbar sind.

      Gruß, LX

      Hallo,

      die beiden sind innerhalb der start-Funktion verfügbar, da die Funktion ohne Tastendruck nach 10 Durchläufen wie gewünscht stoppt. Sobald ich aber eine Taste drücke, wir die setInterval-Funktion irgendwie blockiert und die start-Funktion läuft einige male ohne, dass der counter erhöht wird. Sehr sehr merkwürdiges verhalten.

      Viele Grüße,

      Amtrax

      1. Warum willst Du eigentlich zwischen den Tastendrücken warten? Abgesehen davon wäre meine Vermutung, dass Dein Problem damit zusammenhängt, dass die Variable counter in den Scope der Tastendruck-Funktion gezogen wird und damit nicht gleichzeitig in der Funktion start benutzt werden kann. Um dies zu verhindern, könntest Du in der Tastendruck-Funktion mit var myCounter = counter; eine lokale Kopie der Variable anlegen.

        Gruß, LX

        --
        RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.
        1. Warum willst Du eigentlich zwischen den Tastendrücken warten? Abgesehen davon wäre meine Vermutung, dass Dein Problem damit zusammenhängt, dass die Variable counter in den Scope der Tastendruck-Funktion gezogen wird und damit nicht gleichzeitig in der Funktion start benutzt werden kann. Um dies zu verhindern, könntest Du in der Tastendruck-Funktion mit var myCounter = counter; eine lokale Kopie der Variable anlegen.

          Gruß, LX

          Ich möchte gerade einen Testlauf programmieren. Der Benutzer bekommt einen Reiz präsentiert, auf den er innerhalb eines gewissen Intervalls antworten soll. Daher möchte ich den Ablauf der FUnktion pausieren und zwar unabhängig davon, ob der Benutzer eine Taste gedrückt hat oder nicht.

        2. Warum willst Du eigentlich zwischen den Tastendrücken warten? Abgesehen davon wäre meine Vermutung, dass Dein Problem damit zusammenhängt, dass die Variable counter in den Scope der Tastendruck-Funktion gezogen wird und damit nicht gleichzeitig in der Funktion start benutzt werden kann. Um dies zu verhindern, könntest Du in der Tastendruck-Funktion mit var myCounter = counter; eine lokale Kopie der Variable anlegen.

          Gruß, LX

          Hallo LX,

          der Tipp mit der gesperrten Variable war genial. Das hat das Problem gelöst. Darauf wäre ich nie gekommen. Und wieder was gelernt.

          Viele Grüße,

          Amtrax

  2. Ich erkenne keinen zusammenhang zwischen deinem readkey und dem timer.
    start() läuft alle 350 ms, bis das von clearInterval beendet wird. Eine pause macht das aber nicht und hat auch mit dem readkey nichts zu tun.

    Vergiss das mit der pause. Merk dir einfach die uhrzeit, bei der eine taste gedrückt wurde und dann siehst du ja ob der tastendruck innerhalb der vorgegebenen zeit war.