L'evento di modifica JavaScript sull'elemento di input si attiva solo quando si perde il focus


84

Ho un elemento di input e voglio continuare a controllare la lunghezza dei contenuti e ogni volta che la lunghezza diventa uguale a una dimensione particolare, voglio abilitare il pulsante di invio, ma sto affrontando un problema con l'evento onchange di Javascript come evento si attiva solo quando l'elemento di input esce dall'ambito e non quando il contenuto cambia.

<input type="text" id="name" onchange="checkLength(this.value)" />

---- onchange non si attiva quando si cambiano i contenuti di name, ma si attiva solo quando il nome diventa sfocato.

C'è qualcosa che posso fare per far funzionare questo evento sulla modifica dei contenuti? o qualche altro evento che posso usare per questo? Ho trovato una soluzione alternativa utilizzando la funzione onkeyup, ma questa non si attiva quando selezioniamo alcuni contenuti dal completamento automatico del browser.

Voglio qualcosa che possa funzionare quando il contenuto del campo cambia sia con la tastiera che con il mouse ... qualche idea?


Potresti usare onkeyupe onchange?
James Allardice

1
L'unico problema che ho è che la selezione del completamento automatico del browser non causerebbe il verificarsi di nessuno di questi eventi.
Sachin Midha

Che tipo di campo di input è questo?
powtac

oh ... ho dimenticato di aggiungerlo al codice di esempio, è un campo di testo.
Sachin Midha

1
Pensavo che questo sarebbe stato un problema molto comune e molte persone lo avrebbero affrontato, ma ora sembra il contrario ... :)
Sachin Midha

Risposte:


120
(function () {
    var oldVal;

    $('#name').on('change textInput input', function () {
        var val = this.value;
        if (val !== oldVal) {
            oldVal = val;
            checkLength(val);
        }
    });
}());

Questo prenderà change, battiture, paste, textInput, input(quando disponibile). E non sparare più del necessario.

http://jsfiddle.net/katspaugh/xqeDj/


Riferimenti:

textInput- un tipo di evento W3C DOM Livello 3. http://www.w3.org/TR/DOM-Level-3-Events/#events-textevents

Un programma utente deve inviare questo evento quando sono stati inseriti uno o più caratteri. Questi caratteri possono provenire da una varietà di fonti, ad esempio caratteri risultanti dalla pressione o dal rilascio di un tasto su un dispositivo a tastiera, dall'elaborazione di un editor del metodo di input o dal risultato di un comando vocale. Laddove un'operazione di "incolla" genera una semplice sequenza di caratteri, cioè un passaggio di testo senza alcuna struttura o informazione di stile, dovrebbe essere generato anche questo tipo di evento.

input- un tipo di evento HTML5 .

Sparato ai controlli quando l'utente modifica il valore

Firefox, Chrome, IE9 e altri browser moderni lo supportano.

Questo evento si verifica immediatamente dopo la modifica, a differenza dell'evento onchange, che si verifica quando l'elemento perde il focus.


1
non funziona ... hai controllato il tuo codice alla fine ?? stava lavorando alla selezione da un autocompletatore ...?
Sachin Midha

Ho controllato textInputin Chrome 15 e funziona. Ho controllato l' inputevento in IE9 e funziona anche. Firefox dovrebbe supportare DOMAttrModified, ma non l'ho installato. Questi due eventi sono i migliori che puoi sperare, poiché si attivano con qualsiasi tipo di input di testo.
katspaugh

1
Soluzione fantastica ... l'input ha funzionato per me come una benedizione ... non è necessario nient'altro tranne l'input, che funziona abbastanza. funziona su ff4, ma non su 3.x, e avevo 3.6 sul mio desktop e non ha mai funzionato ...
Sachin Midha

5
Per mantenere le cose aggiornate, attualmente questa soluzione è stata attivata più volte su una singola modifica di input in FF22, non è necessario utilizzare eventi di pressione dei tasti o di input di testo, input e cambio di proprietà dovrebbero essere sufficienti
cyber-guard

