L'evento di modifica della casella di testo jQuery non si attiva fino a quando la casella di testo non viene disattivata?


133

Ho scoperto che l'evento di modifica jQuery su una casella di testo non si attiva finché non faccio clic all'esterno della casella di testo.

HTML:

<input type="text" id="textbox" />

JS:

$("#textbox").change(function() {alert("Change detected!");});

Guarda la demo su JSFiddle

La mia applicazione richiede che l'evento venga attivato su ogni cambio di carattere nella casella di testo. Ho anche provato a usare il keyup invece ...

$("#textbox").keyup(function() {alert("Keyup detected!");});

... ma è risaputo che l'evento keyup non viene generato facendo clic con il pulsante destro del mouse.

Qualche soluzione? Avere entrambi gli ascoltatori causerà qualche problema?


^^ Questo. Puoi avere tutti i gestori di eventi che desideri.
Ripristina Monica Cellio il

Risposte:


298

Associare entrambi gli eventi è il modo tipico di farlo. Puoi anche associare l'evento incolla.

Puoi associare più eventi come questo:

$("#textbox").on('change keyup paste', function() {
    console.log('I am pretty sure the text box changed');
});

Se vuoi essere pedante al riguardo, dovresti anche associarti al mouse per provvedere al trascinamento del testo e aggiungere una lastValuevariabile per assicurarti che il testo sia effettivamente cambiato:

var lastValue = '';
$("#textbox").on('change keyup paste mouseup', function() {
    if ($(this).val() != lastValue) {
        lastValue = $(this).val();
        console.log('The text box really changed this time');
    }
});

E se vuoi essere super duperpedante, dovresti usare un timer intervallo per soddisfare il riempimento automatico, i plugin, ecc:

var lastValue = '';
setInterval(function() {
    if ($("#textbox").val() != lastValue) {
        lastValue = $("#textbox").val();
        console.log('I am definitely sure the text box realy realy changed this time');
    }
}, 500);

9
Finalmente qualcuno ha letto la domanda e ha risposto a tutto!
Ripristina Monica Cellio il

4
.on('change keyup paste', function() {...}spara davvero più volte! Se ho digitato un personaggio e poi fatto clic all'esterno, gli eventi 'change' e 'keyup' vengono entrambi attivati, portando alla funzione eseguita più volte! Se ho fatto clic con il pulsante destro del mouse e poi ho fatto clic all'esterno, "modifica" e "incolla" vengono entrambi attivati. Diamine! Usando Ctrl + V per incollare e poi facendo clic all'esterno viene attivato tre volte !!
SNag

1
@Snag sì, quindi allo stesso modo dovresti aggiungere un segno di spunta usando una lastValuevariabile per assicurarti che sia effettivamente cambiata.
Petah,

1
+1. Tuttavia, è vincolante anche il "cambiamento" qui? Non mi è chiaro quale caso sarebbe stato in grado di gestire e che non sarebbe già stato gestito al momento del licenziamento.
Madbreaks

1
L'evento incolla viene generato prima che il testo venga effettivamente incollato
Developerbmw

85

Sui browser moderni, puoi utilizzare l' inputevento :

DEMO

$("#textbox").on('input',function() {alert("Change detected!");});

1
Bello - Non ne ero a conoscenza. È una cosa HTML5?
Ripristina Monica Cellio il

4
Mi sarebbe piaciuto accettare questa risposta, ma come hai detto tu, questa è una soluzione per i browser moderni. La mia applicazione web è destinata agli utenti che utilizzano ancora IE8 e questo non funziona su IE8. :( Cosa posso dire .. :(
SNag

Non si
attiva

4
$(this).bind('input propertychange', function() {
        //your code here
    });

Funziona per digitare, incollare, fare clic con il tasto destro del mouse, ecc.


1
Questa sembra la soluzione migliore perché non genera più eventi se fai qualcosa come premere la freccia su su un campo numerico.
Justin

Soluzione semplice ed efficiente
Abdulhameed

4
if you write anything in your textbox, the event gets fired.
code as follows :

HTML:

<input type="text" id="textbox" />

JS:

<script type="text/javascript">
  $(function () {
      $("#textbox").bind('input', function() {
      alert("letter entered");
      });
   });
</script>

2

Prova questo:

$("#textbox").bind('paste',function() {alert("Change detected!");});

Guarda la demo su JSFiddle .


Poiché la domanda è incollata, non funziona. l'evento non viene generato facendo clic con il pulsante destro del mouse e incolla.
Dhaval Marthak,

E cosa c'entra questo con l'uso di bind()?
Ripristina Monica Cellio il

ha detto che l'evento keyup non viene generato quando si fa clic con il tasto destro del mouse + incolla su di esso, quindi keyupe change()ha il proprio comportamento tipico così id che vuole eseguire l'evento, quindi pastepotrebbe essere l'opzione
Dhaval Marthak,

Certo, ma questo non risponde ancora al motivo per cui bindinvece di usare on.
Ripristina Monica Cellio il

0

Prova il codice seguente:

$("#textbox").on('change keypress paste', function() {
  console.log("Handler for .keypress() called.");
});

In che modo cattura e incolla con il mouse, come indicato nella domanda?
Ripristina Monica Cellio il

keypress è adatto dal momento che ha detto cheevent to be fired on every character change in the textbox
Venkat.R

Se avessi letto tutte le domande che avresti visto, avrebbe anche detto:"...but it's a known fact that the keyup event isn't fired on right-click-and-paste."
Ripristina Monica Cellio il

0

Leggere i tuoi commenti mi ha portato a una soluzione sporca. Questo non è un modo giusto, lo so, ma può essere una soluzione.

$(function() {
    $( "#inputFieldId" ).autocomplete({
        source: function( event, ui ) {
            alert("do your functions here");
            return false;
        }
    });
});
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.