jQuery keyup Verzögerung

8

Hoffentlich ist dies eine schnelle und einfache Möglichkeit für jemanden herauszufinden. Ich bin ziemlich neu, um eine Menge von Javascript / jquery zu verwenden, und ich habe die folgende Einrichtung, um einen Kundennamen aus einer Datenbank zu ziehen und anzuzeigen, wie der Benutzer die Kundennummer eingegeben hat.

Alles funktioniert gut, aber es sucht bei jeder Taste . Ich weiß, dass ich es in blur ändern könnte, aber ich möchte, dass es so lange wie möglich nach einer Verzögerung sucht.

Hier ist der aktuelle Code:

%Vor%

Wie Sie sehen, ist es für jede Taste bindend, was bedeutet, dass Sie, wenn Sie zu schnell suchen, ein falsches Ergebnis hinterlassen, da es noch geladen wird. (Wenn keine Übereinstimmungen gefunden werden, wird ein Fehler angezeigt, und wenn der Benutzer schnell genug eingegeben wird, muss der Benutzer die letzte Ziffer zurücksetzen und die letzte Zahl erneut eingeben)

Könnte jemand dazu beitragen, dem vorhandenen Code eine Verzögerung hinzuzufügen, und wenn möglich, eine kleine Erklärung, was die vorgenommene Änderung betrifft, dann kopiere und füge ich einfach nicht ohne zu verstehen.

---- BEARBEITEN ----

Dies ist der Code, mit dem ich fertig bin, danke Leute!

%Vor%     
Tarquin 23.01.2013, 03:17
quelle

4 Antworten

8

Sie sollten sich die setTimeout und die clearTimeout Funktionen:

%Vor%

Was wir tun, ist, dass wir die Funktion postData nicht sofort auslösen, sondern sie an setTimeout übergeben, sodass sie nach einer bestimmten Zeit (in diesem Fall 300 Millisekunden) ausgelöst wird.

Die setTimeout -Funktion gibt eine Timer-ID zurück, die wir dann an clearTimeout übergeben können, um diesen Aufruf von jedem Lauf abzubrechen. Bevor wir einen neuen Timer einstellen, prüfen wir zunächst bei jedem Tastendruck, ob ein Timer eingestellt ist. Wenn dies der Fall ist, brechen wir den alten Timer ab, bevor wir einen neuen starten.

Um dies weiter zu verbessern, können Sie auch Abbrechen Ihres AJAX-Anrufs bei jedem Tastendruck, nur für den Fall, dass der Benutzer nach mehr als 300 Millisekunden etwas eingegeben hat (nachdem der Timer ausgelöst wurde, aber bevor die AJAX-Anfrage zurückkehrt).

PS Sie sollten sich Ben Almans Throttle / Debounce-Plugin anschauen , die hier perfekt funktionieren würden.

    
Joseph Silber 23.01.2013, 03:20
quelle
7

Sieh dir die Funktion debounce von Underscore an - es macht diese Art von Verhalten sehr einfach:

%Vor%

Auf diese Weise wird der Aufruf von postData nur ausgeführt, nachdem der Benutzer die Eingabe von für 500ms beendet hat (oder für was auch immer Sie die debounce wait festgelegt haben)

Außerdem schlich ich mich in das Ereignis input ein, um weitere Änderungen wie z Kopieren / Einfügen zusätzlich zu Tastenanschlägen (in modernen Browsern)

    
Nevir 23.01.2013 03:24
quelle
2

Ich würde die Suche ein wenig verzögern, aber Sie müssen auch die letzte Anfrage abbrechen, da Sie nicht vorhersagen können, welche Reihenfolge sie ausführen werden ( oder Sie können eine Warteschlange für den Ajax verwenden) ).

Ich werde alle drei Teile beschreiben:

Verzögerung

Umbrechen Sie den postData-Callback in setTimeout . Speichern Sie den Rückgabewert von setTimeout als $("#id").data('timeout') und rufen Sie jedes Mal clearTimeout darauf auf, sodass das Ereignis nur einmal pro schneller Zeichenfolge ausgelöst wird.

Abbruch

Speichern Sie die letzte Anfrage auf $("#id").data('lastRequest') oder ähnliches. Jedes Mal, wenn postData aufgerufen wird, führen Sie $("#id").data('lastRequest').abort() aus. Speichern Sie den Rückgabewert von $.post() in diesem Datenfeld. Um einen Fehler zu vermeiden, initialisieren Sie Folgendes:

%Vor%

Warteschlange

%Vor%     
Explosion Pills 23.01.2013 03:23
quelle
0

Es könnte einen besseren Weg geben, aber hier ist etwas von der Spitze meines Kopfes:

%Vor%     
pierdevara 23.01.2013 03:25
quelle

Tags und Links