2010-06-20 9 views
9

Esiste un modo cross-browser per rilevare le modifiche in tempo reale a un campo di input?Cross-browser JavaScript input live change/paste detection

Con vivo, io non intendo quando il campo perde lo stato attivo, e non sul prossimo pressione dei tasti, e così via. Immediatamente o qualcosa del genere.

utilizzando combinazioni di jQuery e .change(), .keyup(), .bind('paste') e così via posso ottenere lavorando rilevamento delle modifiche dal vivo nel alcuni browser, ma non tutti. L'uso di combinazioni diverse lo farà funzionare in qualche modo in altri browser.

La cosa più difficile ottenere lavoro è manipolazione del mouse del campo di immissione - selezione del testo e spostandolo (che è essenzialmente tagliato e paste), clic destro e incollare o taglio, ecc Per qualche ragione anche .mousedown() e .mouseup() non sembrano tagliarlo.

L'unica soluzione cross-browser che posso pensare al momento è di controllare il valore del campo di input ogni 100-o-so millisecondi e confrontare il valore con un valore memorizzato. Tuttavia, sembra che l'overkill quando la soluzione basata su eventi sia così vicina.

C'è un plug-in jQuery che lo fa già? O c'è un altro modo per raggiungere questo obiettivo?

+0

jQuery dovrebbe essere cross browser compatibile in proposito, almeno per quei browser e la loro versione trovate a http://docs.jquery.com/Browser_Compatibility; Se questo non è il caso, suggerirei di presentare un bug. – azatoth

+0

@aza Non sono esattamente sicuro quali helper di eventi jQuery utilizzare per ottenere ciò che voglio (un aggiornamento immediato su qualsiasi modifica al valore del campo di input), poiché '.change()' viene attivato quando il campo di input perde messa a fuoco. Lo sai? – javascripteroo

+0

Qui viene descritta una semplice soluzione: http://whattheheadsaid.com/2010/09/effectively-detecting-user-input-in-javascript – biziclop

risposta

2

Per completare la modifica e i gestori delle chiavi, è possibile aggiungere gestori per cut/copy/paste. Funzionano in Firefox> = 3, IE, Safari e Chrome (ma non in Opera/Konqueror).

Questo coprirebbe tutto per il tuo caso d'uso?

+0

Sembra promettente. Tuttavia, non rileva le modifiche di trascinamento della selezione in IE8. Grazie, esamineremo ulteriormente. Il metodo di collegamento degli eventi 'Traditional' è' elm ['onchange'] = fn'? – javascripteroo

+0

@javascripteroo: Buono a sapersi, a proposito di IE8. Sì, questo è il modello tradizionale (uguale a elm.onchange = fn), maggiori informazioni qui: http://www.quirksmode.org/js/events_tradmod.html –

1

A seconda del browser che è necessario supportare, è possibile utilizzare il codice HTML5 oninput.
Si attiva immediatamente quando l'ingresso monitorato cambia. In jQuery si dovrebbe solo fare:

$('#my-input').bind('input', function(e) { 
    console.log("#my-input's value changed"); 
}); 
+1

supporto del browser 'oninput': http: //blog.danielfriesen. nome/2010/02/16/HTML5 browser-labirinto-oninput-support / – Dan