街道地址很复杂。它们应该很简单。
它们之所以难是因为
- 地址不是单个的数据单元;它包含 2 到 6 个不同的部分
- 地址不规则且不可预测(无法用正则表达式匹配)
- 地址可能在某种程度上有效,但并非完全有效
- 地址通常是结账时客户混淆的来源
在 SmartyStreets,我们通过创建一个基于事件的高度自主的 jQuery 插件来解决这个问题(双关语),该插件连接到权威的地址 API。我们亲切地称之为 jQuery.liveaddress。
您可以在此 LiveAddress 文档页面 上看到它的实际效果。

实际应用可以在 ProCPR、Tortuga Rum Cakes 和其他结账、注册和联系表单上看到。最终结果让我想要看到更多无需干预或配置即可正常工作的自主 jQuery 插件。
自主的脚本/应用/插件不需要手把手指导。它会自行执行,广播其正在执行的操作,并且“正常工作”。在这里,我将简要介绍自主插件的两个方面
- 即插即用
- 基于事件
即插即用
与 Web 应用不同,jQuery 插件需要适应其环境。jQuery 的选择器引擎 Sizzle 消除了很多痛苦,但在我们的例子中,地址不能仅仅被“选择”。它们必须被识别或“映射”。
因此,jQuery.liveaddress 非常特殊:它不仅仅是您可以直接对一组匹配元素调用的函数,也不支持链式调用。为了真正做到即插即用,我们的插件必须自动查找表单中与地址数据相关的元素:街道、城市、州、邮政编码等。插件会扫描您的页面以查找此类元素,并自动将其排列成由表单对象管理的地址结构。所有内容都在内部监控以进行更改。我们称此过程为“自动映射”。
以下是我们旧的 Javascript 实现的初始化方式。它没有自动映射,而且工程设计得不是很好
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 ...
]
);
将其与自动映射的 jQuery.liveaddress 进行比较
var liveaddress = $.LiveAddress("YOUR-API-KEY");
看到区别了吗?
在具有清晰输入name
和 id
属性,甚至<label>
标签和placeholder
属性的网页上,自动映射效果非常好。您不会相信我在测试期间看到的那些外观怪异的表单,其中name
和 id
与字段本身无关,当然,也没有<label>
标签。(设计师:注意!)对于此类情况,我们确实提供了一种方法,可以在初始化期间或之后使用选择器字符串手动映射字段
liveaddress.mapFields([{
id: 'billing', // IDs are not part of the address
street: '#street1',
street2: '#street2',
city: '#city',
state: '#state',
zipcode: '#zip'
}]);
请记住,如果您的插件自动执行或假设某些操作,请确保开发人员可以覆盖它并进行控制。
jQuery 插件不应该是您来自宜家的厨房桌子(需要大量组装)。它不能开箱即用吗?无论对您的特定脚本意味着什么,都随它去吧:尽可能不要让我配置它!
基于事件
考虑您可能想要介入地址验证过程中间并执行某些操作的情况。如果未引发任何事件,您如何知道地址刚刚被验证?您必须进入脚本的源代码并在其中找到自己的解决方法。事件是对此的优雅且正确的解决方案。
幸运的是,Javascript 使事件成为一件非常常规的事情!(某种程度上。) 使用事件。在发生有趣(或不有趣)的事情时触发它们。
jQuery 使事件变得轻而易举,甚至会维护对每个绑定处理程序的引用。因此,虽然我们都习惯于使用 jQuery 绑定到事件,但不要忘记也引发它们
$(someElement).trigger(eventName, extraData); // or use triggerHandler()
引发事件时,请务必传入与事件相关的任何数据,以便处理程序具有状态(上下文)。
jQuery.liveaddress 在其生命周期中最多会引发 14 个自定义事件。正如您将在下面看到的那样,这非常有用且功能强大。
事实上,jQuery.liveaddress 在内部绑定到自己的事件。这意味着您可以随时随地停止该过程。例如,要阻止用户提交缺少辅助(公寓)编号的地址
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
}
});
请注意,此on()
函数是在 liveaddress 对象上调用的,而不是 jQuery 通常的on()
。当您使用 jQuery 的on()
绑定处理程序时,该处理程序将在之前绑定的处理程序之后触发。由于插件首先绑定到其自己的事件,并且每个处理程序都链接到下一个事件,因此您的处理程序只有在整个过程完成后才会触发。
为了解决这个问题,jQuery.liveaddress 提供的自定义on()
函数将取消根之前的处理程序,放下您的处理程序,然后在其之上放置其他处理程序。这意味着您的处理程序首先触发。如您所见,要继续验证过程,只需调用作为参数传入的先前处理程序即可。如果您想要最终决定权,只需不要调用先前的处理程序即可。
6 个地址字段 1 个地址字段
在结束之前,我们先简单说一下。这是针对设计师的。
如前所述,街道地址很复杂。它们需要 2 到 6 个表单字段,它们的顺序经常不同,每个人填写的方式都不同,并且输入过程中经常出现错误。是的,验证输入很重要,但我不是来推广这一点的。相反,您是否考虑过 将所有字段合并为一个?
用户更习惯于以自然或直观的方式输入地址,就像他们在信封上写地址一样。这往往可以减少输入错误并带来愉悦的体验。
虽然 解析地址字符串存在一些注意事项,但这仍然是对访客体验的重大改进。这样,用户可以输入自由格式的地址,如果需要,您可以存储各个组成部分。
结论
我们已经了解了几种使 Javascript 不像高维护女友的方法。结合语义标记,脚本可以更易于使用、更智能、更直观。理想情况下,它们会通过引发事件来广播其操作,以便其他代码可以了解正在发生的事情并挂接到它们。脚本自动化程度越高,它在诸如购物车结账页面或具有高度动态内容和功能的页面等恶劣环境中就必须越健壮。自主脚本在可能的情况下适应其环境,如果无法适应则会优雅地失败。
您描述了一个自动检测命名良好的地址字段的插件(很棒)。然后您在最后提到了单字段地址以及解析地址的所有问题。怎么回事?您的插件是否适用于单字段地址?
如果必须,是的。由于单行解析可能会有点棘手,因此我们不建议使用它。但随着 Web 的发展,这是朝着改善整体 UX 迈进的方向。
单字段地址输入简化了用户体验(参见 Google 地图)。我们不妨朝着这个方向迈进。例如,为什么我们仍然在许多结账时被要求输入我们的信用卡类型?只需查看卡号的数字即可推断出类型。应用此推理,我们希望自主脚本能够帮助开发人员和网站访客获得更好的体验。
我想知道是否可以为全球受众获取类似的东西。无论我尝试如何编写我的家庭住址(我住在爱沙尼亚),它都无法验证
我们集成的LiveAddress API不支持国际地址。这就是部分原因(http://smartystreets.com/kb/faq/do-you-verify-international-addresses)
strikeiron.com、cdyne.com等都提供国际服务。
不错的插件,但在欧洲没什么用…(或者说在美国以外的地方)。
我目前不需要地址验证,但我想称赞这篇文章的优秀写作。我希望所有技术文章都能写得这么好。干得好!
我希望它能在美国以外的地方使用!
我喜欢这个概念。很有趣…最近我被要求根据位置和搜索词进行搜索——所有操作都在一个字段中完成。虽然编程很糟糕,但现在谁不是在用谷歌搜索这样做呢?开发人员提交的任何有助于单行地址的工具都将非常有帮助。
最后的思考:开发一个独特的用户体验可能会很酷,用户在 UI 中输入一行,但旁边的空间显示解析结果。如果不正确,他们可以点击并更正它。我认为这可能会让人感到困惑/杂乱,但我对看到有人尝试设计它很感兴趣。 :)
我完全赞成单输入,将您的地址输入到此文本区域的方法。就像日期在成为单个字段时更好一样。
总是在创建新的地址,根据数据库验证地址在(英国)很昂贵。全球范围?别费心了。如果您连接到像 PayPal 这样的提供已验证地址的支付处理器,您甚至都不需要索取它。
或者,它可以非常简单,根本不需要验证
“嘿,我们很高兴您喜欢我们的产品!我们需要您的地址以便将其发送给您,在此处输入。我们将打印出来并将其粘贴到您的包裹上, *完全* 按照您输入的方式,所以请确保它是正确的!”
日期字段是一个很好的例子。事实上,它是一个极好的例子。一个经过精心计划的日期字段将允许以多种不同的格式输入并仍然正确解析它。这意味着用户不必符合该字段。相反,只需少量代码(甚至很多,但只需一次),字段就可以符合他们的需求。
当然,客户首先有责任正确输入他们的地址,毫无疑问。但是,如果他们输入错误的地址,而您的网站能够立即识别出来,您当然可以更进一步(并成为英雄)。我们以前都输入过错误的东西。如果客户及时订购了生日礼物,但由于他们弄错了地址而没有收到,他们仍然会对整个体验感到失望。为什么不尽可能地让他们的生活更轻松呢?毕竟,回头客比首次客户便宜得多。
至于使用 PayPal 地址验证,只要您正在处理付款,它就可以很好地工作。如果人们正在注册当地学校的时事通讯,验证地址以避免邮件发送错误仍然很方便。
非常有用,但不幸的是无法在美国以外使用!
正确,SmartyStreets 地址验证 API 仅适用于美国地址。
我希望它能在印度使用。 :(