small-step: So eine Art modifiziertes setTimeout() mit Unterbrechung?

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

  1. ... 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.

    1. 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

  2. Hallo,

    Gibt es eine Möglichkeit z.B. setTimeout() zu unterbrechen

    clearTimeout

    Mathias

    1. Hallo molily,

      clearTimeout

      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

    2. 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

  3. 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

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. 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

      1. 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

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. 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

          1. 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.

            --
            link:http://javascript.jstruebig.de/@title=Javascript ist toll]
            1. 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