Il modo migliore per tracciare onchange mentre digiti in input type = "text"?


449

Nella mia esperienza, l' input type="text" onchangeevento di solito si verifica solo dopo aver lasciato ( blur) il controllo.

C'è un modo per forzare l'attivazione del browser onchangeogni volta che textfieldcambiano i contenuti? In caso contrario, qual è il modo più elegante per tracciare questo "manualmente"?

L'uso degli onkey*eventi non è affidabile, poiché è possibile fare clic con il pulsante destro del mouse sul campo e scegliere Incolla e questo cambierà il campo senza alcun input da tastiera.

È setTimeoutl'unico modo? .. Brutto :-)


@C'è qualche possibilità che tu possa aggiornare la tua risposta accettata in modo che quella non aggiornata non sia bloccata in alto?
Flimm,

Risposte:


271

Aggiornare:

Vedi un'altra risposta (2015).


Risposta originale 2009:

Quindi, vuoi che l' onchangeevento si attivi su keydown, sfocatura e incolla? Questa è magia.

Se si desidera tenere traccia delle modifiche durante la digitazione, utilizzare "onkeydown". Se devi intercettare le operazioni di incolla con il mouse, usa "onpaste"( IE , FF3 ) e "oninput"( FF, Opera, Chrome, Safari 1 ).

1 rotto per <textarea>Safari. Usa textInputinvece


22
onkeypressdovrebbe essere usato al posto di onkeydown. onkeydownsi attiva quando si fa clic su una chiave. Se un utente tiene premuto un tasto, l'evento si attiva una sola volta per il primo personaggio. onkeypressviene generato ogni volta che un carattere viene aggiunto al campo di testo.
fent

61
Non è del tutto magico dare onchangefuoco a tutte quelle azioni. <input onchange="doSomething();" onkeypress="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();">farà abbastanza bene per la maggior parte.
aroth

1
Che ne dici di cancellare del testo nella casella di input usando il mouse? Non penso che funzionerà.
Jeevan,

47
Con jquery 1.8.3, assomiglia a:$().on('change keydown paste input', function() {})
Narfanator

4
@AriWais: SÌ, omg la maggior parte delle SO dovrebbe essere deprecata. Gente questa risposta ha 8 anni . Vorrei che ci fosse un pulsante "deprecato" per vecchie risposte come questa, e la comunità potrebbe scegliere quella migliore.
Crescent Fresh,

658

In questi giorni ascoltate oninput. Sembra onchangesenza la necessità di perdere la concentrazione sull'elemento. È HTML5.

È supportato da tutti (anche da dispositivi mobili), tranne IE8 e versioni precedenti. Per IE aggiungere onpropertychange. Lo uso così:

const source = document.getElementById('source');
const result = document.getElementById('result');

const inputHandler = function(e) {
  result.innerHTML = e.target.value;
}

source.addEventListener('input', inputHandler);
source.addEventListener('propertychange', inputHandler); // for IE8
// Firefox/Edge18-/IE9+ don’t fire on <select><option>
// source.addEventListener('change', inputHandler); 
<input id="source">
<div id="result"></div>


63
In un mondo in continua evoluzione come lo standard Web, a volte la risposta accettata potrebbe essere cambiata dopo alcuni anni ... Questa è la nuova risposta accettata per me.
Erick Petrucelli,

