利用js+php的技术,实现全国地址多级联动的功能

来源:互联网 发布:比较好的php框架 编辑:程序博客网 时间:2024/05/17 21:58

项目开发已经快到收尾的阶段,但还有几个功能还没有完成,其中有一个功能,让我纠结了几天——全国省份、城市、区/县和街道/镇的显示。

看到这个需求的时候,第一反应是这只不过是个简单的“多级联动”的问题,没有什么难度。无非就是将全国所有的城市资料写入到数据表就行了。但是一想到全国那么多城市,我就懵了。这个工作量不小,于是百度到这么一篇文章-《世界国家省份城市县区街道村地址邮编常用通用功》。

这篇文章研究了某宝的实现过程,将省份、城市和区/县的数据写入到js的变量中,而通过ajax接收街道/镇的信息。其思想也是多级联动,但是将数据来源分成两部分,因为省份、城市和区/县的数据基本上不会变动,放在js中,减轻服务器的压力,想想也蛮有道理的。于是,我就开始在这个思路的指引下,开始落地的工作。


第一步:将省份、城市和区/县的数据放在变量中


当看到这样的代码的时候,我是表示拒绝的。通过转码工具,我看到这里的数据包括国外的地址,那这些不是我需要的,当然剔除掉。这个过程是枯燥的,找到你想要的省份信息。这里我就不说了。

第二步:研究这些数组的规律,找到我们想要的数据


对数据进行转化之后,发现了规律:["前一级别地址编号",["地址简体字","地址繁体字"],"本级别地址编号","0"]。有了这个规律,后面的事情就简单了。

第三步:获取本级别的编码,遍历数组,找到想要的数据。




在jquery代码中,流程是这样的:1.通过change事件获取省份的编码;2.清空城市一栏的内容;3.遍历包含所有地址信息的变量t,通过判断获取城市的信息;4.通过eval()将unicode转化成中文。按照这个思路,就能完成p(省份)、c(城市)和s(区/县)的显示,下面就要讲怎么获取“街道/镇”的信息。

第四步:通过某宝的url,获取街道/镇的信息

在那篇文章中,你会看到这个url:https://lsp.wuliu.taobao.com/locationservice/addr/output_address_town_array.do?l1=110000&l2=110100&l3=110101&lang=zh-S&_ksTS=1432880083437_7507&callback=jsonp7508。

会得到这样的结果:


我尝试了这个url的各个参数,发现只有三个是必须的,分别是l1、l2、l3,代表的意思分别是省份编码、城市编码和区/县编码。

一开始,我是直接用$.ajax()的方式去进行的,但是会报出错误。最后发现ajax只能在本域名下进行,而不能调用其他网站的url。然后找到的解决方案是,利用ajax技术,在本域的php中获取url返回的数据,再返回给jquery,解析获得你想要的数据。

代码模型如下:


通过url返回的数据格式是jsonp格式,但是我没学过,也懒得学,就直接在php文件中,通过str_replace进行修改,去除掉没用的字符,得到json格式。这样一来,就简单多了。

最后看看效果图:


到这里,获取全国地址的多级联动基本完成,但是还需要完善。感谢某宝的url~


0 0
原创粉丝点击