Mam pole wyszukiwania. W tej chwili szuka każdego klucza. Jeśli więc ktoś wpisze „Windows”, przeprowadzi wyszukiwanie w AJAX dla każdego klucza: „W”, „Wi”, „Win”, „Wind”, „Windo”, „Window”, „Windows”.
Chcę mieć opóźnienie, więc wyszukuje tylko wtedy, gdy użytkownik przestaje pisać na 200 ms.
W tej keyup
funkcji nie ma takiej opcji i próbowałem setTimeout
, ale to nie działało.
Jak mogę to zrobić?
javascript
jquery
ajsie
źródło
źródło
Odpowiedzi:
Używam tej małej funkcji do tego samego celu, wykonując funkcję po tym, jak użytkownik przestanie pisać przez określony czas lub w przypadku zdarzeń, które uruchamiają się z dużą częstotliwością, takich jak
resize
:Jak to działa:
delay
Funkcja zwróci zawinięty funkcję, która wewnętrznie obsługuje indywidualny licznik w każdym wykonaniu timer zostaje wznowiona z opóźnieniem czasowym przewidzianym, jeśli wiele egzekucje wystąpić przed przechodzi ten czas, zegar zostanie zresetowany i po prostu zacząć od nowa.Kiedy licznik czasu w końcu się kończy, funkcja wywołania zwrotnego jest wykonywana, przekazując oryginalny kontekst i argumenty (w tym przykładzie obiekt zdarzenia jQuery i element DOM as
this
).AKTUALIZACJA 16.05.2019
Ponownie zaimplementowałem tę funkcję za pomocą funkcji ES5 i ES6 w nowoczesnych środowiskach:
Implementacja objęta jest zestawem testów .
Jeśli szukasz czegoś bardziej zaawansowanego, zajrzyj do wtyczki jQuery Typewatch .
źródło
Jeśli chcesz wyszukać po zakończeniu typu, użyj zmiennej globalnej, aby zatrzymać limit czasu zwrócony z twojego
setTimout
połączenia i anuluj go,clearTimeout
jeśli jeszcze się nie zdarzyło, aby nie uruchomił limitu czasu poza ostatnimkeyup
zdarzeniemLub z anonimową funkcją:
źródło
Kolejne niewielkie udoskonalenie odpowiedzi CMS. Aby łatwo zezwolić na osobne opóźnienia, możesz użyć następujących opcji:
Jeśli chcesz ponownie użyć tego samego opóźnienia, po prostu zrób
Jeśli chcesz osobnych opóźnień, możesz to zrobić
źródło
someApiCall
wciąż wyzwala wiele razy - teraz tylko z końcową wartością pola wejściowego.Możesz także zajrzeć na underscore.js , który udostępnia metody narzędziowe, takie jak debounce :
źródło
Na podstawie odpowiedzi CMS zrobiłem to:
Wpisz poniższy kod po dołączeniu jQuery:
I po prostu użyj tego w następujący sposób:
Uwaga: zmienna $ (this) w funkcji przekazana jako parametr nie pasuje do danych wejściowych
źródło
Opóźnij połączenia wielofunkcyjne za pomocą etykiet
Z tym rozwiązaniem współpracuję. Opóźni to wykonanie dowolnej funkcji . Może to być zapytanie wyszukiwania klucza, może szybkie kliknięcie poprzednich lub następnych przycisków (które w przeciwnym razie wysyłałyby wiele żądań, jeśli byłyby szybko klikane w sposób ciągły, i mimo wszystko nie byłyby używane). Korzysta z obiektu globalnego, który przechowuje każdy czas wykonania i porównuje go z najnowszym żądaniem.
W rezultacie wywoływane jest tylko to ostatnie kliknięcie / akcja, ponieważ żądania te są przechowywane w kolejce, że po X milisekundach jest wywoływane, jeśli w kolejce nie istnieje żadne inne żądanie o tej samej etykiecie!
Możesz ustawić własny czas opóźnienia (opcjonalny, domyślnie 500ms). I wyślij argumenty funkcji w sposób „zamykający”.
Na przykład, jeśli chcesz wywołać funkcję poniżej:
Aby zapobiec wielu żądaniom send_ajax, opóźnij je, używając:
delay_method( "check date", function(){ send_ajax(2); } ,600);
Każde żądanie, które używa etykiety „data sprawdzenia”, zostanie uruchomione tylko wtedy, gdy nie zostanie wysłane żadne inne żądanie w okresie 600 milisekund. Ten argument jest opcjonalny
Niezależność od etykiet (wywoływanie tej samej funkcji docelowej), ale uruchamianie obu:
Powoduje wywołanie tej samej funkcji, ale opóźnia je niezależnie, ponieważ ich etykiety są różne
źródło
Super proste podejście, zaprojektowane do uruchamiania funkcji po zakończeniu pisania przez użytkownika w polu tekstowym ...
źródło
Jeśli ktoś lubi opóźniać tę samą funkcję i bez zmiennej zewnętrznej może użyć następnego skryptu:
źródło
Ta funkcja nieco rozszerza funkcję z odpowiedzi Gatena, aby odzyskać element:
http://jsfiddle.net/Us9bu/2/
źródło
To działało dla mnie, gdy opóźniam operację logiki wyszukiwania i sprawdzam, czy wartość jest taka sama, jak wpisana w polu tekstowym. Jeśli wartość jest taka sama, wykonuję operację na danych związanych z wartością wyszukiwania.
źródło
Dziwi mnie, że nikt nie wspominał o problemie z wieloma danymi wejściowymi w bardzo ładnym fragmencie CMS-a.
Zasadniczo musiałbyś zdefiniować zmienną opóźnienia indywidualnie dla każdego wejścia. W przeciwnym razie, jeśli ktoś umieści tekst na pierwszym wejściu i szybko przeskoczy na inne wejście i zacznie pisać, oddzwanianie dla pierwszego NIE BĘDZIE wywoływane!
Zobacz poniższy kod, z którego korzystałem na podstawie innych odpowiedzi:
To rozwiązanie utrzymuje referencję setTimeout w zmiennej wejściowej delayTimer. Przekazuje również odwołanie elementu do wywołania zwrotnego, jak sugeruje fazzyx.
Testowane w IE6, 8 (comp - 7), 8 i Opera 12.11.
źródło
Funkcja opóźnienia przywoływana przy każdym klawiszu. Wymagane jQuery 1.7.1 lub nowsze
Stosowanie:
$('#searchBox').keyupDelay( cb );
źródło
Opierając się na odpowiedzi CMS, oto nowa metoda opóźnienia, która zachowuje „to” w swoim użyciu:
Stosowanie:
źródło
Posługiwać się
gdzie wyrażenie jest skryptem do uruchomienia, a limit czasu to czas oczekiwania w milisekundach przed jego uruchomieniem - to NIE wywołuje skryptu, ale po prostu opóźnia wykonanie tej części, dopóki limit czasu nie zostanie przekroczony.
zresetuje / wyczyści limit czasu, aby nie uruchamiał skryptu w wyrażeniu (jak anulowanie), dopóki nie został jeszcze wykonany.
źródło
Jest to rozwiązanie zgodne z CMS, ale rozwiązuje dla mnie kilka kluczowych problemów:
Stosowanie:
Kod jest napisany w stylu, który mi się podoba, być może trzeba dodać kilka średników.
O czym należy pamiętać:
this
działa zgodnie z oczekiwaniami (jak w przykładzie).setTimeout
.Rozwiązanie, którego używam, dodaje kolejny poziom złożoności, umożliwiając na przykład anulowanie wykonania, ale jest to dobra podstawa do budowania.
źródło
Na podstawie odpowiedzi CMS ignoruje kluczowe zdarzenia, które nie zmieniają wartości.
źródło
Połączenie odpowiedzi CMS z odpowiedzią Miguela daje solidne rozwiązanie pozwalające na równoczesne opóźnienia.
Jeśli chcesz opóźnić różne działania niezależnie, użyj trzeciego argumentu.
źródło
Użyj wtyczki jQuery bindWithDelay :
źródło
źródło
Oto sugestia, którą napisałem, która dotyczy wielu danych wejściowych w formularzu.
Ta funkcja pobiera obiekt pola wejściowego i umieszcza w kodzie
Jest to faktyczna funkcja delayCall, która obsługuje wiele pól wejściowych
Stosowanie:
źródło
W ES6 można również używać składni funkcji strzałek .
W tym przykładzie kod opóźnia
keyup
zdarzenie o 400 ms po zakończeniu pisania przez użytkowników przed wywołaniem,searchFunc
aby wysłać zapytanie.źródło
jQuery :
Czysty JavaScript:
źródło
Spójrz na wtyczkę autouzupełniania . Wiem, że pozwala określić opóźnienie lub minimalną liczbę znaków. Nawet jeśli nie użyjesz wtyczki, przejrzenie kodu da ci kilka pomysłów, jak go zaimplementować.
źródło
Zrobiłem też kawałek kodu dla ograniczenia żądania wysokiej częstotliwości ajax spowodowanego przez Keyup / Keydown. Spójrz na to:
https://github.com/raincious/jQueue
Wykonaj zapytanie w ten sposób:
I powiązaj wydarzenie w ten sposób:
źródło
Widziałem to dzisiaj trochę późno, ale po prostu chcę to tutaj umieścić na wypadek, gdyby ktoś inny potrzebował. wystarczy oddzielić funkcję, aby można ją było ponownie wykorzystać. poniższy kod będzie czekał 1/2 sekundy po wpisaniu stop.
źródło
Użytkownik biblioteki javascript lodash i użyj funkcji _.debounce
źródło
źródło