1
Ho trovato che change, keyupe inputè stata la combinazione migliore per coprire IE9 e Firefox (36.0.4). L' keypressevento non sembrava funzionare in IE9 perché non catturava cose come Elimina e Backspace, e l' inputevento copre l'incollaggio con la tastiera e con il menu contestuale.
TLS

9

Come estensione alla risposta di katspaugh, ecco un modo per farlo per più elementi usando una classe CSS.

   $('.myclass').each(function(){
        $(this).attr('oldval',$(this).val());
   });

   $('.myclass').on('change keypress paste focus textInput input',function(){
       var val = $(this).val();
       if(val != $(this).attr('oldval') ){
           $(this).attr('oldval',val); 
           checkLength($(this).val());
        }
    });

4

Mi ci sono voluti 30 minuti per trovarlo, ma funziona a giugno 2019.

<input type="text" id="myInput" oninput="myFunction()">

e se vuoi aggiungere un listener di eventi a livello di programmazione in js

inputElement.addEventListener("input", event => {})

3

Fallo nel modo jQuery:

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


$('#name').keyup(function() {
  alert('Content length has changed to: '+$(this).val().length);
});

1
Questo verrà anche attivato solo quando il campo perde la focalizzazione.
Felix Kling

@Felix Kling, vero, l'ha cambiato in keyup ();)
powtac

ancora lo stesso problema con keyup ... l'ho usato e ho avuto un problema con quello. leggi la mia domanda completa.
Sachin Midha

0

Puoi usare onkeyup

<input id="name" onkeyup="checkLength(this.value)" />

Ho usato onkeyup ... ma il mio problema è quando l'utente seleziona dall'autocompletatore del browser, quindi questo evento non viene attivato ... L'ho già scritto nella mia domanda nella soluzione alternativa che ho usato ...
Sachin Midha

0

Dovresti usare una combinazione di onkeyupe onclick(o onmouseup) se vuoi cogliere ogni possibilità.

<input id="name" onkeyup="checkLength(this.value)" onmouseup="checkLength(this.value)" />

bel tentativo, ma il problema qui è che non sto premendo il mouse sull'elemento di input ma sul completamento automatico, che non attiverà questo evento ...
Sachin Midha

L'unica altra cosa a cui riesco a pensare, ed è sgradevole, è setTimeoutcontrollare periodicamente il valore del campo ... Che cosa vuoi fare esattamente?
DaveRandom

È molto brutto ...: D è qualcosa di simile a ciò che fa un indicatore di sicurezza della password, ti dice la forza della password mentre continui a inserirla. Voglio abilitare un pulsante solo quando la stringa inserita è di lunghezza 10 altrimenti tenerlo disabilitato. Spero che tu abbia capito ...
Sachin Midha

0

Ecco un'altra soluzione che sviluppo per lo stesso problema. Tuttavia utilizzo molte caselle di input, quindi mantengo il vecchio valore come attributo definito dall'utente degli elementi stessi: "valore-dati". Utilizzando jQuery è così facile da gestire.

        $(document).delegate('.filterBox', 'keyup', { self: this }, function (e) {
            var self = e.data.self;

            if (e.keyCode == 13) {
                e.preventDefault();
                $(this).attr('data-value', $(this).val());
                self.filterBy(this, true)
            }
            else if (e.keyCode == 27) {
                $(this).val('');
                $(this).attr('data-value', '');
                self.filterBy(this, true)
            }
            else {
                if ($(this).attr('data-value') != $(this).val()) {
                    $(this).attr('data-value', $(this).val());
                    self.filterBy(this);
                }
            }
        });

ecco, ho usato 5-6 caselle di input con classe 'filterBox', faccio eseguire il metodo filterBy solo se data-value è diverso dal proprio valore.

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.