Rilevamento del cambiamento di input in jQuery?


360

Quando si utilizza jquery .changesu un inputevento, l'evento verrà generato solo quando l'ingresso perde lo stato attivo

Nel mio caso, devo effettuare una chiamata al servizio (controlla se il valore è valido) non appena il valore di input viene modificato. Come potrei farlo?


3
che tipo di input? casella di testo? casella di controllo? Radio? textarea? vediamo cosa ti è venuto in mente finora
Patricia,

Siamo spiacenti, è un input di tipo testo. E come ho detto, ho provato a cambiare, ma questo non si attiva come mi serve (per ogni modifica del testo nell'input). Ho anche provato il keydown ma per farlo funzionare dovrò tenere traccia se l'input è "sporco" o no.
Banshee,

2
se stanno premendo un tasto, cambierà il 99% delle volte, potresti sempre fare un controllo per i tasti che non sarebbero nel gestore dell'evento.
Patricia,

Risposte:


546

AGGIORNATO per chiarimenti ed esempio

esempi: http://jsfiddle.net/pxfunc/5kpeJ/

Metodo 1. inputevento

Nei browser moderni utilizzare l' inputevento. Questo evento si attiva quando l'utente sta digitando in un campo di testo, incollando, annullando, praticamente ogni volta che il valore cambia da un valore all'altro.

In jQuery farlo in questo modo

$('#someInput').bind('input', function() { 
    $(this).val() // get the current value of the input field.
});

a partire da jQuery 1.7, sostituire bindcon on:

$('#someInput').on('input', function() { 
    $(this).val() // get the current value of the input field.
});

Metodo 2. keyupevento

Per i browser meno recenti utilizzare l' keyupevento (questo si attiverà una volta rilasciato un tasto sulla tastiera, questo evento può dare una sorta di falso positivo perché quando "w" viene rilasciato il valore di input viene modificato e l' keyupevento si attiva, ma anche quando il Il tasto "shift" viene rilasciato e l' keyupevento si attiva ma non è stata apportata alcuna modifica all'ingresso.). Inoltre, questo metodo non si attiva se l'utente fa clic con il pulsante destro del mouse e incolla dal menu di scelta rapida:

$('#someInput').keyup(function() {
    $(this).val() // get the current value of the input field.
});

Metodo 3. Timer ( setIntervalo setTimeout)

Per aggirare i limiti keyupè possibile impostare un timer per controllare periodicamente il valore dell'input per determinare una variazione di valore. È possibile utilizzare setIntervalo setTimeoutper eseguire questo controllo del timer. Vedere la risposta contrassegnata su questa domanda SO: evento di modifica della casella di testo jQuery o vedere il violino per un esempio funzionante utilizzando focuse gli blureventi per avviare e arrestare il timer per un campo di input specifico


Potresti spiegare di più su questa soluzione? Come ottengo il valore corrente? Come faccio a farlo funzionare solo quando vengono apportate modifiche al valore corrente?
Banshee,

evento di input? non ci sono eventi in ingresso in jQuery (ancora) ... stackoverflow.com/q/11189136/104380
vsync

Per il metodo 2 di solito mi associo sia al keyup che al change. In questo modo, nelle situazioni in cui l'input si verifica senza una pressione di un tasto (come incollare), si attiva almeno l'evento quando l'input perde lo stato attivo.
velocità

1
@AdiDarachi MutationObserver terrà traccia delle modifiche agli elementi DOM. Tuttavia, un utente che modifica i dati in un campo di input non attiva una modifica di MutationObserver ... Ho impostato un caso di test, solo una modifica del codice JS all'attributo innerTexto value(simulazione dell'input dell'utente) attiverà un evento MutationObserver jsfiddle.net/pxfunc/ 04chgpws / 1 (consultare console.log per la registrazione degli eventi MutationObserver). Hai un caso di prova diverso che posso guardare?
MikeM,

1
questo non funziona quando uno script cambia il valore
FalcoGer

189

Se hai HTML5:

  • oninput (si attiva solo quando si verifica effettivamente un cambiamento, ma lo fa immediatamente)

