Ich habe ein Suchfeld. Im Moment wird nach jedem Keyup gesucht. Wenn also jemand "Windows" eingibt, wird mit AJAX nach jedem Keyup gesucht: "W", "Wi", "Win", "Wind", "Windo", "Window", "Windows".
Ich möchte eine Verzögerung haben, daher wird nur gesucht, wenn der Benutzer für 200 ms aufhört zu tippen.
Es gibt keine Option dafür in der keyup
Funktion, und ich habe es versucht setTimeout
, aber es hat nicht funktioniert.
Wie kann ich das machen?
javascript
jquery
Ajsie
quelle
quelle
Antworten:
Ich verwende diese kleine Funktion für den gleichen Zweck und führe eine Funktion aus, nachdem der Benutzer für eine bestimmte Zeit oder bei Ereignissen, die mit hoher Geschwindigkeit ausgelöst werden, nicht mehr tippt, wie z
resize
.Wie es funktioniert:
Die
delay
Funktion gibt eine umschlossene Funktion zurück, die intern einen einzelnen Timer verarbeitet. Bei jeder Ausführung wird der Timer mit der angegebenen Zeitverzögerung neu gestartet. Wenn mehrere Ausführungen vor Ablauf dieser Zeit erfolgen, wird der Timer einfach zurückgesetzt und erneut gestartet.Wenn der Timer endgültig endet, wird die Rückruffunktion ausgeführt, wobei der ursprüngliche Kontext und die ursprünglichen Argumente übergeben werden (in diesem Beispiel das Ereignisobjekt von jQuery und das DOM-Element als
this
).UPDATE 2019-05-16
Ich habe die Funktion mit ES5- und ES6-Funktionen für moderne Umgebungen neu implementiert:
Die Implementierung wird mit a abgedeckt Reihe von Tests .
Werfen Sie einen Blick auf das jQuery Typewatch- Plugin , um etwas Anspruchsvolleres zu erhalten .
quelle
Wenn Sie nach Abschluss des Typs suchen möchten, verwenden Sie eine globale Variable, um das von Ihrem
setTimout
Anruf zurückgegebeneclearTimeout
Zeitlimit zu speichern und es mit einem zu beenden, wenn es noch nicht aufgetreten ist, damit das Zeitlimit nur beim letztenkeyup
Ereignis ausgelöst wirdOder mit einer anonymen Funktion:
quelle
Eine weitere leichte Verbesserung der Antwort von CMS. Um separate Verzögerungen einfach zuzulassen, können Sie Folgendes verwenden:
Wenn Sie dieselbe Verzögerung wiederverwenden möchten, tun Sie dies einfach
Wenn Sie separate Verzögerungen wünschen, können Sie dies tun
quelle
someApiCall
immer noch mehrmals ausgelöst - jetzt nur mit dem Endwert des Eingabefeldes.Sie können sich auch underscore.js ansehen , das Dienstprogrammmethoden wie debounce bietet :
quelle
Basierend auf der Antwort von CMS habe ich Folgendes gemacht:
Geben Sie den folgenden Code ein, nachdem Sie jQuery eingeschlossen haben:
Und einfach so verwenden:
Achtung: Die Variable $ (this) in der als Parameter übergebenen Funktion stimmt nicht mit der Eingabe überein
quelle
Verzögern Sie Multifunktionsaufrufe mithilfe von Etiketten
Dies ist die Lösung, mit der ich arbeite. Dies verzögert die Ausführung einer beliebigen Funktion . Dies kann die Keydown-Suchabfrage sein, möglicherweise das schnelle Klicken auf die vorherigen oder nächsten Schaltflächen (die andernfalls mehrere Anfragen senden würden, wenn schnell kontinuierlich geklickt wird, und schließlich nicht verwendet werden). Dabei wird ein globales Objekt verwendet, das jede Ausführungszeit speichert und mit der aktuellsten Anforderung vergleicht.
Das Ergebnis ist also, dass nur der letzte Klick / die letzte Aktion tatsächlich aufgerufen wird, da diese Anforderungen in einer Warteschlange gespeichert sind, und dass nach Ablauf der X Millisekunden keine andere Anforderung mit derselben Bezeichnung in der Warteschlange vorhanden ist!
Sie können Ihre eigene Verzögerungszeit einstellen (optional, standardmäßig 500 ms). Und senden Sie Ihre Funktionsargumente "abschließend".
Zum Beispiel, wenn Sie die folgende Funktion aufrufen möchten:
Um mehrere send_ajax-Anforderungen zu vermeiden, verzögern Sie sie mit:
delay_method( "check date", function(){ send_ajax(2); } ,600);
Jede Anfrage, die das Label "Prüfdatum" verwendet, wird nur ausgelöst, wenn innerhalb des Zeitrahmens von 600 Millisekunden keine andere Anfrage gestellt wird. Dieses Argument ist optional
Beschriften Sie die Unabhängigkeit (rufen Sie dieselbe Zielfunktion auf), führen Sie jedoch beide aus:
Dies führt dazu, dass dieselbe Funktion aufgerufen wird, sie jedoch unabhängig voneinander verzögert werden, da ihre Beschriftungen unterschiedlich sind
quelle
Wenn jemand dieselbe Funktion ohne externe Variable verzögern möchte, kann er das nächste Skript verwenden:
quelle
Super einfacher Ansatz, mit dem eine Funktion ausgeführt werden kann, nachdem ein Benutzer ein Textfeld eingegeben hat ...
quelle
Diese Funktion erweitert die Funktion von Gatens Antwort ein wenig, um das Element zurückzubekommen:
http://jsfiddle.net/Us9bu/2/
quelle
Dies funktionierte bei mir, wo ich die Suchlogik verzögere und überprüfe, ob der Wert mit dem im Textfeld eingegebenen übereinstimmt. Wenn der Wert gleich ist, führe ich die Operation für die Daten aus, die sich auf den Suchwert beziehen.
quelle
Ich bin überrascht, dass niemand das Problem mit Mehrfacheingaben in CMS erwähnt hat.
Grundsätzlich müssten Sie die Verzögerungsvariable für jeden Eingang einzeln definieren. Andernfalls, wenn jdn Text in die erste Eingabe einfügt und schnell zu einer anderen Eingabe springt und mit der Eingabe beginnt, wird der Rückruf für die erste NICHT aufgerufen!
Siehe den Code unten, mit dem ich basierend auf anderen Antworten gekommen bin:
Diese Lösung behält die setTimeout-Referenz in der delayTimer-Variablen der Eingabe. Es wird auch die Referenz des Elements an den Rückruf übergeben, wie von fazzyx vorgeschlagen.
Getestet in IE6, 8 (comp - 7), 8 und Opera 12.11.
quelle
Verzögerungsfunktion zum Aufrufen bei jeder Eingabe. jQuery 1.7.1 oder höher erforderlich
Verwendungszweck:
$('#searchBox').keyupDelay( cb );
quelle
Aufbauend auf der Antwort von CMS gibt es hier eine neue Verzögerungsmethode, die "dies" in ihrer Verwendung beibehält:
Verwendungszweck:
quelle
Verwenden
Dabei ist expression das auszuführende Skript und timeout die Wartezeit in Millisekunden, bevor es ausgeführt wird. Dadurch wird das Skript NICHT beschädigt, sondern die Ausführung dieses Teils wird einfach verzögert, bis das Timeout abgeschlossen ist.
setzt das Zeitlimit zurück / löscht es, sodass das Skript nicht im Ausdruck (wie ein Abbruch) ausgeführt wird, solange es noch nicht ausgeführt wurde.
quelle
Dies ist eine Lösung im Sinne von CMS, löst jedoch einige wichtige Probleme für mich:
Verwendungszweck:
Der Code ist in einem Stil geschrieben, den ich mag. Möglicherweise müssen Sie eine Reihe von Semikolons hinzufügen.
Dinge zu beachten:
this
funktioniert also wie erwartet (wie im Beispiel).setTimeout
.Die von mir verwendete Lösung erhöht die Komplexität zusätzlich, sodass Sie beispielsweise die Ausführung abbrechen können. Dies ist jedoch eine gute Basis, auf der Sie aufbauen können.
quelle
Basierend auf der Antwort von CMS werden nur die Schlüsselereignisse ignoriert, die den Wert nicht ändern.
quelle
Die Kombination der CMS-Antwort mit der von Miguel ergibt eine robuste Lösung, die gleichzeitige Verzögerungen ermöglicht.
Wenn Sie verschiedene Aktionen unabhängig voneinander verzögern müssen, verwenden Sie das dritte Argument.
quelle
Verwenden Sie das bindWithDelay jQuery-Plugin:
quelle
quelle
Hier ist ein Vorschlag, den ich geschrieben habe und der sich um mehrere Eingaben in Ihrem Formular kümmert.
Diese Funktion ruft das Objekt des Eingabefeldes in Ihren Code ein
Dies ist die eigentliche delayCall-Funktion, die sich um mehrere Eingabefelder kümmert
Verwendungszweck:
quelle
Ab ES6 kann auch die Pfeilfunktionssyntax verwendet werden .
In diesem Beispiel verzögert der Code das
keyup
Ereignis um 400 ms, nachdem Benutzer die Eingabe beendet haben, bevor siesearchFunc
eine Abfrageanforderung stellen.quelle
jQuery :
Reines Javascript:
quelle
Schauen Sie sich das Autocomplete- Plugin an. Ich weiß, dass Sie damit eine Verzögerung oder eine Mindestanzahl von Zeichen angeben können. Selbst wenn Sie das Plugin nicht verwenden, erhalten Sie beim Durchsehen des Codes einige Ideen, wie Sie es selbst implementieren können.
quelle
Nun, ich habe auch einen Code für die Begrenzung der Hochfrequenz-Ajax-Anfrage von Keyup / Keydown erstellt. Überprüfen Sie dies heraus:
https://github.com/raincious/jQueue
Führen Sie Ihre Anfrage folgendermaßen aus:
Und Ereignis wie folgt binden:
quelle
Habe das heute etwas spät gesehen, möchte es aber nur hier einfügen, falls jemand anderes es braucht. Trennen Sie einfach die Funktion, um sie wiederverwendbar zu machen. Der folgende Code wartet nach dem Eingeben von stop eine halbe Sekunde.
quelle
Benutzer lodash Javascript-Bibliothek und verwenden Sie die Funktion _.debounce
quelle
quelle