Was ist, wenn sich jemand für Ihre Web-App anmeldet und seine E-Mail-Adresse eingibt als [email protected]? Er bemerkt es nicht, erhält nie seine Bestätigungs-E-Mail, kann sich nie wieder anmelden, die Funktion „Passwort vergessen“ funktioniert nicht, und es gibt viel Frustration und gegenseitiges Beschuldigen.
Können wir da nicht helfen?
Ich hatte eine ganz einfache Idee, gängige E-Mail-Domains mit einem <datalist>-Vorschlags-Dropdown anzubieten. Im Grunde so

Solche Datalists können an jedes textbasierte Eingabefeld angehängt werden und bieten im Wesentlichen Vorschläge. Der Benutzer kann immer noch jeden beliebigen gültigen Wert eingeben. Es ist sozusagen eine Mischung aus <select> und <input>.
So funktioniert es.
Der Markup
Perfekt normales HTML, das funktioniert, egal ob
<label for="email">Email</label>
<input id="email" name="email" type="email" placeholder="[email protected]">
Einfügen des Datalist mit JavaScript
Datalist ist ein HTML-Element, aber wir können es nicht direkt in den Markup einfügen, da wir noch nicht wissen, was wir hineinschreiben sollen. Die Optionen, die wir dort einfügen, müssen den ersten Teil der E-Mail-Adresse enthalten. Das ist Territorium für JavaScript, also fügen wir den Datalist am besten nur hinzu, wenn JavaScript läuft.
jQuery, weil ich es mag.
// Create empty datalist and append to DOM
var datalist = $("<datalist />", {
id: 'email-options'
}).insertAfter("#email");
// Correlate to input
$("#email").attr("list", "email-options");
Die E-Mail-TLDs
Es gibt eine Handvoll sehr beliebter „Top-Level-Domains“ für E-Mails. Packen wir sie in ein Array
var domains = ["yahoo.com", "gmail.com", "google.com", "hotmail.com", "me.com", "aol.com", "mac.com", "live.com", "comcast.com", "googlemail.com", "msn.com", "hotmail.co.uk", "yahoo.co.uk", "facebook.com", "verizon.net", "att.net", "gmz.com", "mail.com"];
Nach Bedarf anpassen.
Auf Tastatureingaben achten
Wir wollen den Benutzer nicht stören, bis er die „@“-Taste gedrückt hat und wir wissen, dass er zum Domain-Teil seiner E-Mail-Adresse übergeht. Also beobachten wir zuerst das Tastaturereignis
$("#email").on("keyup", function() {
});
Dann prüfen wir, ob der Wert das @ enthält
$("#email").on("keyup", function() {
var value = $(this).val();
if (value.indexOf("@") != -1) {
// it's there, update datalist
}
});
Wir sollten uns besser organisieren
Je komplexer es wird, desto mehr sollten wir uns Sorgen über Spaghetti-Code und generell schwer wartbare Unübersichtlichkeit machen. Lassen Sie uns mit einem Objekt organisieren, um alles zusammenzuhalten.
Die Struktur wird im Grunde
var EmailDomainSuggester = {
domains: ["yahoo.com", "gmail.com", "google.com", "hotmail.com", "me.com", "aol.com", "mac.com", "live.com", "comcast.com", "googlemail.com", "msn.com", "hotmail.co.uk", "yahoo.co.uk", "facebook.com", "verizon.net", "att.net", "gmz.com", "mail.com"],
bindTo: $('#email'),
init: function() {
this.addElements();
this.bindEvents();
},
addElements: function() {
// Create empty datalist
this.datalist = $("<datalist />", {
id: 'email-options'
}).insertAfter(this.bindTo);
// Corelate to input
this.bindTo.attr("list", "email-options");
},
bindEvents: function() {
this.bindTo.on("keyup", this.testValue);
},
testValue: function(event) {
var el = $(this),
value = el.val();
// remove the != -1 if you want the datalist to show up immediately as you type the @
// with it in place, it won't show up until you type the NEXT character
if (value.indexOf("@") != -1) {
value = value.split("@")[0];
EmailDomainSuggester.addDatalist(value);
}
},
addDatalist: function(value) {
}
}
EmailDomainSuggester.init();
Erstellung des Datalist im laufenden Betrieb
Beachten Sie, dass ich im obigen Code einen kleinen Teil eingefügt habe, in dem ich den aus dem Eingabefeld extrahierten Wert am @-Symbol splitte. Das ermöglicht es uns, den Teil der E-Mail-Adresse vor der Domain zu extrahieren. Zum Beispiel den Teil „chriscoyier“ von „chriscoyier@gm“. Dann übergeben wir das an eine neue Funktion namens addDatalist. Nun verwenden wir sie
// variables for iteration and string concatination
var i, newOptionsString = "";
// loop over all the domains in our array
for (i = 0; i < this.domains.length; i++) {
newOptionsString +=
"<option value='" +
value +
"@" +
this.domains[i] +
"'>";
}
// add all the <option>s to our datalist
this.datalist.html(newOptionsString);
Entfernen des Datalist, wenn wir nicht bereit dafür sind
Als letzten Aufräumschritt sollten wir den Datalist entfernen, wenn der Wert im Eingabefeld noch kein @-Symbol enthält. Selbst wenn der Benutzer ihn ursprünglich eingegeben und dann wieder gelöscht hat. Das können wir in unserer Funktion `testValue` behandeln. Entweder aktualisieren wir den Datalist mit dem Neuesten vom Neuen oder wir entfernen ihn komplett
if (value.indexOf("@") != -1) {
value = value.split("@")[0];
EmailDomainSuggester.addDatalist(value);
} else {
// empty list
EmailDomainSuggester.datalist.empty();
}
Finale Demo
Anstatt hier einen riesigen Codeblock einzufügen, können Sie ihn im Pen ansehen
Siehe den Pen Hilfe beim Vervollständigen von E-Mail-Adressen mit von Chris Coyier (@chriscoyier) auf CodePen
Eine robustere Lösung
Fürs Protokoll: **Ich bin mir nicht absolut sicher, ob der Datalist-Ansatz eine gute Idee ist.** Es würde einige echte UX-Tests erfordern, um zu sehen, ob er tatsächlich hilfreich ist. Er könnte in Form von Benutzerverwirrung schädlich sein. Ich bin mir sicherer, dass eine Form der E-Mail-Domain-Überprüfung eine gute Idee ist.
Es gibt ein Open-Source-Projekt auf GitHub namens mailcheck.js, das ziemlich gut aussieht.

