Rileva casella di testo di input modificata


289

Ho esaminato numerose altre domande e ho trovato risposte molto semplici, incluso il codice qui sotto. Voglio semplicemente rilevare quando qualcuno modifica il contenuto di una casella di testo ma per qualche ragione non funziona ... Non ricevo errori di console. Quando imposto un punto di interruzione nel browser con la change()funzione non lo colpisce mai.

$('#inputDatabaseName').change(function () { 
    alert('test'); 
});
<input id="inputDatabaseName">

1
solo un paio di cose da provare: dai all'input un tipo = "testo" e rendilo un elemento singleton. <input id = "inputDatabaseName" type = "text" />
szeliga

Eliminato del codice non necessario, solo 7 anni in ritardo.
Devil's Advocate,

Risposte:


523

È possibile utilizzare l' inputevento Javascript in jQuery in questo modo:

$('#inputDatabaseName').on('input',function(e){
    alert('Changed!')
});

In puro JavaScript:

document.querySelector("input").addEventListener("change",function () {
  alert("Input Changed");
})

O così:

<input id="inputDatabaseName" onchange="youFunction();"
onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();"/>

1
Non riesco a trovare la documentazione per questo evento, ma funziona esattamente come mi aspetto. Qualche idea su dove posso trovare la pagina del documento?
Jorge Pedret,

3
Puoi trovarlo nell'elenco degli eventi HTML5: w3schools.com/tags/ref_eventattributes.asp o qui help.dottoro.com/ljhxklln.php
Ouadie

7
Questa soluzione è in realtà molto meglio dell'utilizzo del keyup. Ad esempio, IE consente all'utente di cancellare il campo di input facendo clic su una X che non attiva il keyup.
Georg,

7
La soluzione più vicina finora, ma non funziona ancora quando il browser esegue il riempimento automatico sulle caselle di testo.
Saumil,

3
Questo è molto meglio della prima risposta. Ctrl, i tasti Maiusc contano come keyup. E la parte peggiore è che, se digiti velocemente, vari input si registrerebbero come un solo evento keyup.
ottobre

173

prova keyup invece di cambiare.

<script type="text/javascript">
   $(document).ready(function () {
       $('#inputDatabaseName').keyup(function () { alert('test'); });
   });
</script>

Ecco la documentazione ufficiale di jQuery per .keyup () .


1
sospiro, lo giuro, ci ho provato (dopo aver visto questa domanda: stackoverflow.com/questions/1443292/… ) ... ma apparentemente non perché ora funziona!
Devil's Advocate,

27
il cambiamento si attiva solo quando l'elemento perde lo stato attivo e il keyup viene attivato quando viene rilasciato un tasto sulla tastiera.
Declan Cook,

9
cosa succede se l'utente incolla il codice usando ctrl + v o trascinando un testo selezionato con il mouse su #inputDatabaseName? Come lo rilevi?
Radu Simionescu, il

5
Il problema principale è che non tiene ancora conto se il contenuto cambia effettivamente. È stato premuto solo un pulsante
Metropolis,

@Metropolis, hai visto la mia risposta ?? stackoverflow.com/a/23266812/3160597
azerafati

103

Ad ogni risposta mancano alcuni punti, quindi ecco la mia soluzione:

