2009-09-04 6 views
23

Ciao ancora padroni del Web :) Ora, ho una nuova stupida domanda, e sto chiedendo di perdonarmi. Ho letto ovunque su questa soluzione, ma non ho trovato quello che funziona per me.OnKeyUp JavaScript Time Delay?

ho ottenuto:

<input name="domain" type="text" id="domain" onKeyUp="javascript:chk_me();"> 

Tutto quello che chiedo è come fare questo non per verificare dopo aver premuto un pulsante, ma dopo per dire 1000 millisecondi di inattività della tastiera?

risposta

34

Prova questa:

var timer; 
function chk_me(){ 
    clearTimeout(timer); 
    timer=setTimeout(function validate(){...},1000); 
} 

In questo modo ogni volta che si preme un tasto, il timeout sarà cancellato e il set di nuovo.

+2

Penso che 'var timer' deve essere al di fuori del corpo della funzione – Rodrigo

+0

hai ragione il timer deve essere impostato all'esterno della funzione, ho modificato la risposta – mck89

+0

Grazie! Migliore risposta del lotto con un margine equo. – Shog9

-2

setTimeout() sarebbe quello;)

<input name="domain" type="text" id="domain" onKeyUp="setTimeout('chk_me()',1000);"> 

link text

+0

Ciò non preservare il valore della variabile 'this' contesto quando si chiama' chk_me() '. Inoltre, l'uso della variazione di 'setTimeout()' che prende e valuta una stringa contenente codice è inutile in questo scenario e disordinata in tutti gli scenari. – Shog9

+0

Ciao Berzemus, grazie per la tua risposta. Ho già provato questo. Funziona, ma il problema è che non ritarda l'esecuzione dello script stesso. Ritarda dopo ogni singola pressione del tasto ... – Spoonk

16

Un altro approccio, senza globali:

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

Usage:

Attaccare l'evento attraverso JavaScript:

window.onload = function() { 
    document.getElementById('domain').onkeyup = function() { 
     typewatch(function(){alert('Time elapsed!');}, 1000); 
    }; 
}; 

o utilizzando un gestore di eventi in linea (non tanto raccomandata) come nel tuo esempio:

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

Provare una demo here.

+1

Cosa ti fa pensare che il typewatch non sia globale? –

+1

sì typewatch è globale, ma intendo che la variabile ** timer ** non è nello scope globale e può essere raggiunta solo dalla funzione typewatch. – CMS

0

Post davvero utile!

Un altro approccio senza globali, utilizzando le proprietà funzionali:

function chk_me(){ 
    if(typeof timer !== undefined){ 
    clearTimeout(this.timer); 
    } 
    this.timer=setTimeout(function validate(){validate(...)},1000); 
}