2011-08-18 11 views
61

Ho un elemento di input e voglio continuare a controllare la lunghezza del contenuto e ogni volta che la lunghezza diventa uguale a una determinata dimensione, voglio abilitare il pulsante di invio, ma Sto affrontando un problema con l'evento onchange di javascript poiché l'evento si attiva solo quando l'elemento di input esce dall'ambito e non quando i contenuti cambiano.evento javascript change sull'elemento input si attiva solo in caso di perdita di messa a fuoco

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

---- onchange non si attiva su come cambiare i contenuti del nome, ma solo quando i fuochi nome va fuori fuoco.

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

Voglio qualcosa che può funzionare quando il contenuto del campo cambia sia tramite tastiera o con il mouse ... qualche idea?

+0

È possibile utilizzare "onkeyup" e "onchange"? –

+1

L'unico problema che ho è che la selezione di autocompleter del browser non avrebbe causato nessuno di questi eventi. –

+0

Che tipo di campo di input è questo? – powtac

risposta

94
(function() { 
    var oldVal; 

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

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

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


Riferimenti:

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

Un agente 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 da un tasto premuto o rilasciato su un dispositivo tastiera, dall'elaborazione di un metodo di immissione o derivante da un comando vocale. Quando un'operazione "incolla" genera una semplice sequenza di caratteri, ad esempio un passaggio di testo senza alcuna informazione di struttura o di stile, questo tipo di evento dovrebbe essere anche generato.

input - un tipo di evento HTML5.

sparato a controlli quando l'utente cambia il valore

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

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

+1

non funziona ... hai controllato il tuo codice alla fine ?? stava lavorando sulla selezione da un autocompleter ...? –

+0

Ho controllato 'textInput' in Chrome 15 e funziona. Ho controllato l'evento 'input' in IE9 e funziona anche. Firefox dovrebbe supportare 'DOMAttrModified', ma non ce l'ho installato. Questi due eventi sono i migliori che puoi sperare, dal momento che sparano su qualsiasi tipo di input di testo. – katspaugh

+0

L'input 'controllato' in Firefox 4 - funziona. – katspaugh

2

Do it the jQuery way:

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


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

Questo sarà anche essere licenziato solo quando il campo perde focacce. –

+0

@Felix Kling, true, modificato in keyup();) – powtac

+0

di nuovo lo stesso problema con la chiave di accesso ... L'ho usato e ho avuto un problema con quello. leggi la mia domanda completa. –

0

È possibile utilizzare onkeyup

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

Ho usato onkeyup ... ma il mio problema è quando l'utente seleziona dal programma di autocompleto del browser, quindi questo evento non viene attivato ... Ho già scritto questo nella mia domanda nella soluzione che ho usato ... –

0

Si dovrà utilizzare una combinazione di onkeyup e onclick (o onmouseup) se si desidera catturare ogni possibilità.

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

nice prova, ma il problema qui è che non sto premendo il mouse sull'elemento di input ma sul completamento automatico, che non attiverà questo evento ... –

+0

L'unica altra cosa a cui riesco a pensare, ed è brutto, è per 'setTimeout' e controllare periodicamente il valore del campo ... Che cosa esattamente vuoi fare? – DaveRandom

+0

Questo è molto brutto ...: D è qualcosa di simile a quello che fa un indicatore di forza 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 tenerla disattivata. Spero tu abbia capito ... –

0

Ecco un'altra soluzione che sviluppo per lo stesso problema. Tuttavia uso molte caselle di input, quindi mantengo il vecchio valore come un attributo definito dall'utente degli elementi stessi: "valore-dati". Usare 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); 
       } 
      } 
     }); 

è qui, ho utilizzato 5-6 caselle di input hanno classe 'Filterbox', faccio metodo filterBy periodo solo se i dati valore è diverso da un suo valore.

7

Come estensione alla risposta di katspaugh, ecco un modo per farlo per più elementi utilizzando 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()); 
     } 
    }); 
Problemi correlati