2010-06-17 8 views
6

Ho un semplice problema a cui non riesco a trovare una soluzione.jQuery: quale ascoltatore posso utilizzare per verificare che il browser compili automaticamente il campo di inserimento della password?

In sostanza su questo sito qui: http://dev.supply.net.nz/vendorapp/ (attualmente in fase di sviluppo) devo alcuni fantasia label animazioni scorrevoli le cose dentro e fuori il focus & blur.

Tuttavia, una volta che l'utente ha effettuato l'accesso una volta che il browser molto probabilmente ricorderà la password associata all'indirizzo e-mail/login dell'utente. (Che è buono e non deve essere disattivata.)

Tuttavia mi imbatto in questioni innescando il mio label diapositiva di animazione quando il browser imposta il valore sul campo #password automaticamente come l'evento per questo non è né focusblur.

Qualcuno sa quale ascoltatore utilizzare per eseguire la mia funzione quando il browser "riempie automaticamente" la password dell'utente?

ecco un breve screenshot del problema:

Password Autofill Label Issue http://dl.dropbox.com/u/376243/fill_issue.png

+0

Proprio come una questione di preferenze personali, mi piace davvero siti che riempiono i campi con un po ' "password Enter" in grigio o simili. Ha difficoltà con il completamento automatico del browser come hai detto tu, ma anche con programmi esterni (come KeePass che uso molto). Nel mio ultimo lavoro abbiamo fatto una specie di studio dell'usabilità per cose di questo tipo, solo per app interne, e di solito alla gente non interessa, e qualche volta (come nel mio caso) a loro non piace. Vorrei suggerire qualcosa di quella natura prima di impantanare la pagina con eventi e gestori. –

risposta

5

di recente ho letto un articolo intitolato Capturing AutoFill as a Change Event che potrebbe essere proprio quello che stai cercando. L'autore ha creato una funzione denominata listenForChange() che monitora un campo per l'attività di riempimento automatico dei moduli (la compilazione automatica include anche una parola?). Dal momento che controlla il tuo modulo molto spesso personalmente ti suggerisco di farlo funzionare solo un certo numero di volte. Dopotutto un modulo di auto-compilazione di solito fa il suo lavoro non appena la pagina ha terminato il caricamento.

Citando l'articolo originale:

Il plugin si avvale del trigger() ei dati funzioni(). In poche parole, eseguiamo il looping sull'elemento di input o impostiamo di elementi di input secondari, memorizzando il loro valore iniziale nella cache di dati fornita dalla funzione data(). Abbiamo quindi controllare se il valore memorizzato corrisponde al valore dell'ingresso durante l'iterazione corrente. In tal caso, eseguiamo il comando , in caso contrario, attiviamo manualmente l'evento di modifica tramite trigger(). C'è anche un po 'di logica in là per ignorare l'elemento che ha lo stato attivo. Non dobbiamo preoccuparci di questo elemento, poiché se il valore viene modificato mentre l'utente è attivo, l'evento di cambiamento verrà attivato normalmente quando l'elemento è sfocato.

Ed ecco la funzione stessa in caso non si vuole andare a leggere l'articolo (che si dovrebbe):

(function($) { 
    $.fn.listenForChange = function(options) { 
     settings = $.extend({ 
      interval: 200 // in microseconds 
     }, options); 

     var jquery_object = this; 
     var current_focus = null; 

     jquery_object.filter(":input").add(":input", jquery_object).focus(function() { 
      current_focus = this; 
     }).blur(function() { 
      current_focus = null; 
     }); 

     setInterval(function() { 
      // allow 
      jquery_object.filter(":input").add(":input", jquery_object).each(function() { 
       // set data cache on element to input value if not yet set 
       if ($(this).data('change_listener') == undefined) { 
        $(this).data('change_listener', $(this).val()); 
        return; 
       } 
       // return if the value matches the cache 
       if ($(this).data('change_listener') == $(this).val()) { 
        return; 
       } 
       // ignore if element is in focus (since change event will fire on blur) 
       if (this == current_focus) { 
        return; 
       } 
       // if we make it here, manually fire the change event and set the new value 
       $(this).trigger('change'); 
       $(this).data('change_listener', $(this).val()); 
      }); 
     }, settings.interval); 
     return this; 
    }; 
})(jQuery); 

Tutto il merito va al proprietario del FurryBrains.com per la scrittura del articolo.

+0

È fantastico. solo la cosa di cui avevo bisogno. Grazie. Modifica: leggi l'articolo. Buona lettura, informazioni preziose – Jannis

+0

Il riempimento automatico non si verifica sempre sul carico. Ad esempio, la password può essere compilata automaticamente quando l'utente inserisce il suo nome. – WilQu

+0

È fantastico, funziona perfettamente. – AbdullahDiaa

-1

Dovrete fuoco manualmente l'evento nella vostra .ready()

var $p = $('#password'); 
if($p.val() != '') { 
    $('#password').focus(); 
} 
+2

Cosa succede se il valore iniziale non è una stringa vuota? –

+0

Il valore è vuoto su ready(), almeno in Chrome. –

+0

@PeteMontgomery non sempre. Se disponi di più account, puoi compilare automaticamente più volte con valori diversi. Anche il caso username/password è un caso interessante. –

0

anche probabilmente si dovrebbe anche mettere un ascoltatore sul cambiamento:

$('#password').change(function() { 
    // DEAL WITH IT IF THERE IS CONTENT IN IT AND THE LABEL IS STILL THERE 
}); 
+0

Abbastanza sicuro che '.change' richiede l'interazione dell'utente concentrandosi su quell'elemento particolare. Non monitora costantemente il valore. –