$("#input").on("input", function(e) {
  var input = $(this);
  var val = input.val();

  if (input.data("lastval") != val) {
    input.data("lastval", val);

    //your change action goes here 
    console.log(val);
  }

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">
<p>Try to drag the letters and copy paste</p>

I Input Eventfuochi su input da tastiera , trascinamento del mouse , riempimento automatico e copia-incolla testati su Chrome e Firefox. Il controllo del valore precedente consente di rilevare cambiamenti reali, il che significa che non si attiva quando si incolla la stessa cosa o si digita lo stesso carattere o ecc.

Esempio di lavoro: http://jsfiddle.net/g6pcp/473/


aggiornare:

E se ti piace eseguire il tuo change function solo quando l'utente termina di digitare e impedire di attivare più volte l'azione di modifica, puoi provare questo:

var timerid;
$("#input").on("input", function(e) {
  var value = $(this).val();
  if ($(this).data("lastval") != value) {

    $(this).data("lastval", value);
    clearTimeout(timerid);

    timerid = setTimeout(function() {
      //your change action goes here 
      console.log(value);
    }, 500);
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">

Se l'utente inizia a digitare (ad es. "Foobar") questo codice impedisce l' change actionesecuzione per ogni tipo di lettera dell'utente e viene eseguito solo quando l'utente smette di digitare, questo è utile specialmente quando si invia l'input al server (ad es. Input di ricerca), che server di modo fa una sola ricerca foobare non sei ricerche per fe poi foe poi fooe foobe così via.


1
Questo è stato il primo a funzionare da circa 6 che ho provato. Eccezionale. Grazie.
Enkode,

Funziona quasi su IE9: se elimini un personaggio, non attiva l'evento. Ottima soluzione però
Soma il

@Soma, come altri dicono "rompere IE non è un difetto è una caratteristica";) anche se IE non è più continuato, ma se hai una soluzione per questo facci sapere
azerafati

Lo so, ma ho dovuto farlo per lavoro :( In effetti, lo faccio: uso $("#input").focusout(function () {}). Quando fai clic al di fuori del tuo input, l'evento viene generato. Funziona sulla versione corrente di Chrome e Firefox e IE9
Soma

2
@Soma, se questo è l'unico modo per far funzionare IE, potresti usarlo a modo mio cambiando solo questa linea$("#input").on("input focusout",function(e){
azerafati,

18

Gli input di testo non generano l' changeevento fino a quando non perdono lo stato attivo. Fare clic all'esterno dell'input e verrà visualizzato l'avviso.

Se la richiamata deve attivarsi prima che l'input di testo venga disattivato, utilizzare l' .keyup()evento.


changesta lavorando qui: jsfiddle.net/g6pcp ; keyupavviso dopo ogni tasto che non è un buon modo
diEcho

1
@diEcho Penso che l'avviso sia solo un esempio per far funzionare il suo codice ... non quello che intende fare alla fine.
Scott Harwell,

@diEcho Quello che Scott ha detto, era solo a scopo di test. È così che debug: D
Devil's Advocate,

@Scott, per favore, ti preghiamo di utilizzare un debugger appropriato anziché alert(). Renderà il debug molto più semplice.
Matt Ball,

13

onkeyup, onpaste, onchange, oninputsembra non riuscire quando il browser esegue il riempimento automatico nelle caselle di testo. Per gestire un caso del genere, includi " autocomplete='off'" nel campo di testo per impedire al browser di riempire automaticamente la casella di testo,

Per esempio,

<input id="inputDatabaseName" autocomplete='off' onchange="check();"
 onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();" />

<script>
     function check(){
          alert("Input box changed");
          // Things to do when the textbox changes
     }
</script>

3

Nel mio caso, avevo una casella di testo allegata a un datepicker. L'unica soluzione che ha funzionato per me è stata gestirla all'interno dell'evento onSelect del datepicker.

<input type="text"  id="bookdate">

$("#bookdate").datepicker({            
     onSelect: function (selected) {
         //handle change event here
     }
});

0

Penso che puoi usare keydownanche tu :

$('#fieldID').on('keydown', function (e) {
  //console.log(e.which);
  if (e.which === 8) {
    //do something when pressing delete
    return true;
  } else {
    //do something else
    return false;
  }
});

-5

LAVORANDO:

$("#ContentPlaceHolder1_txtNombre").keyup(function () {
    var txt = $(this).val();
        $('.column').each(function () {
            $(this).show();
            if ($(this).text().toUpperCase().indexOf(txt.toUpperCase()) == -1) {
                $(this).hide();
            }
        });
    //}
});

Sembra un codice per una domanda diversa ... di che cosa si tratta riguardo la creazione di valori maiuscoli e la visualizzazione / occultamento dei contenuti?
Nico Haase,
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.