html <input type = "text" /> evento onchange non funzionante


88

Sto provando a fare qualche esperimento. Quello che voglio che accada è che ogni volta che l'utente digita qualcosa nella casella di testo, verrà visualizzato in una finestra di dialogo. Ho usato la onchangeproprietà dell'evento per realizzarlo ma non funziona. Devo ancora premere il pulsante di invio per farlo funzionare. Ho letto di AJAX e sto pensando di apprenderlo. Ho ancora bisogno di AJAX per farlo funzionare o è sufficiente JavaScript semplice? Per favore aiuto.

index.php

<script type="text/javascript" src="javascript.js"> </script>

<form action="index.php" method="get">
 Integer 1: <input type="text" id="num1" name="num1" onchange="checkInput('num1');" /> <br />
 Integer 2: <input type="text" id="num2" name="num2" onchange="checkInput('num2');" /> <br />
 <input type="submit" value="Compute" />
</form>

javascript.js

function checkInput(textbox) {
 var textInput = document.getElementById(textbox).value;

 alert(textInput); 
}

4
puoi inviare "questo" invece dell'ID, quindi non devi chiamare getElementById
remi bourgarel

Sì ... grazie per aver fatto quello che mi ha detto Ash Burlaczenko ...
Newbie Coder

Con JQuery, bella soluzione proposta qui: stackoverflow.com/a/8167009/2065594
Cyril Jacquart

Risposte:


127

onchangeviene attivato solo quando il controllo è sfocato. Prova onkeypressinvece.


19
Non funziona per rilevare modifiche dopo che l'utente ha incollato dagli appunti
Juozas Kontvainis

19
Questo ha appena risolto il mio problema. Preferisco onkeyupperò, perché ottiene il nuovo valore in input('element.value')
stealthjong