Altrimenti è necessario controllare tutti questi eventi che potrebbero indicare una modifica al valore dell'elemento di input:

  • onchange
  • onkeyup( no keydown o keypresspoiché il valore dell'input non contiene ancora la nuova sequenza di tasti)
  • onpaste (quando supportato)

e forse:

  • onmouseup (Non sono sicuro di questo)

@naomik dal mio test funziona per gli input della casella di controllo; eccetto IE / Edge. Potrebbero apparire alcune altre eccezioni, ma è più intelligente usare onchange per quei tipi di input (IMHO).
HellBaby

82

Con HTML5 e senza usare jQuery, puoi utilizzare l' inputevento :

var input = document.querySelector('input');

input.addEventListener('input', function()
{
    console.log('input changed to: ', input.value);
});

Questo si attiva ogni volta che cambia il testo dell'input.

Supportato in IE9 + e altri browser.

Provalo dal vivo in un jsFiddle qui .



1
'change' si attiva solo sulla sfocatura, non quando il testo cambia. Utilizzare l'evento "input" per rilevare le modifiche al testo.
Dermot Doherty,

14

Come altri hanno già suggerito, la soluzione nel tuo caso è quella di annusare più eventi .
I plugin che svolgono questo lavoro spesso ascoltano i seguenti eventi:

$ input.on ('cambia keydown keypress keyup mousedown click mouseup', gestore);. on ( 'cambia keydown keypress keyup mousedown click mouseup' , gestore );

Se si pensa che può andare bene, è possibile aggiungere focus, blure altri eventi troppo.
Suggerisco di non eccedere negli eventi da ascoltare, in quanto carica nella memoria del browser ulteriori procedure da eseguire in base al comportamento dell'utente.

Attenzione: nota che la modifica del valore di un elemento di input con JavaScript (ad es. Tramite il .val()metodo jQuery ) non genererà nessuno degli eventi sopra.
(Riferimento: https://api.jquery.com/change/ ).


consiglio anche di aggiungere il focusout per evitare problemi con il completamento automatico
binar

Vedo. Ho cercato e il focusout sembra essere supportato solo da IE e parzialmente da Chrome, vero?
Emanuele Del Grande,

5
Proprio come una leggera aggiunta, per lanciare l'evento da jQuery puoi chiamare l'azione corrispondente dopo, .val()ad esempio, per un evento di cambiamento su un campo di input, faresti qualcosa del genere ... $('#element').val(whatever).change()
techknowcrat,

2

Se desideri che l'evento venga generato ogni volta che qualcosa viene modificato all'interno dell'elemento, puoi utilizzare l' evento keyup .


Va bene, ma non è più o meno lo stesso del keydown? Dovrò verificare se l'ingresso è "sporco" da solo?
Banshee,

@SnowJim se vuoi fare cose solo quando l'input cambia davvero, devi usare onchangeo tracciare tu stesso lo stato. keydownnon funziona perché si attiva prima che lo stato dell'input venga modificato.
Alnitak,

@Alnitak esattamente ed è per questo che ho posto la domanda qui. L'onchange non funziona, viene lanciato solo quando si lascia l'input.
Banshee,

L'elefante nella stanza ovviamente è mobile. Abbastanza sicuro che nessun evento di tastiera o mouse sarà di grande utilità lì. : p
Askdesigners,

@Askdesigners Gli eventi Keyup / down dovrebbero funzionare allo stesso modo sui dispositivi mobili.
Jivings,

2

// .blur viene attivato quando l'elemento perde lo stato attivo

$('#target').blur(function() {
  alert($(this).val());
});

// Per attivare manualmente utilizzare:

$('#target').blur();

1
.change è come ho detto solo quando l'ingresso inout perde lo stato attivo e il valore viene modificato, ho bisogno di ottenere un pari non appena viene modificato l'input (testo) (non appena viene modificato il testo nell'input). La sfocatura si attiva solo quando l'ingresso perde la messa a fuoco.
Banshee,

1

Ci sono eventi jQuery come keyup e keypress che puoi usare con input HTML Elements. È inoltre possibile utilizzare l' evento blur () .


1
.change è come ho detto solo quando l'ingresso inout perde lo stato attivo e il valore viene modificato, ho bisogno di ottenere un pari non appena viene modificato l'input (testo) (non appena viene modificato il testo nell'input). La sfocatura si attiva solo quando l'ingresso perde la messa a fuoco.
Banshee,

1
non è possibile controllare in modo affidabile il valore di un input durante un keypressevento perché il tasto premuto non ha ancora modificato quel valore.
Alnitak,

0

Questo copre ogni modifica a un input usando jQuery 1.7 e versioni successive:

$(".inputElement").on("input", null, null, callbackFunction);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.