2009-06-26 18 views
19

Projektuję stronę internetową i chciałbym móc wywołać funkcję 1 sekundę po ostatnim wprowadzeniu użytkownika. Próbowałem użyć onKeyUp, ale czekał 1 sekundę po pierwszym naciśnięciu klawisza.Jak mogę poczekać, aż użytkownik zakończy zapisywanie w tekście, aby wywołać funkcję?

Czy ktoś wie, w jaki sposób byłoby to możliwe?

+0

Interesujące pytanie - czy istnieje jakiś szczególny powód, dla którego chcesz to zrobić? – karim79

+1

Zasadniczo, gdy użytkownik zakończy pisanie w polu tekstowym, zostanie mu przedstawiony nowy. Ponieważ pole tekstowe było ostatnim, nie mogłem użyć funkcji Bur(), ponieważ musiałbym poczekać, aż fokus znajdzie się na innym polu. –

+0

Nie ma prostych, 100% sposobów na zrobienie tego. Najprostszym jest użycie zdarzenia rozmycia wejścia. (innymi sposobami może być poczekanie X sekund ** po ** użytkownik skończył pisać). –

Odpowiedz

43

Innym podobne podejście, bez globalne:

var typewatch = function(){ 
    var timer = 0; 
    return function(callback, ms){ 
     clearTimeout (timer); 
     timer = setTimeout(callback, ms); 
    } 
}();  

...

<input type="text" onKeyUp="typewatch(function(){alert('Time elapsed!');}, 1000);" /> 

Można to urywek here.

+1

+1 za wykonanie bez globali. –

+0

a +! +10 za wykonanie bez globali -1 za używanie natarczywego javascript. Chciałbym rec. używając tego kodu, a następnie wywołując go wewnątrz funkcji keyup zamiast z onclick dołączonym do elementu. – jahrichie

1

Nieważne, znalazłem sposób na zrobienie tego. Wywołuję funkcję na każdym onkeyup(), który zwiększa licznik, a następnie czeka 1 sekundę. Po 1 sekund upłynęło, to zmniejszamy licznik i sprawdzić, czy jest równa 0.

var keystrokes = 0; 
function askAgain() 
{ 
    ++keystrokes; 
    setTimeout(reveal, 1000); 
} 

function reveal() 
{ 
    --keystrokes; 

    if (keystrokes == 0) 
     alert("Watch out, there is a snake!"); 
} 
+2

Heh, to miłe. Jeśli ktoś jest naprawdę szybkim tyłem, może poczekać kilka sekund, aby zobaczyć wiadomość :-) –

+0

@DanF Nie jestem do końca pewny, ale powiedziałbym, że nawet jeśli jesteś naprawdę szybki typer d czekaj tylko jedną sekundę, ponieważ po naciśnięciu ostatniego klawisza ustawisz limit czasu, który spowoduje, że naciśnięcia klawiszy = 0 :-) – nsacerdote

19

Można użyć keyDown (lub keyUp) wydarzenie, które określa funkcję do uruchomienia w ciągu 1 sekundy, a jeśli użytkownik wpisze kolejne klucz w tej sekundzie, możesz skasować limit czasu i ustawić nowy.

E.g.

var t;  

function keyDown() 
{ 
    if (t) 
    { 
    clearTimeout(t); 
    t = setTimeout(myCallback, 1000); 
    } 
    else 
    { 
    t = setTimeout(myCallback, 1000); 
    } 
} 

function myCallback() 
{ 
    alert("It's been 1 second since you typed something"); 
} 
+0

Nie wiesz o clearTimeout! Dzięki! –

+0

Poniższa odpowiedź, która nie używa globali, to podejście o wiele lepsze. – jahrichie

0

Po prostu zmodyfikuj swoje wejście html i wrzuć ten pierwszy wiersz do istniejących funkcji, dzięki czemu nie musisz przekodować niczego, co masz. To nie wpłynie na wszystkie stare funkcje kodu wzywając albo, ponieważ jeśli nie jest ustawiona onkeypress następnie mykeypress zawsze będzie < 1.

var mykeypress=0; 
var mysleep=1000; //set this higher if your users are slow typers 
function mytest(id,text) { 
    mykeypress--; if(mykeypress > 0) { return; } 
    //anything you want when user stops typing here 
    alert("Keypress count at "+mykeypress+" ready to continue 
id is "+id+" arguement is "+text); 
} 

input type="text" name="blah" id="55" onkeypress="mykeypress++" 
onkeyup="myid=this.id;setTimeout(function(){mytest(myid,'a test')},mysleep)" 
REVERT to old way seamlessly: 
input type="text" name="blah" id="55" onkeyup="mytest(this.id,'a test')" 
0

Istnieje kilka prostych plugin Zrobiłem to robi exacly że. Wymaga znacznie mniej kodu niż niektóre proponowane rozwiązania i jest bardzo lekki (~ 0,6kb).

Najpierw należy utworzyć obiekt Bid, niż może być w dowolnej chwili bumped. Każde wywołanie bump opóźni odpalanie połączenia telefonicznego Bid dla następnej podanej ilości czasu.

var searchBid = new Bid(function(inputValue){ 
    //your action when user will stop writing for 200ms. 
    yourSpecialAction(inputValue); 
}, 200); //we set delay time of every bump to 200ms 

Kiedy Bid obiekt jest gotowy, musimy go jakoś bump. Podłączmy się, podskakując do keyupevent.

$("input").keyup(function(){ 
    searchBid.bump($(this).val()); //parameters passed to bump will be accessable in Bid callback 
}); 

Co się dzieje tutaj jest:

Everytime użytkownik naciska klawisz oferta jest 'opóźniony' (zderzyłem) dla kolejnych 200ms. Jeśli 200ms przejdzie bez ponownego "bumped", wywołanie zwrotne zostanie zwolnione.

Ponadto, masz 2 dodatkowe funkcje zatrzymywania stawkę (jeśli naciśnięty użytkownika ESC lub kliknąć poza wejściem na przykład) i do wykańczania i natychmiast wypalania zwrotnego (na przykład, gdy użytkownik naciśnie klawisz Enter):

searchBid.stop(); 
searchBid.finish(valueToPass); 
Powiązane problemy