省市区三级联动下拉菜单的实现(含最新行政区划数据)

先看下效果图:

233024_kT6V_1274682.png

本项目省市区的数据来源于国家统计局官网2015年04月15日发布的,截止到2014年10月31日的最新数据,官网地址为:http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201504/t20150415_712722.html


源码下载地址:

https://git.oschina.net/ximidao/province-city-district

002054_zSFy_1274682.png


简单说下思路:

1、数据入库

先搭建好PHP运行环境,将官网上的数据拷到text文件,本地新建一个数据库,编码格式为utf-8,PHP处理入库(具体入库就不写了)

234052_yLon_1274682.png

省市区对应三个表:

表 province

字段名类型
长度
idint6
provincevarchar50

表 city

字段名类型
长度
idint6
cityvarchar80
province_idint6

表 district

字段名类型
长度
idint6
districtvarchar80
city_idint50


2、生成JSON

PHP读取数据库,生成一个包省市区所有数据的JSON

<?php

header("Content-type: text/html; charset=utf-8"); 

$db_host = 'localhost'; //主机地址
$db_user = 'root';		//数据库用户名
$db_pwd = '123456';		//数据库密码
$db_name = 'heiyu';		//数据库名称
$mysqli = new mysqli($db_host,$db_user,$db_pwd,$db_name);

mysqli_query($mysqli,"SET NAMES utf8");

/*省数据查询*/
$query_province = "SELECT id,province FROM province";
$result_province=$mysqli->query($query_province);
while($row_province =$result_province->fetch_array() ){   
  $array_province[] = array(id=>(int)$row_province[id],name=>$row_province[province]);
}  

/*市数据查询*/
$query_city = "SELECT id,city,province_id FROM city";
$result_city=$mysqli->query($query_city);
while($row_city =$result_city->fetch_array() ){   
  $array_city[$row_city[province_id]][] = array(id=>(int)$row_city[id],name=>$row_city[city]);
}  

/*区数据查询*/
$query_district = "SELECT id,district,city_id FROM district";
$result_district = $mysqli->query($query_district);
while($row_district =$result_district->fetch_array() ){   
  $array_district[$row_district[city_id]][] = array(id=>(int)$row_district[id],name=>$row_district[district]);
}  

$result_province->free();
$result_city->free();
$result_district->free();
$mysqli->close();

$array = array(province=>$array_province,city=>$array_city,district=>$array_district);
$json = json_encode($array);

//echo $json;

//为了方便查看,将unicode编码转成汉字
echo preg_replace("#\\\u([0-9a-f]+)#ie","iconv('UCS-2','UTF-8', pack('H4', '\\1'))",$json);


?>

因为省市区的变动性不高,可以把PHP生成的JSON拷贝到一个文件里面,Ajax请求的时候直接访问该文件就可以了,减轻数据库负担


3、实现选择操作

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>省市区三级联动下拉菜单</title>
<meta name="author" content="西米岛主">
<meta name="description" content="博客地址:http://my.oschina.net/ximidao">
<style type="text/css">
	.select-box{margin: 30px; padding: 30px; background-color: #70C104;}
	select{height: 30px;}
</style>
<script src="jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
	$(function(){
		/*初始化,加载省市区*/
		$.ajax({
			type: 'GET',
			url: 'data.json',
			dataType: 'json',
			success: function(data){
            	var htmlProvince = '';
            	province = data.province;
            	city = data.city;
            	district = data.district;
            	for(var i=0; i<province.length;i++){
				  	htmlProvince += '<option value="'+province[i].id+'">'+province[i].name+'</option>';
				}
				$('#province').append(htmlProvince);
            },
            error: function(){
            	console.log('请求失败');
            }
        });
		/*选择省*/
        $('#province').change(function(){
        	var code = $(this).val();
        	if(code!=''){
        		var cityCode  = city[code][0].id;
        		var htmlCity = '',
        			htmlDistrict = '';
        		for(var i=0; i<city[code].length;i++){
				  	htmlCity += '<option value="'+city[code][i].id+'">'+city[code][i].name+'</option>';
				}
        		$('#city').html(htmlCity);
        		
        		for(var i=0; i<district[cityCode].length;i++){
				  	htmlDistrict += '<option value="'+district[cityCode][i].id+'">'+district[cityCode][i].name+'</option>';
				}
        		$('#district').html(htmlDistrict);
        	}else{
        		$('#city,#district').html('');
        	}
        });

		/*选择市*/
		$('#city').change(function(){
			var cityCode = $(this).val();
        	var htmlDistrict = '';
    		for(var i=0; i<district[cityCode].length;i++){
			  	htmlDistrict += '<option value="'+district[cityCode][i].id+'">'+district[cityCode][i].name+'</option>';
			}
    		$('#district').html(htmlDistrict);
		});
	});
</script>
</head>
<body>
	<div class="select-box">
		<select id="province"><option value="">请选择省份</option></select> 
		<select id="city"></select> 
		<select id="district"></select> 
	</div>
</body>
</html>

详细请看项目源码。

转载于:https://my.oschina.net/ximidao/blog/516863

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值