2012-06-15 10 views
9

Mi piacerebbe eseguire una funzione su ogni modifica di un controllo casella di testo non appena l'utente sta digitando. l'evento .keyup() va bene per la maggior parte dei casi.evento jQuery dopo aver selezionato un elemento suggerito su una casella di testo?

Tuttavia, i browser (come Chrome o Firefox) possono suggerire voci di completamento automatico per i controlli della casella di testo (probabilmente perché sono noti @name o @id del controllo di input).

Purtroppo, non riesco a far scattare nessuno degli eventi riportati di seguito quando "facendo clic su una voce suggerita". (.keyup() si attiva quando selezionato con la tastiera)

$('input#email') 
    .click(function() { console.log('click'); }) 
    .keyup(function() { console.log('keyup'); }) 
    .keydown(function() { console.log('keydown'); }) 
    .change(function() { console.log('change'); }) 
    .focus(function() { console.log('focus'); }) 
    .blur(function() { console.log('blur'); }); 

Per quanto possibile, vorrei evitare di utilizzare un controllo periodico setInterval().

C'è un modo per rilevare questo evento "seleziona un suggerimento"?

risposta

8

legano propertychange evento:

$('input').bind('input propertychange', function() { 

    var input = this.value.trim(); 
    [...] 

}); 
+2

Ottimo! Grazie per questo (anche se sono un po 'lontano da questo progetto ora). Prendo atto che si attiva quando si fa clic su una voce suggerita (come richiesto) ma non quando si seleziona tramite tastiera. La registrazione del gestore di eventi anche con _keyup_ può essere utile per colmare questa lacuna. – Myobis

5

La risposta breve è no, non c'è nessun evento per rilevare una selezione di suggerimenti. Potresti provare a guardare gli osservatori di mutazione DOM, ma non sono sicuro se queste modifiche agli attributi di copertina cambino, e c'è comunque poco supporto per questa API fino ad ora.

Quindi se davvero hai bisogno di gestire questo caso, penso che setInterval sia la tua unica opzione.

Modifica: 3 anni dopo è possibile utilizzare propertychange con jQuery come nella nuova risposta accettata (che presumo utilizza gli osservatori di mutazione sotto il cofano).

+0

Le mie indagini sembrano convergere a questa conclusione .. Grazie per il vostro contributo. – Myobis

+0

Oltre a "setInterval", ritengo che un approccio più chiaro stia rilevando quando un campo/aree di testo ha il focus, copiando il suo valore corrente e confrontandolo con il suo valore dopo aver perso lo stato attivo. Uno svantaggio è che sai solo che è cambiato una volta che il campo perde lo stato attivo. Tuttavia, un modo semplice per ovviare a questo è implementare un listener 'change', oltre a quello che ho appena descritto. –

0

L'evento cambiamento sembra funziona bene, ma fa richiedono di click di distanza

2

soluzione alternativa di completamento automatico disable e gestire altri eventi come keyup, keydown ecc

<input type="text" name="foo" autocomplete="off" /> 
Problemi correlati