`
kong0itey
  • 浏览: 304013 次
社区版块
存档分类
最新评论

我写的全国省市县三级联动菜单,拿出来和大家分享了(原创)

    博客分类:
  • java
阅读更多
联动菜单代码
/*
 * 这是一个省市县级联的选择器采用ajax的方式来调用数据源
 * ajax页面接收2个参数,level和parentid,这2个参数作为查询条件
 * 其中level代表地区等级,1=省,2=市,3=县
 * 另一个参数parentid代表要查询的地区的父级地区
 * ajax取到的结果是字符串序列(例如:235,潮州市;236,东莞市;237,佛山市;238)
 * 
 */

function AreaPicker(config) {
	/*
	 * 私有属性
	 */
	var provId = "#" + config.provId;
	var cityId = "#" + config.cityId;
	var townId = "#" + config.townId;
	var provDefStr = config.provDefStr? config.provDefStr : "请选择省份";
	var cityDefStr = config.cityDefStr? config.cityDefStr : "请选择地区";
	var townDefStr = config.townDefStr? config.townDefStr : "请选择县市";
	var loadingStr = config.loadingStr? config.loadingStr : "正在加载...";
	var asynSrc = config.url;
	var asynTimeout = config.timeout ?config.timeout : 5000;
	var asynMethod = config.method? config.method : "post";
	var asynCache = config.cache? config.cache : false;
	
	
	
	
	
	/**
	 * 私有方法,作用是初始化选择器的三个下拉框
	 * 
	 * @param pct
	 *            参数(p=省,c=地,t=县)
	 */
	var initSelect = function(pct) {
		if (pct.indexOf("p") >= 0) {
			$(provId).html("<option value=\"\">" + provDefStr + "</option>");
			$(provId).show();
		}
		if (pct.indexOf("c") >= 0){
			$(cityId).html("<option value=\"\">" + cityDefStr + "</option>");
			$(cityId).show();
		}
		if (pct.indexOf("t") >= 0){
			$(townId).html("<option value=\"\">" + townDefStr + "</option>");
			$(townId).show();
		}
	}

	
	
	
	/**
	 * 私有方法,作用是从数据源页面异步读取地区信息,根据objId,填充到相应的select中
	 * 
	 * @param objId
	 *            用来装查询结果的下拉框对象的id
	 * @param param
	 *            传送给数据源页面的参数,格式为{param:1,level:1}
	 * @returns 数据源页面的输出内容(例如:235,潮州市;236,东莞市;237,佛山市;238)
	 */
	var asynGetArea = function(objId, param,listeners) {
		//发送ajax之前
		var bef = function() {
			$(objId).html("<option value=\"\">"+loadingStr+"</option>");
		}
		//发送ajax之后并且服务器返回成功
		var succ = function(code) {
			if (!code || $.trim(code).length==0) {
				$(objId).hide();
				return;
			}
			var htmlCode = "";
			var tempArray = code.split(";");
			for ( var i = 0; i < tempArray.length; i++) {
				var tempArray1 = tempArray[i].split(",");
				var id = tempArray1.length >= 1 ? tempArray1[0] : null;
				var name = tempArray1.length >= 2 ? tempArray1[1] : null;
				htmlCode += "<option value=\"" + id + "\">" + name + "</option>\n";
			}
			$(objId).html(htmlCode);
		}
		//success方法的包裹方法,用于实现事件监听
		var successWarpper = function(data) {
			var befSuccessListener = listeners?listeners.befSuccessListener:null;
			if(befSuccessListener && (typeof befSuccessListener=="function"))
				befSuccessListener();
			succ(data);
			var aftSuccessListener = listeners?listeners.aftSuccessListener:null;
			if(aftSuccessListener && (typeof aftSuccessListener=="function"))
				aftSuccessListener();
		}
		//发送ajax之后并且状态错误
		var err = function(e1, e2) {
			$(objId).html("<option value=\"\">加载失败: " + e1 + "," + e2 + "</option>");
		}
		//ajax各种配置项
		var asynConfig = {
			type : asynMethod,
			cache : asynCache,
			url : asynSrc,
			data : param,
			timeout : asynTimeout,
			beforeSend : bef,
			success : successWarpper,
			error : err
		};
		//发出请求
		$.ajax(asynConfig);
	}

	
	
	
	/**
	 * 绑定下拉列表的change和focus事件,用来实现联动效果
	 */
	var bindSelect = function() {
		//省份下拉框改变事件的处理函数
		var provChange = function() {
			initSelect("ct");
			var selectVal = $(provId).val();
			var listeners = {aftSuccessListener:function(){
				cityChange();
			}};
			if (selectVal)
				asynGetArea(cityId, {
					level : -1,
					parentid : selectVal
				},listeners);
		}
		//城市下拉框改变事件的处理函数
		var cityChange = function() {
			initSelect("t");
			var selectVal = $(cityId).val();
			if (selectVal)
				asynGetArea(townId, {
					level : -1,
					parentid : selectVal
				});
		}
		//绑定地级下拉框获得焦点事件
		var cityFocus = function() {
			if ($(cityId + " option").length > 0 && $(cityId).val())
				return;
			provChange();
		}
		//绑定县市下拉框获得焦点事件
		var townFocus = function() {
			if ($(townId + " option").length > 0 && $(townId).val())
				return;
			cityChange();
		}
		//绑定各个事件
		$(provId).change(provChange);
		$(cityId).change(cityChange);
		$(cityId).focus(cityFocus);
		$(townId).focus(townFocus);
	}

	
	
	
	/**
	 * 公有方法,用来初始化地区选择器,暴露给外部调用的入口
	 */
	return {
		pick : function() {
			initSelect("pct");
			asynGetArea(provId, {
				level : 1,
				parentid : -1
			});
			bindSelect();
		}
	}
}





调用方式
	    $(function() {
	    	var areaPicker = new AreaPicker({provId:"province",cityId:"city",townId:"town",url:"ajax_search_area.jsp"});
	    	areaPicker.pick();
	    });

<select id="province"></select>
<select id="city"></select>
<select id="town"></select>






ajax页面(数据源)
<%@ page language="java" pageEncoding="UTF-8"%>
<%@page import="java.sql.*"%>

<%!
private static Connection conn;
private static String driver = "com.mysql.jdbc.Driver"; // 数据库驱动
private static String ulr = "jdbc:mysql://172.16.1.115:3306/test";
private static String username = "root"; // 数据库的用户名
private static String pwd = "root";// 数据库的密码

static {
	try {
		Class.forName(driver);
		conn = DriverManager.getConnection(ulr, username, pwd);
		conn.setAutoCommit(false);
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
		System.exit(-1);
	} catch (SQLException e) {
		e.printStackTrace();
		System.exit(-1);
	}
}
%>

<%
//清除缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
out.clear();
//接收参数
int level = -1;
String levelStr = request.getParameter("level");
if(levelStr!=null && levelStr.matches("^\\d+$"))
	level = Integer.parseInt(levelStr);

String parentidStr = request.getParameter("parentid");
long parentid = -1;
if(parentidStr!=null && parentidStr.matches("^\\d+$"))
	parentid = Long.parseLong(parentidStr);

//查询数据
if(level<0 && parentid<0)
	return;

if(level>=0 && parentid<0) {
	String sql = "select id,name from china_area where level=? order by id asc;";
	PreparedStatement ps = conn.prepareStatement(sql);
	ps.setInt(1, level);
	ResultSet rs = ps.executeQuery();
	StringBuffer sb = new StringBuffer();
	while (rs.next()) {
		sb.append(";"+rs.getLong("id")+","+rs.getString("name"));
	}
	rs.close();
	ps.close();
	if(sb.length()>0)
		sb.delete(0, 1);
	out.print(sb.toString());
}

if(level<0 && parentid>=0) {
	String sql = "select id,name from china_area where parentid=? order by id asc;";
	PreparedStatement ps = conn.prepareStatement(sql);
	ps.setLong(1, parentid);
	ResultSet rs = ps.executeQuery();
	StringBuffer sb = new StringBuffer();
	while (rs.next()) {
		sb.append(";"+rs.getLong("id")+","+rs.getString("name"));
	}
	rs.close();
	ps.close();
	if(sb.length()>0)
		sb.delete(0, 1);
	out.print(sb.toString());
}

if(level>=0 && parentid>=0) {
	String sql = "select id,name from china_area where level=? and parentid=? order by id asc;";
	PreparedStatement ps = conn.prepareStatement(sql);
	ps.setInt(1, level);
	ps.setLong(2, parentid);
	ResultSet rs = ps.executeQuery();
	StringBuffer sb = new StringBuffer();
	while (rs.next()) {
		sb.append(";"+rs.getLong("id")+","+rs.getString("name"));
	}
	rs.close();
	ps.close();
	if(sb.length()>0)
		sb.delete(0, 1);
	out.print(sb.toString());
}
%>


数据库表结构说明:
jsp查询页面接收parentid和level这2个参数,参数的值如果小于0,则表示没有传这个参数。

level表示行政单位的等级:省/直辖市=1,地级市/盟=2,县级市/旗=3

parentid表示父行政单位的id,父行政单位,也就是管它的那一级,省/直辖市的parentid均为0,其他根据行政规划而定。例如:昌平区的parentid就是北京市的id。

表结构为:

china_area
|
|———id bigint 主键
|———name varchar 地区名
|———level int 级别
|———parentid bigint 父行政单位id
分享到:
评论
5 楼 qq_15138059 2015-07-14  
             
4 楼 从此醉 2014-01-18  
好吧~~~~~~~~
3 楼 MRmicheal 2013-03-26  
大神能把数据导出成一个.sql文件贴出来吗?现在急需这个数据sql文件
2 楼 kong0itey 2011-12-19  
cpszy 写道
lz的数据表结构是什么样的?

已经补充说明了
1 楼 cpszy 2011-12-15  
lz的数据表结构是什么样的?

相关推荐

    省市县三级联动菜单(asp+access).

    省市县三级联动菜单是一种常见的网页交互设计,常用于地理信息选择,例如在填写地址时,用户依次选择省份、城市和县区,这三个选项之间存在层级关系,并且选择上级菜单后,下级菜单会动态更新。在ASP(Active Server...

    纯JS写的省市县三级联动菜单

    这个特定的项目,"纯JS写的省市县三级联动菜单",是一个无需使用AJAX,而是直接连接数据库来实现的功能模块。下面我们将深入探讨这个话题。 首先,我们要理解什么是三级联动菜单。它通常包含三个级别的选项,如在这...

    全国省市县三级联动菜单

    全国 省市县 无刷新 三级联动菜单,可嵌套在任何一种网页语言中使用。

    全国省市区三级联动下拉菜单

    全国省市区三级联动下拉菜单是一种常见的前端交互设计,它在网页或应用程序中用于选择地址时,用户可以依次从省、市、区三个级别的下拉菜单中选择,以实现快速定位。这种设计常见于电子商务、物流配送、信息录入等多...

    C#省市县三级联动菜单选择类

    省市县三级联动菜单选择类 ,你可以把它用到你的COMBOBOX控件中

    蓝木省市县三级联动菜单 v1.0

    "蓝木省市县三级联动菜单 v1.0"作为一个成熟的解决方案,很可能已经考虑到了上述所有方面,并提供了易于集成和自定义的API,让开发者能够快速地在自己的项目中实现这样的功能。使用这个组件,开发者可以避免从零开始...

    全国省市县三级下拉菜单EXCEL文件

    在EXCEL中可以实现全国省市县三级下拉菜单选择数据的实现。

    省市县3级联动菜单(完整数据,绝对好用)

    好!最好!省市县3级联动菜单(完整数据,绝对好用),不刷新页面,轻松搞定!

    javascript省市县三级联动菜单

    javascript省市县三级联动菜单,很好的例子。

    微信小程序-省市县三级联动,带有自定义地区码(源代码+截图)

    微信小程序-省市县三级联动,带有自定义地区码(源代码+截图)微信小程序-省市县三级联动,带有自定义地区码(源代码+截图)微信小程序-省市县三级联动,带有自定义地区码(源代码+截图)微信小程序-省市县三级联动,带有...

    全国省市区三级联动数据表

    全国省市区三级联动数据 香港、澳门、台湾等都有详细的划分,感兴趣的小伙伴可以下载

    asp省市县三级联动,可自行修改 添加信息

    在ASP(Active Server Pages)开发中,省市县三级联动是一种常见的功能,用于在网页上创建交互式的下拉选择框,用户可以选择国家、省份、城市,甚至到县这一级的行政区域。这种功能常见于需要用户填写详细地址的场景...

    省市县三级联动菜单(三级关联菜单)

    省市县关联菜单 三级联动 保证完整省市县三级联动菜单(三级关联菜单)

    省市县三级联动.zip

    在这个“省市县三级联动”压缩包中,包含了一个数据库表和JavaScript实现的代码,旨在帮助开发者快速构建能够动态关联省级、市级和县级数据的功能。 数据库表的设计是关键,通常会有一个表格,包含以下字段: 1. `...

    省市县三级联动excel表

    省市县三级联动和商品类型二级联动excel表

    省市县三级、省市二级联动菜单

    标题中的“省市县三级、省市二级联动菜单”指的是在网页设计中常见的下拉菜单功能,这种功能常用于地理信息选择,如用户填写地址时选择所在省份、城市和区县。这种联动效果意味着当用户在一级菜单(省份)中选择一个...

    全国省市县三级联动数据库文件

    全国省市县三级联动数据库文件是一种常见的数据组织方式,主要用于存储国家、省份、城市以及区县等地理层级信息。这样的数据库设计对于实现地理位置相关的查询、分析和应用非常有用,例如在线地图服务、物流配送、...

    excel全国省市县三级联动

    在Excel中实现全国省市县三级联动是一项常见的数据管理和交互需求,尤其在数据分析、报表制作以及信息录入场景中。这项功能允许用户通过下拉菜单依次选择省份、城市和区县,确保数据的准确性和一致性。接下来,我们...

    基于mui写的H5移动端全国地区三级联动菜单

    标题中的“基于mui写的H5移动端全国地区三级联动菜单”是指使用mui框架开发的一个适用于移动设备的HTML5页面,该页面包含一个具有三级结构的地区选择菜单。这个菜单设计能够帮助用户快速、方便地选择他们所在的省份...

    jquery省市区三级联动下拉菜单_select三级联动下拉菜单

    jquery省市区三级联动下拉菜单_select三级联动下拉菜单 jquery省市区三级联动下拉菜单_select三级联动下拉菜单 jquery省市区三级联动下拉菜单_select三级联动下拉菜单 jquery省市区三级联动下拉菜单_select三级联动...

Global site tag (gtag.js) - Google Analytics