4
Ho anche notato che "keypress" non viene sollevato dopo aver premuto backspace, almeno quando si usa jquery. "keyup" viene sollevato dopo aver premuto e rilasciato backspace. "input" risolve questo problema e funziona anche per copia-incolla, e penso che questa sia la soluzione corretta qui (come l'utente "99 Problemi - Sintassi non è uno" sottolinea di seguito).
Patrick Finnigan

4
'onkeypres', 'onkeyup', ecc. non è una soluzione quando si vuole chiamare una funzione solo se il testo è cambiato ! Gli eventi chiave producono un traffico non necessario in questo caso. (È molto strano che questa risposta sia stata scelta come soluzione, specialmente con così pochi voti !! Non la desidero negativamente, perché non mi piace semplicemente sottovalutare le risposte. Preferisco fornire le ragioni per cui è non OK - È più utile!)
Apostolos

Per HTML ≥5 o jQuery ≥1.7 ci sono altre soluzioni di seguito, che gestiscono anche l'incollaggio dagli appunti.
user202729

41

Da usare .on('input'...per monitorare ogni modifica a un input (incolla, keyup, ecc.) Da jQuery 1.7 e versioni successive.

Per ingressi statici e dinamici:

$(document).on('input', '.my-class', function(){
    alert('Input changed');
});

Solo per ingressi statici:

$('.my-class').on('input', function(){
    alert('Input changed');
});

JSFiddle con esempio statico / dinamico: https://jsfiddle.net/op0zqrgy/7/


Questo ha funzionato perfettamente per me - grazie. Nota per gli altri: non dimenticare di eseguire effettivamente il codice sopra nel tuo onLoad o qualcosa del genere per "iniziare" il monitoraggio.
Robert Penridge

Troppo tardi per un commento ma ... Perché suggerisci di usare jQuery se l'utente che risponde mostra JavaScript normale?
Andrés Morales

@ AndrésMorales È una libreria comune a cui molte applicazioni hanno accesso immediato ed è semplice da aggiungere a quelle che non lo fanno. Ovviamente, questa risposta non si applica a quelle applicazioni che non possono (o scelgono di non utilizzare) jQuery.
rybo111

@ rybo111 Esatto! jQuery è una libreria comune e ampiamente utilizzata, ma si collega direttamente nel mio cervello alla domanda meme su "somma due numeri usando JavaScript" e la risposta più votata sull'uso di jQuery per farlo. Non è il caso, ma molte persone non possono separare JavaScript e jQuery.
Andrés Morales

@ AndrésMorales Nota la mia risposta copre "incolla, keyup, ecc.". Ricordo che la soluzione jQuery era conveniente quando ho risposto a questa domanda (7 anni fa!).
rybo111

30

Il controllo delle sequenze di tasti è solo una soluzione parziale, poiché è possibile modificare il contenuto di un campo di input utilizzando i clic del mouse. Se fai clic con il pulsante destro del mouse in un campo di testo, avrai a disposizione opzioni taglia e incolla che puoi utilizzare per modificare il valore senza premere alcun tasto. Allo stesso modo, se il completamento automatico è abilitato, puoi fare clic con il pulsante sinistro del mouse in un campo e ottenere un menu a discesa del testo inserito in precedenza, e puoi selezionare tra le tue scelte usando un clic del mouse. Il trapping delle sequenze di tasti non rileverà nessuno di questi tipi di modifiche.

Purtroppo, non esiste alcun evento "onchange" che segnala i cambiamenti immediatamente, almeno per quanto ne so. Ma c'è una soluzione che funziona per tutti i casi: imposta un evento di temporizzazione usando setInterval ().

Supponiamo che il tuo campo di immissione abbia un ID e un nome di "città":

<input type="text" name="city" id="city" />

Avere una variabile globale denominata "città":

var city = "";

Aggiungi questo alla tua inizializzazione della pagina:

setInterval(lookForCityChange, 100);

Quindi definire una funzione lookForCityChange ():

function lookForCityChange()
{
    var newCity = document.getElementById("city").value;
    if (newCity != city) {
        city = newCity;
        doSomething(city);     // do whatever you need to do
    }
}

In questo esempio, il valore di "città" viene verificato ogni 100 millisecondi, che puoi regolare in base alle tue esigenze. Se vuoi, usa una funzione anonima invece di definire lookForCityChange (). Tieni presente che il tuo codice o anche il browser potrebbe fornire un valore iniziale per il campo di input, quindi potresti essere avvisato di una "modifica" prima che l'utente faccia qualsiasi cosa; modificare il codice secondo necessità.

Se l'idea di un evento di temporizzazione che si attiva ogni decimo di secondo sembra sgraziata, puoi avviare il timer quando il campo di input riceve il focus e terminarlo (con clearInterval ()) su una sfocatura. Non credo sia possibile modificare il valore di un campo di input senza che riceva il focus, quindi accendere e spegnere il timer in questo modo dovrebbe essere sicuro.


1
Se non è possibile modificare il valore di un campo di input senza che sia attivato e si verifica una sfocatura quando un elemento perde il fuoco, perché non cercare semplicemente le modifiche in onblur?
Pakman

Vuoi intervenire quando il campo di input cambia o quando perde il focus dopo una modifica? Se vuoi agire immediatamente, non puoi aspettare l'onblur.
Dragonfly

@ Pakman Questa è una soluzione decente in alcuni casi. Ma se vuoi fare la ricerca durante la digitazione - una caratteristica molto bella IMO (perché l'utente dovrebbe cercare cose quando il computer può farlo molto più velocemente e senza annoiarsi?) - o qualsiasi altra cosa davvero quella deve accadere quando il testo cambia, perché non dovresti essere in grado di farlo?
Il giorno

Così triste che si arrivi a questo.
Chuck Batson

1
@ChuckBatson Questa risposta è del 2012. Ho notato che hai pubblicato il tuo commento nel 2016. Vedi la mia risposta se stai usando jQuery, è incredibilmente facile ora.
rybo111

26

HTML5 definisce un oninputevento per catturare tutte le modifiche dirette. per me funziona.


1
funziona anche con il controllo di selezione type = "number" (con cui onkeypress non funziona).
Bob il

13

onchange si verifica solo quando la modifica all'elemento di input viene confermata dall'utente, il più delle volte questo è quando l'elemento perde il focus.

se vuoi che la tua funzione si attivi ogni volta che il valore dell'elemento cambia dovresti usare l' oninputevento - questo è meglio degli eventi chiave su / giù poiché il valore può essere modificato con il mouse dell'utente, ad esempio incollato o compilato automaticamente ecc.

Maggiori informazioni sull'evento di modifica qui

Maggiori informazioni sull'evento di input qui


11

usa i seguenti eventi invece di "onchange"

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)

6

In primo luogo, cosa "non funziona"? Non vedi l'avviso?

Inoltre, il tuo codice potrebbe essere semplificato in questo modo

<input type="text" id="num1" name="num1" onkeydown="checkInput(this);" /> <br />

function checkInput(obj) {
    alert(obj.value); 
}

2

Ho riscontrato problemi in cui Safari non attivava eventi "onchange" su un campo di immissione di testo. Ho usato un evento "change" di jQuery 1.7.2 e non ha funzionato neanche. Ho finito per usare l'evento textchange di ZURB. Funziona con mouseevents e può attivarsi senza lasciare il campo:
http://www.zurb.com/playground/jquery-text-change-custom-event

$('.inputClassToBind').bind('textchange', function (event, previousText) {
    alert($(this).attr('id'));
});

2

Un paio di commenti che IMO sono importanti:

  • gli elementi di input non emettono l'evento di "modifica" finché l'azione dell'UTENTE INVIO o la sfocatura non attendono È il comportamento corretto .

  • L'evento che desideri utilizzare è "input"(" oninput "). Qui è ben dimostrata la differenza tra i due: https://javascript.info/events-change-input

  • I due eventi segnalano due diversi gesti / momenti dell'utente (l'evento "input" significa che l'utente sta scrivendo o navigando nelle opzioni di un elenco di selezione, ma ancora non ha confermato la modifica. "Change" significa che l'utente ha cambiato il valore (con un invio o una sfocatura nostro)

  • Ascoltare eventi chiave come molti qui consigliati è una cattiva pratica in questo caso. (come le persone che modificano il comportamento predefinito di ENTER sugli input) ...

  • jQuery non ha nulla a che fare con questo. Questo è tutto in standard HTML.

  • Se hai problemi a capire PERCHÉ questo è il comportamento corretto, forse è utile, come esperimento, usa il tuo editor di testo o browser senza un mouse / pad, solo una tastiera.

I miei due centesimi.


1

onkeyup ha funzionato per me. onkeypress non si attiva quando si preme lo spazio indietro.


cosa succede quando viene incollato un valore? Uso "onpaste" anche per attivare l'evento
Louis

1

È meglio usare onchange(event)con <select>. Con <input>puoi utilizzare l'evento seguente:

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)

-3

provare onpropertychange. funziona solo per IE.


6
Perché qualcuno dovrebbe voler considerare una proprietà che funziona solo in un BROWSER OBSOLETO che è stato abbandonato dal suo sviluppatore? Downvote.
Sod Almighty
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.