2011-12-03 15 views
5

Ok, więc szukam jak w Google, wpisujesz tekst na wejściu i natychmiast podajesz wpisy. Ale tego nie lubię. Używam czegoś takiego: $("TEXTINPUT").keyup(function() {. Gdy użytkownik pisze bardzo szybko, łączy się z bazą danych wiele razy. Czy jest możliwe, że połączymy się z plikiem PHP tylko wtedy, gdy użytkownik przestanie pisać przez 1-2 sekundy, ale nie od razu? Muszę to zrobić w jQuery. Dzięki.Jak dławić oddzwonienie zdarzenia jQuery?

+0

użyć 'setTimeout' z' keyup' fucntion – diEcho

+0

Potrafię zrozumieć tag PHP tutaj, ale mysql? –

Odpowiedz

9

Spróbuj:

var time_out; 
$("TEXTINPUT").keyup(function(){ 
    clearTimeout(time_out); 
    time_out = setTimeout(your_function, 500); 
} 

function your_function() 
{ 
    /*CHECK DATABASE*/ 
} 
0

Oto jak to zwykle zbliżyć go:

$(function(){ 
    var tiTO, jqXHR; 
    $('textinput').keyup(function(){ 
    if (tiTO) clearTimeout(tiTO); 
    if (jqXHR && jqXHR.abort) jqXHR.abort(); 
    tiTO = setTimeout(function(){ 
     jqXHR = $.ajax({....}); 
     //Ajax call to PHP 
    },2000); 
    }); 
}); 

Każdy keyup resetuje limit czasu i przerywa żadnego aktywnego ajax.

12

Jeśli używasz Underscore Library jest to tak proste, jak to:

$("TEXTINPUT").keyup(_.throttle(function() {...}, 150));

Docs z witryny podkreślenia:

przepustnicy     _.throttle (funkcja, czekaj)

Zwraca dławiony w wersji z funkcji, które, gdy wywoływany wielokrotnie , tylko rzeczywiście wywołać funkcję owinięte co najwyżej raz na każde czekają milisekund. Przydatny w przypadku zdarzeń ograniczających szybkość, które pojawiają się szybciej niż jest to możliwe.

Istnieje również debounce funkcja:

nieczułości     _.debounce (funkcja, czekaj)

Wywołanie debounced funkcję będzie odroczyć jego wykonanie, aż po czekać milisekund mieć minęło od ostatniego wywołania funkcji . Przydatny do implementacji zachowania, które powinno się zdarzyć tylko po zatrzymaniu wprowadzania danych. Na przykład: renderowania podglądu z komentarzem Markdown, przeliczania układ po szyba przestał być zmieniany ...

+0

+1 za podkreślenie :) –

+4

Jest tylko jeden problem: co, jeśli * wystarczy * zmniejszyć przepustowość połączenia zwrotnego? Nikt nie potrzebuje do tego biblioteki - wystarczy podstawowa znajomość javascript w przeglądarce. –

4

Funkcja ta będzie działać trochę jak underscore.js, ale bez dodatkowego uzależnienia. Przekaże także zakres i argumenty, które wywołuje, do funkcji zawijanej. W odróżnieniu od odpowiedzi YoannM, zwraca ona samoistne wywołanie zwrotne, które nie używa żadnych zmiennych zewnętrznych (EG, używaj tyle razy, ile chcesz).

function throttle (func, wait) { 
    return function() { 
     var that = this, 
      args = [].slice(arguments); 

     clearTimeout(func._throttleTimeout); 

     func._throttleTimeout = setTimeout(function() { 
      func.apply(that, args); 
     }, wait); 
    }; 
} 

Używanie byłoby prawie identyczne z biblioteką underscore.js.

$('input').on('input keyup', throttle(function() { 
    // ... 
}, 100)); 
+0

Myślę, że to jest wyłamywanie, a nie dławienie zachowania –

+1

To dobry punkt; Nie miałem zbyt jasnego rozróżnienia na oderwanie od rozróżnienia przepustnicy, kiedy odpowiadałem na pytanie. Ironia polega na tym, że była to adaptacja funkcji "przepustnicy" podkreślenia. @ ХристоПанайотов być może mógłbyś wyjaśnić: http://stackoverflow.com/questions/25991367/difference-between-throttling-and-debouncing-a-function (Brak szczególnie dobrej odpowiedzi.) –