1
Il supporto oninputanche in IE9 è parziale ( caniuse.com/#feat=input-event ).
Kenston Choi,

Potrebbe valerne la pena usarlo innerTextal posto di innerHTMLcosì non venga eseguito il markup
Jeevan Takhar,

47

Di seguito il codice funziona bene per me con Jquery 1.8.3

HTML: <input type="text" id="myId" />

JavaScript / JQuery:

$("#myId").on('change keydown paste input', function(){
      doSomething();
});

11
La libreria jQuery non è taggata nella domanda.
John Weisz,

21
Jquery è un'API Javascript, e sono stato portato qui da una ricerca con la parola chiave Jquery, non credo che valga la pena creare una nuova domanda per ogni qavtion javascript per la risposta di Jquery ...
GaelDev

12
Se alle persone non fosse permesso di suggerire l'uso delle biblioteche nelle risposte, ci sarebbero MOLTE domande più senza risposta su SO
dietbacon,

3
Spara più volte. Probabilmente a causa di modifiche e keydown. L'input probabile è necessario solo qui.
mmm,

1
non è necessario keydownperché duplicherà il valore dell'input, rimuoverlo.
Youssef Al Subaihi,

43

Javascript è imprevedibile e divertente qui.

  • onchange si verifica solo quando si sfoca la casella di testo
  • onkeyupe onkeypressnon si verifica sempre al cambio di testo
  • onkeydown si verifica sulla modifica del testo (ma non è possibile tenere traccia di taglia e incolla con il clic del mouse)
  • onpastee si oncutverifica con la pressione dei tasti e anche con il tasto destro del mouse.

Così, per tenere traccia il cambiamento di testo, abbiamo bisogno onkeydown, oncute onpaste. Nel callback di questi eventi, se si controlla il valore della casella di testo, non si ottiene il valore aggiornato poiché il valore viene modificato dopo il callback. Quindi una soluzione per questo è impostare una funzione di timeout con un timeout di 50 mili-secondi (o potrebbe essere inferiore) per tenere traccia della modifica.

Questo è un trucco sporco ma questo è l'unico modo, come ho studiato.

Ecco un esempio http://jsfiddle.net/2BfGC/12/


4
oninpute textInputsono gli eventi che rappresentano la vera soluzione per questo, ma non sono supportati da tutti i browser.
Sanket Sahu,

Per il secondo punto, presumo che intendessi onkeyupe onkeydownche sono simili. Entrambi possono catturare i tasti Ctrl, Alt, Maiusc e Meta. Per il terzo punto, presumo che intendevi onkeypress.
Daniel Stevens,

12

onkeyupaccade dopo aver digitato, ad esempio, premo tquando sollevo il dito, l'azione si verifica ma keydownsull'azione si verifica prima di digitare il personaggiot

Spero che questo sia utile per qualcuno.

Quindi onkeyupè meglio per quando vuoi inviare ciò che hai appena digitato ora.


8

Avevo un requisito simile (campo di testo in stile twitter). Usato onkeyupe onchange. onchangein realtà si occupa delle operazioni di incolla del mouse durante la messa a fuoco persa dal campo.

[Aggiorna] In HTML5 o versioni successive, utilizza oninputper ottenere aggiornamenti in tempo reale sulla modifica dei caratteri, come spiegato nelle altre risposte sopra.


Oninput è utile se si desidera rilevare quando il contenuto di un'area di testo, input: testo, input: password o input: elemento di ricerca è cambiato, perché l'evento onchange su questi elementi si attiva quando l'elemento perde lo stato attivo, non immediatamente dopo la modifica .
hkasera,

@hkasera Sì, con HTML5 oninputè la strada da percorrere. Ma, quando ho implementato, HTML5 non esisteva e avevamo IE 8 :(. Apprezzo il tuo aggiornamento in quanto fornisce informazioni aggiornate per gli utenti.
Mohnish


7

Se si utilizza SOLO Internet Explorer, è possibile utilizzare questo:

<input type="text" id="myID" onpropertychange="TextChange(this)" />

<script type="text/javascript">
    function TextChange(tBox) {
        if(event.propertyName=='value') {
            //your code here
        }
    }
</script>

Spero che aiuti.


8
Potrebbe essere per un progetto interno, suppongo ... :)
eselk,

94
Grazie a Dio non vivo in quella casa! : D
Marco Matarazzi,

13
10 anni fa non ci sarebbe nulla di divertente in questa frase .. :(
Michał Tabor

4
per me questo aiuta, sto sviluppando un progetto per alcuni dispositivi mobili con un sistema operativo incorporato in cui IE è l'unico browser.
Anders M.,

3
Se si utilizza SOLO Internet Explorer - LOL. Ha reso la mia giornata nel 2016!
Jack Black,

4

c'è una soluzione abbastanza vicina (non aggiustare tutti i modi Incolla) ma la maggior parte di essi:

Funziona per input e per textareas:

<input type="text" ... >
<textarea ... >...</textarea>

Fai così:

<input type="text" ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >
<textarea ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >...</textarea>

Come ho detto, non tutti i modi per incollare un evento su tutti i browser ... peggio alcuni non attivano alcun evento, ma i timer sono orribili da usare per questo.

Ma la maggior parte dei modi Incolla viene eseguita con tastiera e / o mouse, quindi normalmente un onkeyup o onmouseup vengono attivati ​​dopo un incolla, anche onkeyup viene attivato quando si digita sulla tastiera.

Assicurati che il tuo codice di controllo non richieda molto tempo ... altrimenti l'utente avrà un'impressione scadente.

Sì, il trucco è sparare con il tasto e con il mouse ... ma attenzione, entrambi possono essere attivati, quindi ricordati di questo !!!


4

Per favore, giudica il prossimo approccio usando JQuery:

HTML:

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

Javascript (JQuery):

$("#inputId").keyup(function(){
        $("#inputId").blur();
        $("#inputId").focus();
});

$("#inputId").change(function(){
        //do whatever you need to do on actual change of the value of the input field
});

Uso allo stesso modo
:)

Mi rendo conto che questa non è la risposta più recente, ma offuscare e ri-focalizzare l'input su ogni keyup rovinerebbe il posizionamento del cursore se fosse da qualche parte tranne la fine dell'input?
Michael Martin-Smucker,

@ MichaelMartin-Smucker Lo penseresti, ma apparentemente no: jsfiddle.net/gsss8c6L
Clonkex

4

"input" ha funzionato per me.

var searchBar  = document.getElementById("searchBar");
searchBar.addEventListener("input", PredictSearch, false);

3

È possibile utilizzare i keydown, keyuped keypresseventi come bene.


3

Per tracciare ciascuno, prova questo esempio e prima di tutto riduci completamente il tasso di lampeggiamento del cursore a zero.

<body>
//try onkeydown,onkeyup,onkeypress
<input type="text" onkeypress="myFunction(this.value)">
<span> </span>
<script>
function myFunction(val) {
//alert(val);
var mySpan = document.getElementsByTagName("span")[0].innerHTML;
mySpan += val+"<br>";
document.getElementsByTagName("span")[0].innerHTML = mySpan;
}
</script>

</body>

onblur: l'evento viene generato all'uscita

onchange: l'evento genera all'uscita se vengono apportate modifiche in inputtext

onkeydown: l'evento si genera alla pressione di qualsiasi tasto (anche per tenere premuto il tasto per molto tempo)

onkeyup: l'evento viene generato su qualsiasi rilascio chiave

onkeypress: uguale a onkeydown (o onkeyup) ma non reagisce per ctrl, backsace, alt altro


1

2018 qui, questo è quello che faccio:

$(inputs).on('change keydown paste input propertychange click keyup blur',handler);

Se potessi evidenziare difetti in questo approccio, te ne sarei grato.


2
2019 qui, e questo si attiverà più volte per ogni pressione del tasto. Per un esempio, vedere qui: jsfiddle.net/sp00n82/3r4691tq/5
sp00n

1

Metodo 1: aggiungere un listener di eventi per input:

element.addEventListener("input", myFunction);

 

Metodo 2: definire la oninputproprietà con JavaScript:

element.oninput = function()
{
    myFunction();
};

 

Metodo 3: definire la oninputproprietà con HTML:

<input type="text" oninput="myFunction();">

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.