2010-02-24 12 views
9

Ogni volta che ho bisogno di scrivere un pezzo di codice JavaScript che controlla una casella di input, di solito finiscono per fare qualcosa di simile:C'è un evento DOM "contenuto della texbox modificato"?

$("#field").keyup(myHandler).keydown(myHandler).change(myHandler); 

Non è perfetto, ma di solito funziona nella maggior parte dei casi, e così mi muovo su . Mi capita solo di avere un po 'di tempo per indagare correttamente. Probabilmente il problema principale è che non cattura le modifiche fatte tramite il mouse (tasto destro del mouse + incolla/taglia). Inoltre, non è proprio quello che voglio. Questo blocca tutti i movimenti del cursore e altri eventi della tastiera, che io non sono veramente interessati a Quindi la domanda è:.

C'è un affidabile evento cross-browser che viene sparato ogni volta dopo il contenuto di un ingresso o textarea cambia?

Durante una ricerca breve, ho trovato gli eventi onpropertychange e DOMAttrModified. Ma a parte il fatto che non funzionano in tutti i browser, non sembrano essere sparati quando si modifica un input o una textarea.

+0

Forse una domanda stupida, ma perché "onchange" non è un'opzione qui? Spara troppo presto? –

+0

Spara troppo tardi; si attiva solo quando la casella di testo viene lasciata. –

risposta

6

Sembra che almeno le ultime versioni di Internet Explorer, Firefox, Chrome e Safari supportino tutti gli eventi cut e paste, che vengono attivati ​​immediatamente dopo che il testo viene tagliato o incollato in un dato elemento di input. Gli eventi sono attivati ​​dalle interazioni tramite mouse e. L'ascolto di una combinazione di questi e altri eventi dovrebbe fornire la funzionalità che stai cercando.

$("#foo").bind("keyup keydown change paste cut", handler); 

Ho provato questo su un Mac in Firefox 3.6, Chrome 5.0 (dev), e Safari 4, e su Windows in Firefox 3.5 e IE8.

+0

Buon consiglio. Perché non premere il tasto anziché la chiave, il keydown? –

+0

A seconda del browser, l'evento 'keypress' non viene attivato in tutti i casi. Ad esempio, quando viene premuto il tasto Ctrl, vengono attivati ​​'keydown' e' keyup', ma 'keypress' non * *. Suppongo che non importi in questo caso, ma poiché l'esempio dell'OP ha usato 'keydown' e' keyup', l'ho fatto anch'io. L'uso di 'keypress' funzionerebbe altrettanto bene qui. –

+0

Grazie, consiglio molto utile. Inoltre, non sapevo che puoi semplicemente concatenare nomi di eventi come questo: $ ("# foo"). Bind ("keyup keydown change paste cut", handler). –

Problemi correlati