Ich verwende diese kleine Funktion für den gleichen Zweck, indem ich eine Funktion ausführe, nachdem der Benutzer für eine bestimmte Zeitspanne aufgehört hat zu tippen, oder in Ereignissen, die mit einer hohen Rate ausgelöst werden, wie resize
:
function delay(callback, ms) {
var timer = 0;
return function() {
var context = this, args = arguments;
clearTimeout(timer);
timer = setTimeout(function () {
callback.apply(context, args);
}, ms || 0);
};
}
// Example usage:
$('#input').keyup(delay(function (e) {
console.log('Time elapsed!', this.value);
}, 500));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label for="input">Try it:
<input id="input" type="text" placeholder="Type something here..."/>
</label>
Wie es funktioniert:
El delay
Funktion gibt eine gepackte Funktion zurück, die intern einen individuellen Timer handhabt. 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 neu gestartet.
Wenn der Timer schließlich endet, wird die Callback-Funktion ausgeführt, wobei der ursprüngliche Kontext und die Argumente übergeben werden (in diesem Beispiel das jQuery-Ereignisobjekt 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:
function delay(fn, ms) {
let timer = 0
return function(...args) {
clearTimeout(timer)
timer = setTimeout(fn.bind(this, ...args), ms || 0)
}
}
Die Umsetzung ist mit einer eine Reihe von Tests .
Wenn Sie etwas Anspruchsvolleres suchen, sollten Sie einen Blick auf die jQuery Typewatch Plugin.