Czy jQuery ma wbudowany sposób robienia tego?
nr
Jeśli nie, to czy istnieje lepszy wzorzec dla tej operacji w waniliowym JS niż użyłem w moim drugim jsfiddle przykład?
Zamiast używać setTimeout
i flag, można śledzić, kiedy dzwoniący był wywoływany po raz ostatni i wywoływać go tylko po upływie określonego czasu. Jest to określane jako throttling i istnieją różne sposoby na jego wdrożenie.
W najprostszej formie wystarczy zignorować każde wywołanie, które jest wykonywane w czasie lastCall + interval
, tak aby miało miejsce tylko jedno połączenie w każdym interwale.
E.g.tutaj jest funkcja, która zwraca nową funkcję, która może być wywołana tylko raz co X milisekund:
function throttle(func, interval) {
var lastCall = 0;
return function() {
var now = Date.now();
if (lastCall + interval < now) {
lastCall = now;
return func.apply(this, arguments);
}
};
}
które można wykorzystać jako
$("#inputField").on("keypress", throttle(function(event) {
$("div#output").append("key pressed <br/>");
}, 500));
DEMO
Jak Esailija wspomina w his comment, może to nie jest dławienie, które potrzebujesz, ale rozwiązuje się podając. Jest to podobna, ale nieco odmienna koncepcja. Podczas gdy dławienie oznacza, że coś powinno się zdarzyć tylko raz na każde x milisekundy, rozwodnienie oznacza, że coś powinno wystąpić tylko wtedy, gdy nie wystąpiło w ostatnich x milisekundach.
Typowym przykładem jest wydarzenie scroll
. Program obsługi zdarzeń przewijania będzie wywoływany bardzo często, ponieważ zdarzenie jest w zasadzie wyzwalane w sposób ciągły. Ale może chcesz uruchomić program obsługi tylko wtedy, gdy użytkownik przestał przewijać, a nie przewijać.
Prostym sposobem osiągnięcia tego celu jest wykorzystanie limitu czasu i anulować ją, jeśli ta funkcja jest ponownie wywoływany (a limit czasu jeszcze nie działać):
function debounce(func, interval) {
var lastCall = -1;
return function() {
clearTimeout(lastCall);
var args = arguments;
var self = this;
lastCall = setTimeout(function() {
func.apply(self, args);
}, interval);
};
}
Wadą tej realizacji jest to, że ciebie nie może zwrócić wartości z obsługi zdarzenia (na przykład return false;
). Być może istnieją implementacje, które mogą zachować tę funkcję (jeśli jest to wymagane).
DEMO
Można rozważyć użycie zamiast keyup, chyba że masz jakiś powód chcąc się powtarza. – GreatBigBore
https://code.google.com/p/jquery-debounce/ http://www.hnldesign.nl/blog/debouncing-events-with-jquery/ – zerkms
@zerkms dzięki, naprawdę chciałem zrobić to w "czysta" jQuery bez wtyczek, ale to bardzo pomocne - rozważ promowanie, aby odpowiedzieć, abym mógł się upomnieć! – davnicwil