Straßenadressen sind kompliziert. Sie sollten einfach sein.
Sie sind schwierig, weil
- Eine Adresse ist keine einzelne Dateneinheit; sie besteht aus 2 bis 6 verschiedenen Teilen
- Adressen sind unregelmäßig und unvorhersehbar (können nicht mit regulären Ausdrücken abgeglichen werden)
- Eine Adresse kann quasi gültig sein, ohne vollständig gültig zu sein
- Adressen sind oft eine Quelle der Verwirrung für Kunden beim Checkout
Bei SmartyStreets haben wir das Problem (Wortspiel beabsichtigt) gelöst, indem wir ein ereignisbasiertes, hochgradig autonomes jQuery-Plugin erstellt haben, das sich in eine maßgebliche Adress-API einklinkt. Wir nennen es liebevoll jQuery.liveaddress.
Sie können es in Aktion auf dieser LiveAddress-Dokumentationsseite sehen.

Tatsächliche Implementierungen sind auf ProCPR, Tortuga Rum Cakes und anderen Checkout-, Anmelde- und Kontaktformularen zu sehen. Die Endergebnisse lassen mich nach weiteren autonomen jQuery-Plugins suchen, die einfach funktionieren, ohne dass sie eingreifen oder konfiguriert werden müssen.
Ein autonomes Skript/eine autonome App/ein autonomes Plugin benötigt keine ständige Betreuung. Es tut seine eigenen Dinge, sendet aus, was es tut, und es *funktioniert einfach*. Hier werde ich mich kurz auf zwei Aspekte des autonomen Plugins konzentrieren
- Plug-and-Play
- Ereignisbasiert
Plug-and-Play
Im Gegensatz zu Webanwendungen müssen sich jQuery-Plugins an ihre Umgebung anpassen. Die Sizzle-Engine von jQuery nimmt viel Arbeit ab, aber in unserem Fall können Adressen nicht einfach „ausgewählt“ werden. Sie müssen *identifiziert* oder „zugeordnet“ werden.
Daher ist jQuery.liveaddress eher ungewöhnlich: Es ist nicht nur eine Funktion, die Sie direkt auf eine Menge übereinstimmender Elemente aufrufen können, noch unterstützt es Verkettung. Um wirklich Plug-and-Play zu sein, muss unser Plugin automatisch die Elemente in einem Formular finden, die sich auf Adressdaten beziehen: Straße, Stadt, Bundesland, Postleitzahl usw. Das Plugin scannt Ihre Seite nach solchen Elementen und ordnet sie automatisch in Adressstrukturen ein, die von Formular-Objekten verwaltet werden. Alles wird intern auf Änderungen überwacht. Wir nennen diesen Prozess „Auto-Mapping“.
Hier wurde unsere alte Javascript-Implementierung initialisiert. Sie hatte kein Auto-Mapping und war nicht sehr gut konstruiert
QadApi({
timeout: 10,
key: "HTML-KEY",
busySubmit: false,
autoClean: false,
submitId: "submit",
allowPost: false,
properCase: true
// ... other service-related configuration ...
},
{
busyId: "QadBusy"
// ... other CSS-related configuration ...
},
[
{
name: "Javascript Example",
street: "street",
city: "city",
state: "state",
zip: "zipcode"
}
// ... other addresses to be mapped, if any ...
]
);
Vergleichen Sie das mit jQuery.liveaddress, das Auto-Mapping durchführt
var liveaddress = $.LiveAddress("YOUR-API-KEY");
Sehen Sie den Unterschied?
Auf Webseiten mit klaren `name`- und `id`-Attributen für Eingabefelder, oder sogar `<label>-Tags und `placeholder`-Attributen, funktioniert das Auto-Mapping bemerkenswert gut. Sie würden nicht glauben, wie verschachtelt aussehende Formulare ich beim Testen gesehen habe, bei denen `name` und `id` nichts mit dem eigentlichen Feld zu tun hatten, und natürlich gab es keine `<label>-Tags. (Designer: beachten Sie das!) Für solche Fälle bieten wir eine Möglichkeit, Felder manuell zuzuordnen, entweder während der Initialisierung oder danach, unter Verwendung von Selektor-Strings
liveaddress.mapFields([{
id: 'billing', // IDs are not part of the address
street: '#street1',
street2: '#street2',
city: '#city',
state: '#state',
zipcode: '#zip'
}]);
Denken Sie daran, wenn Ihr Plugin etwas automatisch tut oder annimmt, stellen Sie sicher, dass der Entwickler es überschreiben und die Kontrolle übernehmen kann.
Ein jQuery-Plugin sollte nicht wie Ihr Küchentisch von IKEA sein (erheblicher Montageaufwand erforderlich). Kann es nicht einfach sofort funktionieren? Was auch immer das für Ihr bestimmtes Skript bedeutet: Machen Sie es einfach nicht konfigurierbar, wenn möglich!
Ereignisbasiert
Betrachten Sie den wahrscheinlichen Fall, dass Sie mitten im Adressvalidierungsprozess eingreifen und etwas tun möchten. Wenn keine Ereignisse ausgelöst werden, woher wissen Sie, dass eine Adresse gerade validiert wurde? Sie müssten in den Quellcode des Skripts eintauchen und dort einen eigenen Hack einbauen. Ereignisse sind die elegante – und richtige – Lösung dafür.
Wir haben Glück, dass Javascript Ereignisse zu einer so routinemäßigen Sache macht! (Wortwörtlich.) Verwenden Sie Ereignisse. Feuern Sie sie ab, wenn coole (oder uncoole) Dinge passieren.
jQuery macht Ereignisse zum Kinderspiel und verwaltet sogar eine Referenz auf jeden gebundenen Handler. Während wir also alle daran gewöhnt sind, Ereignisse mit jQuery zu *binden*, vergessen Sie nicht, sie auch zu *auszulösen*
$(someElement).trigger(eventName, extraData); // or use triggerHandler()
Stellen Sie beim Auslösen von Ereignissen sicher, dass Sie alle ereignisbezogenen Daten übergeben, damit der Handler den Zustand (Kontext) hat.
jQuery.liveaddress löst während seiner Laufzeit bis zu 14 benutzerdefinierte Ereignisse aus. Dies war immens nützlich und leistungsfähig, wie Sie unten sehen werden.
Tatsächlich bindet sich jQuery.liveaddress intern an seine eigenen Ereignisse. Das bedeutet, Sie haben die Möglichkeit, den Prozess jederzeit und unter jeder Bedingung zu stoppen. Zum Beispiel, um zu verhindern, dass der Benutzer eine Adresse übermittelt, der eine sekundäre (Wohnungs-)Nummer fehlt
liveaddress.on("AddressAccepted", function(event, data, previousHandler) {
if (data.response.isMissingSecondary()) {
data.address.abort(event); // reset some things internally
alert("Don't forget your apartment number!");
} else {
previousHandler(event, data); // continue the process
}
});
Beachten Sie, dass diese `on()`-Funktion auf dem liveaddress-Objekt aufgerufen wird und nicht auf dem üblichen `on()` von jQuery. Wenn Sie einen Handler mit `on()` von jQuery binden, wird dieser Handler nach den zuvor gebundenen ausgelöst. Da das Plugin zuerst an seine eigenen Ereignisse bindet und jeder Handler zum nächsten Ereignis weiterleitet, wird Ihr eigener Handler erst ausgelöst, wenn der gesamte Prozess abgeschlossen ist.
Um Abhilfe zu schaffen, entkoppelt die benutzerdefinierte `on()`-Funktion von jQuery.liveaddress die vorherigen Handler, legt Ihren darunter und pflanzt die anderen Handler darüber. Das bedeutet, dass Ihr Handler zuerst ausgelöst wird. Wie oben gezeigt, rufen Sie einfach den vorherigen Handler, der als Argument übergeben wird, auf, um den Validierungsprozess fortzusetzen. Wenn Sie das letzte Wort haben möchten, rufen Sie einfach den vorherigen Handler nicht auf.
6 Adressfelder 1 Adressfeld
Ein kurzer Einschub, bevor wir zum Ende kommen. Dies ist für die Designer.
Wie bereits erwähnt, sind Straßenadressen kompliziert. Sie erfordern 2 bis 6 Formularfelder, sie sind häufig in unterschiedlicher Reihenfolge angeordnet, jeder füllt sie anders aus und es gibt oft Fehler bei der Eingabe. Ja, die Überprüfung der Eingabe ist wichtig, aber darum geht es mir hier nicht. Haben Sie stattdessen darüber nachgedacht, alle Felder zu einem einzigen Feld zusammenzufassen?
Benutzer sind es gewohnt, eine Adresse in einem natürlichen oder intuitiven Format einzugeben, als ob sie sie auf einen Umschlag schreiben würden. Dies reduziert Eingabefehler und sorgt für eine angenehme Erfahrung.
Obwohl es Vorbehalte beim Parsen von Adresszeichenfolgen gibt, ist dies dennoch eine beträchtliche Verbesserung der Erfahrung Ihres Besuchers. Auf diese Weise können Benutzer eine frei formatierte Adresse eingeben und Sie können die einzelnen Komponenten bei Bedarf speichern.
Fazit
Wir haben uns ein paar verschiedene Wege angesehen, um Javascript nicht wie eine anspruchsvolle Freundin zu machen. In Kombination mit semantischem Markup können Skripte einfacher zu bedienen, intelligenter und intuitiver sein. Im Idealfall senden sie ihre Aktionen durch Auslösen von Ereignissen, damit anderer Code weiß, was vor sich geht und sich einklinken kann. Je automatisierter Ihr Skript ist, desto robuster muss es in feindlichen Umgebungen sein, wie z. B. Warenkorb-Checkout-Seiten oder Seiten mit hochdynamischen Inhalten und Funktionen. Autonome Skripte passen sich nach Möglichkeit an ihre Umstände an und scheitern, wenn sie es nicht können, auf würdevolle Weise.
Sie beschreiben ein Plugin, das automatisch gut benannte Adressfelder erkennt (großartig). Dann erwähnen Sie die Ein-Feld-Adresse am Ende und all die Probleme mit dem Parsen einer Adresse. Was ist los? Funktioniert Ihr Plugin mit Ein-Feld-Adressen?
Wenn es sein muss, ja. Da das Parsen von einzelnen Zeilen etwas knifflig werden kann, empfehlen wir es nicht. Aber während das Web fortschreitet, ist es etwas, worauf man für eine bessere Gesamt-UX hinarbeiten sollte.
Ein-Feld-Adresseneingaben vereinfachen die Benutzererfahrung (siehe Google Maps). Wir sollten uns in diese Richtung bewegen. Warum werden wir zum Beispiel bei vielen Checkouts immer noch nach unserer Kreditkartentyp gefragt? Der Typ kann durch einfaches Betrachten der Ziffern der Kartennummer abgeleitet werden. Wenn wir diese Logik anwenden, hoffen wir, dass autonome Skripte den Entwicklern und den Website-Besuchern bessere Erfahrungen ermöglichen.
Ich frage mich, ob es so etwas auch für ein globales Publikum gibt. Es validiert keine meiner Adressversuche, egal wie ich meine Heimatadresse eingebe (ich lebe in Estland)
Die LiveAddress API, an die wir uns anbinden, verarbeitet keine internationalen Adressen. Das ist einer der Gründe (http://smartystreets.com/kb/faq/do-you-verify-international-addresses), warum nicht.
strikeiron.com, cdyne.com und andere bieten internationalen Service an.
Netter Plugin, aber nicht sehr nützlich in Europa... (oder auch außerhalb der USA für diese Angelegenheit)
Ich brauche derzeit keine Adressverifizierung, aber ich wollte die gute Schreibe in diesem Artikel loben. Ich wünschte, alle technischen Beiträge wären so gut geschrieben. Gute Arbeit!
Ich wünschte, es würde außerhalb der USA funktionieren!
Ich mag das Konzept. Es ist interessant... vor kurzem wurde ich beauftragt, Suchen basierend auf Ort und Suchbegriff durchzuführen – alles von einem Feld aus. Während es schwierig zu programmieren ist, wer macht das nicht mit Google-Suchen heutzutage? Alles, was andere Entwickler beitragen können, um Ein-Zeilen-Adressen zu helfen, wird immens helfen.
Abschließender Gedanke: Es wäre cool, eine einzigartige UX zu entwickeln, bei der der Benutzer eine Zeile in die Benutzeroberfläche tippt, aber der Bereich daneben die Analyse anzeigt. Wenn nicht korrekt, kann er dort hineinklicken und es korrigieren. Ich denke, das könnte verwirrend/unübersichtlich werden, aber ich wäre daran interessiert zu sehen, ob jemand versucht, es zu entwerfen. :)
Ich bin ganz für die Ein-Feld-Herangehensweise „Gib deine Adresse in dieses Textarea ein“. Genau wie Daten besser sind, wenn sie einzelne Felder sind.
Es entstehen ständig neue Adressen, die Validierung von Adressen gegen eine Datenbank ist teuer (in Großbritannien). Weltweit? Vergiss es. Wenn Sie mit einem Zahlungsabwickler wie PayPal verbunden sind, der verifizierte Adressen bereitstellt, müssen Sie diese nicht einmal abfragen.
Alternativ kann es sehr einfach sein, keinerlei Validierung zu haben
„Hey, wir freuen uns, dass Ihnen unser Produkt gefällt! Wir brauchen Ihre Adresse, damit wir sie Ihnen zusenden können, tippen Sie sie hier ein. Wir werden dies ausdrucken und genau so auf Ihr Paket kleben, wie Sie es eingegeben haben, also stellen Sie sicher, dass es korrekt ist!“
Gutes Beispiel mit dem Datumsfeld. Hervorragend sogar. Ein gut geplantes Datumsfeld ermöglicht die Eingabe in einer Reihe verschiedener Formate und parst es trotzdem korrekt. Das bedeutet, dass der Benutzer nicht auf das Feld conformieren muss. Stattdessen kann sich das Feld mit etwas Code (oder sogar viel, aber nur einmal) an ihn anpassen.
Sicherlich ist der Kunde dafür verantwortlich, seine Adresse erst einmal korrekt einzugeben, daran besteht kein Zweifel. Aber Sie können sicherlich über das Übliche hinausgehen (und ein Held sein), wenn er sich bei einer Adresse vertippt und Ihre Website sie sofort erkennt. Wir haben uns alle schon einmal vertippt. Wenn ein Kunde ein Geburtstagsgeschenk rechtzeitig bestellt, damit es ankommt, es aber nicht tut, weil er sich bei seiner Adresse vertippt hat, wird er mit der gesamten Erfahrung immer noch enttäuscht sein. Warum nicht so viel wie möglich tun, um ihm das Leben zu erleichtern. Schließlich ist ein wiederkehrender Kunde viel günstiger als ein Erstkunde.
Was die Verwendung der PayPal-Adressenvalidierung angeht, so funktioniert das gut, solange Sie eine Zahlung abwickeln. Wenn sich Leute für den lokalen Schulnewsletter anmelden, ist es dennoch hilfreich, die Adresse zu validieren, um Fehlversendungen zu vermeiden.
Sehr nützlich, aber leider außerhalb der USA nicht möglich!
Korrekt, die SmartyStreets Adressvalidierungs-API funktioniert nur mit US-Adressen.
Ich wünschte, es würde in Indien funktionieren. :(