jquery.email-autocomplete.js ist eine weitere Option.
Yup
Haben Sie so etwas verwendet? Was denken Sie über die Ansätze? Haben Sie UX-Tests zu dieser oder ähnlichen Ideen durchgeführt? Haben Sie weitere Ideen, um das Problem der „falschen E-Mail“ anzugehen?
Süßer Usability-Trick. Steve Krug wäre stolz.
Ich bin mir nicht sicher, was ich besser finde, aber ich habe die Verwendung des Datalist schon einmal gesehen... kann mich nicht erinnern, wo, aber (aus der Sicht eines fortgeschrittenen Benutzers) gefällt mir die Liste. Aus Entwicklersicht ist „Meinten Sie…“ einfacher und viel sauberer.
Wow Ryan, danke, dass du mir den Tag im Büro ruiniert hast, eine einfache NSFW-Warnung sollte hinzugefügt werden.
Ich finde es gut. Ich denke, dass eine Lösung für falsch geschriebene E-Mails definitiv sehr hilfreich wäre, aber ich stimme Ihrem letzten Kommentar zu, dass die Lösung „Meinten Sie [email protected]?“ besser sein könnte. Sie ist etwas weniger aufdringlich und schockierender für den Benutzer.
Wenn ein Laie sich bei einer brandneuen Website registriert und ihm eine Liste von E-Mails präsentiert wird und er einige davon als Adressen erkennt, die er verwendet hat, könnte dies Datenschutzbedenken aufwerfen (auch wenn es mit dieser Lösung kein echtes Datenschutzproblem gibt).
Nur zur Info, laut begrenzter Recherche, die ich vor 2 Jahren durchgeführt habe, treten falsch geschriebene E-Mails bei etwa 1% der Formularübermittlungen auf
Anders ausgedrückt: Wenn Sie 1.000 Anmeldungen pro Monat auf Ihrer Website haben, schlagen 10 davon fehl, vielleicht 5 davon kontaktieren Sie frustriert... oder etwa 30-60 Minuten pro Monat Support, abhängig davon, wie schwierig es in Ihrem CMS ist, die E-Mail-Adresse zu ändern.
Wenn Sie 10.000 Anmeldungen haben, sind das 2 Arbeitstage.
In jedem Fall scheint es, dass sich die wenigen Stunden, die für Recherche und Implementierung benötigt werden, innerhalb weniger Wochen oder Monate auszahlen würden. Wenn Sie bereits eine Benutzerbasis haben, würde die Betrachtung der gängigsten Domains diese Technik erheblich nutzbarer machen. Tatsächlich könnten Sie noch einen Schritt weiter gehen und die monatliche Wartung automatisieren, indem Sie kürzlich verwendete Domains überprüfen, um die Liste zu füllen.
Ich glaube, das wird einige Verwirrung stiften, da ein solches Dropdown für die native Funktionalität des Browsers zur Anzeige des bisherigen Formularverlaufs reserviert ist. Und Sie müssten das deaktivieren, was nicht nur verwirrend, sondern auch ärgerlich ist.
Ich stimme zu. Die mailcheck.js-Oberfläche scheint weniger verwirrend zu sein.
Autosuggest wird in verschiedenen Formen verwendet, insbesondere von Google. Ich glaube nicht, dass Sie viel Verwirrung finden würden. Wenn Sie jedoch wirklich besorgt sind, könnten Sie es visuell als Vorschlag kennzeichnen und das Wort „Vorschläge“ irgendwo in der Liste.
Wie üblich ein schöner Beitrag. Die Treehouse-Show behandelte kürzlich eine coole jQuery-Formularvalidierungsbibliothek: Formance.js von Omar Shammas. Schauen Sie sie sich an!
(http://teamtreehouse.com/library/the-treehouse-show/episode-59-form-validation-safari-push-notifications-javascript-performance)
http://omarshammas.github.io/formancejs
Ich bin auch neugierig, wie diese Lösungen im Vergleich zu dem allgegenwärtigen Muster abschneiden, Benutzer aufzufordern, ihre E-Mail-Adresse zweimal einzugeben (um falsch geschriebene E-Mails zu reduzieren). Persönlich bevorzuge ich diese.
Ich habe mailcheck.js ein paar Mal verwendet und die Benutzer lieben es wirklich.
Ich habe auch einen Listener (Google Analytics) zum Link „Meinten Sie“ hinzugefügt, das hilft, wenn man wissen möchte, ob es einen Unterschied macht.
Scheint eine ziemlich gute Technik zu sein, aber ich bin mir nicht sicher, ob ich der Einzige bin, der das bemerkt hat, aber in Safari auf Mavericks wird das Menü nach der Eingabe von „@“ nicht angezeigt, was wahrscheinlich mit dem neuen Autofill für Passwörter/Benutzernamen zusammenhängt.
Ich denke, es ist wie eine integrierte Lösung für das Problem, die es Ihnen nur erlaubt, eine gültige E-Mail-Adresse einzugeben, die Sie auf Ihrem Mac eingegeben haben. Es wird sicherlich nett sein auf älteren Systemen, die eine solche Funktion nicht unterstützen.
Ich meinte, dass es *nicht* angezeigt wird.
Hier auch, Safari 6 unter ML, Code Pen funktioniert nicht.
Ich sehe nicht, wie das aufdringlich ist, wenn es im Grunde genau das gleiche Verhalten ist, das alle Browser bereits haben: Ein Dropdown erscheint bei Formularfeldern, die ähnliche sind wie solche, die Sie zuvor ausgefüllt haben, oder wenn Sie dasselbe Formular ausfüllen (wie das Kommentarformular hier*).
Außerdem ist das genau das, was wir als „Live-Suche“ kennen, eingeführt von Google vor mehreren Jahren (ich spreche nicht von „Sofortsuche“, das ist etwas anderes).
Und ich sehe niemanden im Web, der sich darüber beschwert, dass die beiden oben genannten Funktionen aufdringlich sind, und diese Idee von Chris baut auf denselben Konzepten auf.
Ich sehe jedoch ein technisches Problem und ein potenzielles Usability-Problem
Das technische Problem ist, dass dieses Skript bei mir auf meinem iPhone 5 mit iOS 6 nicht funktionierte (und ich werde noch länger warten, bevor ich mich flach bewerbe). Kann jemand iOS 7 bestätigen?
Das potenzielle Usability-Problem, das ich sehe, ist, dass Benutzer sich vielleicht unwohl fühlen, wenn sie sehen, dass diese Funktion ihre E-Mail-Adresse „mysteriös kennt“, bevor sie sie überhaupt vervollständigt haben. Nur so gesagt. Was in diesem Fall vielleicht mailcheck.js einen Vorteil hat, da es *nachdem* der Benutzer fertig ist passiert. Wieder nur gesagt.
Ich habe mich auch gefragt: Jedes Mal, wenn ich auf CSS-Tricks.com poste, muss ich die Felder oben ausfüllen, und da ich sie zuvor ausgefüllt habe, zeigt mir Firefox das Dropdown mit den E-Mails an, die ich in der Vergangenheit verwendet habe. Also: Was passiert, wenn diese beiden Funktionen kombiniert werden, das Dropdown des Browsers und das Dropdown des Skripts?
*Siehe Drop hier.
Spoiler: Es kombiniert sich tatsächlich sehr gut, da man sehen kann, dass der obere Bereich das eigene Dropdown des Browsers ist, und der darunterliegende der des Skripts, klar getrennt durch die dünne Linie.
Ich denke, ich hätte lieber zwei Felder für die E-Mail-Adresse, genau wie bei Passwörtern.
Macht für mich Sinn :)
Ich weiß nicht, was Sie sagen, aber als Benutzer kopiere und füge ich immer die zweite E-Mail ein (was den Zweck völlig zunichte macht). Und in den wenigen Fällen, in denen diese Fähigkeit deaktiviert war, hat es mich absolut wütend gemacht.
Interessante Idee, obwohl ich mich frage, ob sie nicht das Risiko erhöht, dass Leute versehentlich zu Gmail-Adressen autovervollständigen, anstatt andere E-Mail-Anbieter als die großen zu verwenden.
Einige Kleinigkeiten am Code
Es scheint, als würden Sie den Datalist bei jedem Tastendruck nach dem @ neu erstellen, was etwas verschwenderisch erscheint. Es wäre vielleicht sauberer, den alten „Wert“ (den Teil vor dem @) zu speichern und nur neu zu erstellen, wenn er sich geändert hat.
Bin ich der Einzige, der denkt, je mehr „Möglichkeiten“ wir haben, etwas zu tun, desto schwieriger scheint es, sich für eine zu entscheiden?
Ich sehe (hauptsächlich) Vorteile und (einige) Nachteile für alle drei Methoden: doppelte E-Mail-Felder, Datalist und „Meinten Sie?“, also abgesehen davon, zu versuchen, zu erraten, was Ihr „durchschnittlicher“ Benutzer als „verwirrend“ empfinden mag oder nicht, denke ich, es läuft darauf hinaus, einfach eine auszuwählen und dabei zu bleiben.
Leider mag ich sie alle O.O
Wenn Sie ein Tuts-Abonnent sind, schauen Sie sich dieses Tutorial an, das ich vor über einem Jahr geschrieben habe, über etwas Ähnliches
https://tutsplus.com/tutorial/building-a-mobile-friendly-form-with-email-domain-suggestion/
SAUBER, wie üblich, Chris! Ich bevorzuge vielleicht auch den »mailcheck.js«-Stil, nachdem ich ihn ausprobiert habe. Google Chrome gibt mir sofort ein Autocomplete für ein
<input type="email">. Dann wird das Autocomplete plötzlich durch die riesige Liste ersetzt, irgendwie verwirrend. Hat also der Browser-Autovervollständigung das nicht schon genug gelöst? Aber wieder: tolle kleine Idee!Eine serverseitige (oder clientseitige mit Ajax) Lösung wäre die Verwendung dieser PHP-Funktion: checkdnsrr().
Im Grunde können Sie überprüfen, ob der in Ihrer E-Mail-Adresse eingegebene Mailserver ein echter Mailserver ist.
Siehe die Doku: http://php.net/manual/fr/function.checkdnsrr.php
Das scheint die einfachste und zukunftssicherste Lösung zu sein (nicht, dass gmail.com verschwindet, aber einige Anbieter könnten es).
Oft vergessen Designer, dass hinter ihren Kreationen ein Server steckt – Nutzen wir ihn doch.
Ich bin gerade auf diese Funktion gestoßen, als ich meine Geschäfts-E-Mail eingerichtet habe! Und Mann, sie war wirklich hilfreich! Ich habe die Domain versehentlich falsch geschrieben und sie hat sie korrigiert! Ich liebe diese Seite!
Könnte die Benutzererfahrung verbessern, indem die Tasten Down und Up ignoriert werden. ;-)
Nein, das wäre fatal für die UX…
Wie kommt es, dass Sie so einen Müll an Ideen haben?
Ich glaube, es gibt einen Tippfehler in Ihrer Domainliste. Zumindest kenne ich gmx.com als E-Mail-Anbieter, während gmz.com keiner zu sein scheint. Ein Tippfehler in einem Tool, das Tippfehler reduzieren soll, ist irgendwie ironisch :-)
Wir verwenden bei Vimeo die „Meinten Sie x?“-Route. MailCheck sieht wie eine großartige Bibliothek aus, aber wie in der Dokumentation angegeben, sollten Sie unbedingt eigene Domain-Vorschläge basierend auf dem häufigsten Gebrauch durch Ihre Website-Besucher in Betracht ziehen. Der Nachteil dabei ist, dass Sie möglicherweise viele Aktualisierungen vornehmen müssen.
Die Vorliebe von Yahoo und Hotmail für mehrere TLDs war bisher das größte Problem, daher habe ich kürzlich eine separate Schleife erstellt, um meine Liste mit allen möglichen Permutationen zu füllen.
Hallo Chris, nette und coole Idee, aber ich kann keine Option mit der Tastatur auswählen.
Ich kann keine Optionen aus dem Dropdown mit den Pfeiltasten auswählen
Ich habe gehört, das ist ein Problem in Firefox. Bei mir funktioniert es in Chrome. Es ist nur ein nativer Datalist, bei dem Tastaturbefehle in Firefox funktionieren, also ist es ein Code-Problem. Fühlen Sie sich frei, zu forken und zu fixen =)
@rocketmail.com ist nicht auf der Liste ><