2010-06-17 3 views
6

Ich habe ein einfaches Problem, für das ich keine Lösung finden kann.jQuery: Mit welchem ​​Listener überprüfe ich, ob der Browser das Passwort-Eingabefeld automatisch ausfüllt?

Grundsätzlich auf dieser Website hier: http://dev.supply.net.nz/vendorapp/ (derzeit in Entwicklung) Ich habe einige Phantasie label Animationen Dinge in und aus auf focus & blur schieben.

Doch sobald der Benutzer einmal den Browser angemeldet wird höchstwahrscheinlich das Passwort mit dem Benutzer E-Mail-Adresse/Login zugeordnet erinnern. (Welche ist gut und sollte nicht deaktiviert werden.)

Jedoch habe ich in Probleme laufen auslösenden meine label aufschiebbare Animation, wenn der Browser setzt den Wert auf dem #password Feld automatisch als Ereignis für diese weder focus noch blur.

Kennt jemand die Zuhörer meine Funktion nutzen laufen, wenn der Browser das Kennwort der Benutzer ‚auto füllt‘?

Hier ist ein kurzer Screenshot der Ausgabe:

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

+0

So wie eine Frage des persönlichen Geschmacks, Ich mag nicht wirklich Websites, die in den Bereichen mit etwas abgeblendet „Passwort eingeben“ oder dergleichen zu füllen. Es hat Schwierigkeiten mit der automatischen Vervollständigung des Browsers, wie du es erwähnt hast, aber auch mit externen Programmen (wie KeePass, die ich oft benutze). Bei meinem letzten Job haben wir eine Art Usability-Studie für Dinge dieser Art gemacht, nur für interne Apps, und normalerweise kümmert es die Leute nicht, und manchmal (wie in meinem Fall) mögen sie es nicht. Ich würde etwas von dieser Art vorschlagen, bevor ich die Seite mit Ereignissen und Handlern abstürze. –

Antwort

5

Vor kurzem las ich einen Artikel namens abfeuern müssen Capturing AutoFill as a Change Event das kann genau das sein, wonach Sie suchen. Der Autor hat eine Funktion mit dem Namen listenForChange() erstellt, die ein Feld für die Autofilling-Aktivität des Formulars überwacht (wird sogar ein Wort automatisch ausgefüllt?). Da es Ihr Formular wirklich regelmäßig überprüft, empfehle ich Ihnen persönlich, dies nur eine bestimmte Anzahl von Malen durchzuführen. Schließlich wird eine Formular-Auto-Füllung in der Regel funktionieren, sobald die Seite fertig geladen ist.

Zitiert der Original-Artikel:

Das Plugin Verwendung des Auslösers() und Daten() Funktionen macht. Kurz gesagt, wir Schleife über das Eingabeelement oder setzen der Kinder Eingabeelemente, Speichern ihren Anfangswert in den Datencache von der Funktion data() zur Verfügung gestellt. Wir dann überprüfen, ob der gespeicherte Wert den Wert der Eingabe während der aktuellen Iteration entspricht. Wenn ja, tun wir nichts, wenn nicht, wir manuell auslösen das Änderungsereignis über Trigger(). Es gibt auch ein bisschen Logik darin, das Element zu ignorieren, das Fokus hat. Wir müssen nicht kümmern uns um dieses Element, da, wenn der Wert geändert wird, während der Benutzer Fokus hat, wird das Änderungsereignis als normal ausgelöst werden, wenn das Element verschwommen ist.

Und hier ist die Funktion selbst einhüllen Sie nicht wollen, um den Artikel zu gehen und lesen (was Sie sollten):

(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); 

Alle Kredit geht an den Besitzer von FurryBrains.com für das Schreiben Artikel.

+0

Das ist großartig. Genau das, was ich brauchte. Vielen Dank. Bearbeiten: Lesen Sie den Artikel. Gut gelesen, wertvolle Informationen – Jannis

+0

Auto-Füllung tritt nicht immer beim Laden auf. Zum Beispiel kann das Passwort automatisch ausgefüllt werden, wenn der Benutzer seinen Namen eingibt. – WilQu

+0

Das ist großartig, funktioniert perfekt. – AbdullahDiaa

-1

Sie werden manuell das Ereignis in Ihrem .ready()

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

Was ist, wenn der Anfangswert keine leere Zeichenfolge ist? –

+0

Der Wert ist leer in bereit(), zumindest in Chrome. –

+0

@PeteMontgomery nicht jedes Mal. Wenn Sie mehrere Konten haben, können Sie mehrere Male mit unterschiedlichen Werten automatisch ausfüllen. Der Fall Benutzername/Passwort ist auch ein interessanter Fall. –

0

Auch sollten Sie wahrscheinlich auch einen Zuhörer auf Änderung setzen:

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

Ziemlich sicher '.change' erfordert Benutzerinteraktion Fokus auf dieses bestimmte Element. Es überwacht nicht ständig den Wert. –

Verwandte Themen