So eine Art modifiziertes setTimeout() mit Unterbrechung?
small-step
- javascript
0 Struppi
0 molily
0 wahsaga0 small-step0 wahsaga0 small-step0 Struppi
Hallo alle,
ich habe mit folgender Problemstellung zu kämpfen: Ich überwache die Tastendrücke in einem Textfeld und möchte, wenn etwas eingegeben wurde, nach einer definierten Wartezeit eine Funktion aufrufen. Soweit kein Problem, wozu gibt es setTimeout(). Problematisch ist aber, dass ich den verzögerten Funktionsaufruf nicht starten möchte, wenn in der Zwischenzeit ein neuer Tastendruck erfolgt ist (ansonsten wird die Funktion bei einem 10-Finger-geübten zu häufig aufgerufen). Gibt es eine Möglichkeit z.B. setTimeout() zu unterbrechen oder fällt euch eventuell eine andere Lösung des Problems ein?
Ich danke herzlichst.
small-step
... Gibt es eine Möglichkeit z.B. setTimeout() zu unterbrechen oder fällt euch eventuell eine andere Lösung des Problems ein?
Schonmal bei selfhtml geschaut?
Struppi.
Hallo Struppi,
Schonmal bei selfhtml geschaut?
Ja, natürlich. Und die Foren-Suche genutzt. Und ca. 3 Zeilen über clearTimeout() hab ich aufgehört danach zu suchen ... Wahrscheinlich weil nur bei setInterval die zugehörige clear-Methode verlinkt ist.
Dankeschön auf jeden Fall,
small-step
Hallo,
Gibt es eine Möglichkeit z.B. setTimeout() zu unterbrechen
Mathias
Hallo molily,
Dankeschön.
Wie habe ich das denn übersehen können? Ich bin bis zum clearInterval(); gekommen und hab dann offensichtlich die Hoffnung verloren. Peinlich ...
Gruß,
small-step
Hallo molily,
mittlerweile funktioniert das ganze wunderbar. Es sieht jetzt folgendermaßen aus:
var iTextBoxTimeout = 0;
...
if(iTextBoxTimeout != 0) {
clearTimeout(iTextBoxTimeout);
}
iTextBoxTimeout = window.setTimeout("CatchTextBoxValue(document.TestForm.TestTextBox.value)",300);
Danke für die Hilfe!
Gruß,
small-step
hi,
Problematisch ist aber, dass ich den verzögerten Funktionsaufruf nicht starten möchte, wenn in der Zwischenzeit ein neuer Tastendruck erfolgt ist (ansonsten wird die Funktion bei einem 10-Finger-geübten zu häufig aufgerufen). Gibt es eine Möglichkeit z.B. setTimeout() zu unterbrechen oder fällt euch eventuell eine andere Lösung des Problems ein?
Ich würde da vielleicht eher mit setInterval arbeiten.
Jeder Tastendruck speichert in einer Variable den aktuellen Zeitstempel, zu dem er stattgefunden hat (Date-Objekt).
Und das Interval überprüft regelmässig, ob dieser Zeitstempel schon x (Milli)Sekunden in der Vergangenheit liegt - wenn ja, rufe Funktion auf, wenn nein, (noch) nicht.
gruß,
wahsaga
Hi wahsaga,
Ich würde da vielleicht eher mit setInterval arbeiten.
Hm ... wieso?
Jeder Tastendruck speichert in einer Variable den aktuellen Zeitstempel, zu dem er stattgefunden hat (Date-Objekt).
Und das Interval überprüft regelmässig, ob dieser Zeitstempel schon x (Milli)Sekunden in der Vergangenheit liegt - wenn ja, rufe Funktion auf, wenn nein, (noch) nicht.
Wäre das nicht ziemlich viel Overhead für einen Tastendruck?
Klär mich auf, wieso ist diese Art besser?
Gruß,
small-step
hi,
Ich würde da vielleicht eher mit setInterval arbeiten.
Hm ... wieso?
Weil's mir einfacher erscheint.
Wäre das nicht ziemlich viel Overhead für einen Tastendruck?
Ist es nicht ziemlich viel Overhead, bei jedem Tastendruck einen Timeout zu clearen, und wieder einen neuen zu erstellen ...?
gruß,
wahsaga
Hallo wahsaga,
Weil's mir einfacher erscheint.
Von der Ausführung her?
Ist es nicht ziemlich viel Overhead, bei jedem Tastendruck einen Timeout zu clearen, und wieder einen neuen zu erstellen ...?
Bei einem Intervall von 0,3 Sekunden ist Timeout glaube ich im Vorteil.
Gruß,
small-step
Weil's mir einfacher erscheint.
Von der Ausführung her?
Ja.
Ist es nicht ziemlich viel Overhead, bei jedem Tastendruck einen Timeout zu clearen, und wieder einen neuen zu erstellen ...?
Bei einem Intervall von 0,3 Sekunden ist Timeout glaube ich im Vorteil.
Du willst alle 0.3 sekunden prüfen ob eine Taste gedrückt wurde?
Ich würd's so machen:
<script type="text/javascript">
var inaktiv = 2000; // wie lange in ms
var intv = window.setInterval( 'check()', inaktiv);
window.lastKeyPress = (new Date()).getTime() - 1;
document.onkeydown = function()
{
window.lastKeyPress = (new Date()).getTime();
}
function check()
{
var dif = new Date() - window.lastKeyPress;
if(dif > inaktiv)
{
window.clearInterval( intv );
alert('Seit ' + dif + ' ms nichts passiert');
}
window.status = dif;
}
</script>
Struppi.
Hallo Struppi,
Du willst alle 0.3 sekunden prüfen ob eine Taste gedrückt wurde?
Nicht ganz. Ich will nach einem Tastendruck eine Aktion ausführen, und zwar 0.3 Sekunden nach dem Event. Es sei denn, zwischenzeitlich wurde erneut eine Taste gedrückt. Dann soll die Aktion die durch den ersten Tastendruck angestoßen wurde nicht ausgeführt werden und durch die neue Aktion ersetzt werden.
Das ist eine Ajax-Anwendung. So eine Art Autocomplete, nur nicht wie bei Google Suggest mit einer einfachen Textbox, sondern mit einer Ergebnistabelle mit Paging etc. Ich will einfach nicht bei jedem Tastendruck den Server belasten, sondern abwarten bis die Eingabe zumindest ansatzweise fertig ist. Das erspart mir davon abgesehen eine JavaScript-Fehlermeldung wenn mal jemand wild auf die Tasten hackt.
So wie ich es jetzt gelöst habe funkioniert das ganze.
Danke trotzdem für die Antwort.
Gruß,
small-step