分享

省市县三级联动菜单

 dabinglibrary 2014-11-03
联动菜单代码 
Javascript代码  收藏代码
  1. /* 
  2.  * 这是一个省市县级联的选择器采用ajax的方式来调用数据源 
  3.  * ajax页面接收2个参数,level和parentid,这2个参数作为查询条件 
  4.  * 其中level代表地区等级,1=省,2=市,3=县 
  5.  * 另一个参数parentid代表要查询的地区的父级地区 
  6.  * ajax取到的结果是字符串序列(例如:235,潮州市;236,东莞市;237,佛山市;238) 
  7.  *  
  8.  */  
  9.   
  10. function AreaPicker(config) {  
  11.     /* 
  12.      * 私有属性 
  13.      */  
  14.     var provId = "#" + config.provId;  
  15.     var cityId = "#" + config.cityId;  
  16.     var townId = "#" + config.townId;  
  17.     var provDefStr = config.provDefStr? config.provDefStr : "请选择省份";  
  18.     var cityDefStr = config.cityDefStr? config.cityDefStr : "请选择地区";  
  19.     var townDefStr = config.townDefStr? config.townDefStr : "请选择县市";  
  20.     var loadingStr = config.loadingStr? config.loadingStr : "正在加载...";  
  21.     var asynSrc = config.url;  
  22.     var asynTimeout = config.timeout ?config.timeout : 5000;  
  23.     var asynMethod = config.method? config.method : "post";  
  24.     var asynCache = config.cache? config.cache : false;  
  25.       
  26.       
  27.       
  28.       
  29.       
  30.     /** 
  31.      * 私有方法,作用是初始化选择器的三个下拉框 
  32.      *  
  33.      * @param pct 
  34.      *            参数(p=省,c=地,t=县) 
  35.      */  
  36.     var initSelect = function(pct) {  
  37.         if (pct.indexOf("p") >= 0) {  
  38.             $(provId).html("<option value=\"\">" + provDefStr + "</option>");  
  39.             $(provId).show();  
  40.         }  
  41.         if (pct.indexOf("c") >= 0){  
  42.             $(cityId).html("<option value=\"\">" + cityDefStr + "</option>");  
  43.             $(cityId).show();  
  44.         }  
  45.         if (pct.indexOf("t") >= 0){  
  46.             $(townId).html("<option value=\"\">" + townDefStr + "</option>");  
  47.             $(townId).show();  
  48.         }  
  49.     }  
  50.   
  51.       
  52.       
  53.       
  54.     /** 
  55.      * 私有方法,作用是从数据源页面异步读取地区信息,根据objId,填充到相应的select中 
  56.      *  
  57.      * @param objId 
  58.      *            用来装查询结果的下拉框对象的id 
  59.      * @param param 
  60.      *            传送给数据源页面的参数,格式为{param:1,level:1} 
  61.      * @returns 数据源页面的输出内容(例如:235,潮州市;236,东莞市;237,佛山市;238) 
  62.      */  
  63.     var asynGetArea = function(objId, param,listeners) {  
  64.         //发送ajax之前  
  65.         var bef = function() {  
  66.             $(objId).html("<option value=\"\">"+loadingStr+"</option>");  
  67.         }  
  68.         //发送ajax之后并且服务器返回成功  
  69.         var succ = function(code) {  
  70.             if (!code || $.trim(code).length==0) {  
  71.                 $(objId).hide();  
  72.                 return;  
  73.             }  
  74.             var htmlCode = "";  
  75.             var tempArray = code.split(";");  
  76.             for ( var i = 0; i < tempArray.length; i++) {  
  77.                 var tempArray1 = tempArray[i].split(",");  
  78.                 var id = tempArray1.length >= 1 ? tempArray1[0] : null;  
  79.                 var name = tempArray1.length >= 2 ? tempArray1[1] : null;  
  80.                 htmlCode += "<option value=\"" + id + "\">" + name + "</option>\n";  
  81.             }  
  82.             $(objId).html(htmlCode);  
  83.         }  
  84.         //success方法的包裹方法,用于实现事件监听  
  85.         var successWarpper = function(data) {  
  86.             var befSuccessListener = listeners?listeners.befSuccessListener:null;  
  87.             if(befSuccessListener && (typeof befSuccessListener=="function"))  
  88.                 befSuccessListener();  
  89.             succ(data);  
  90.             var aftSuccessListener = listeners?listeners.aftSuccessListener:null;  
  91.             if(aftSuccessListener && (typeof aftSuccessListener=="function"))  
  92.                 aftSuccessListener();  
  93.         }  
  94.         //发送ajax之后并且状态错误  
  95.         var err = function(e1, e2) {  
  96.             $(objId).html("<option value=\"\">加载失败: " + e1 + "," + e2 + "</option>");  
  97.         }  
  98.         //ajax各种配置项  
  99.         var asynConfig = {  
  100.             type : asynMethod,  
  101.             cache : asynCache,  
  102.             url : asynSrc,  
  103.             data : param,  
  104.             timeout : asynTimeout,  
  105.             beforeSend : bef,  
  106.             success : successWarpper,  
  107.             error : err  
  108.         };  
  109.         //发出请求  
  110.         $.ajax(asynConfig);  
  111.     }  
  112.   
  113.       
  114.       
  115.       
  116.     /** 
  117.      * 绑定下拉列表的change和focus事件,用来实现联动效果 
  118.      */  
  119.     var bindSelect = function() {  
  120.         //省份下拉框改变事件的处理函数  
  121.         var provChange = function() {  
  122.             initSelect("ct");  
  123.             var selectVal = $(provId).val();  
  124.             var listeners = {aftSuccessListener:function(){  
  125.                 cityChange();  
  126.             }};  
  127.             if (selectVal)  
  128.                 asynGetArea(cityId, {  
  129.                     level : -1,  
  130.                     parentid : selectVal  
  131.                 },listeners);  
  132.         }  
  133.         //城市下拉框改变事件的处理函数  
  134.         var cityChange = function() {  
  135.             initSelect("t");  
  136.             var selectVal = $(cityId).val();  
  137.             if (selectVal)  
  138.                 asynGetArea(townId, {  
  139.                     level : -1,  
  140.                     parentid : selectVal  
  141.                 });  
  142.         }  
  143.         //绑定地级下拉框获得焦点事件  
  144.         var cityFocus = function() {  
  145.             if ($(cityId + " option").length > 0 && $(cityId).val())  
  146.                 return;  
  147.             provChange();  
  148.         }  
  149.         //绑定县市下拉框获得焦点事件  
  150.         var townFocus = function() {  
  151.             if ($(townId + " option").length > 0 && $(townId).val())  
  152.                 return;  
  153.             cityChange();  
  154.         }  
  155.         //绑定各个事件  
  156.         $(provId).change(provChange);  
  157.         $(cityId).change(cityChange);  
  158.         $(cityId).focus(cityFocus);  
  159.         $(townId).focus(townFocus);  
  160.     }  
  161.   
  162.       
  163.       
  164.       
  165.     /** 
  166.      * 公有方法,用来初始化地区选择器,暴露给外部调用的入口 
  167.      */  
  168.     return {  
  169.         pick : function() {  
  170.             initSelect("pct");  
  171.             asynGetArea(provId, {  
  172.                 level : 1,  
  173.                 parentid : -1  
  174.             });  
  175.             bindSelect();  
  176.         }  
  177.     }  
  178. }  





调用方式 
Javascript代码  收藏代码
  1. $(function() {  
  2.     var areaPicker = new AreaPicker({provId:"province",cityId:"city",townId:"town",url:"ajax_search_area.jsp"});  
  3.     areaPicker.pick();  
  4. });  

Html代码  收藏代码
  1. <select id="province"></select>  
  2. <select id="city"></select>  
  3. <select id="town"></select>  






ajax页面(数据源) 
Java代码  收藏代码
  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <%@page import="java.sql.*"%>  
  3.   
  4. <%!  
  5. private static Connection conn;  
  6. private static String driver = "com.mysql.jdbc.Driver"// 数据库驱动  
  7. private static String ulr = "jdbc:mysql://172.16.1.115:3306/test";  
  8. private static String username = "root"// 数据库的用户名  
  9. private static String pwd = "root";// 数据库的密码  
  10.   
  11. static {  
  12.     try {  
  13.         Class.forName(driver);  
  14.         conn = DriverManager.getConnection(ulr, username, pwd);  
  15.         conn.setAutoCommit(false);  
  16.     } catch (ClassNotFoundException e) {  
  17.         e.printStackTrace();  
  18.         System.exit(-1);  
  19.     } catch (SQLException e) {  
  20.         e.printStackTrace();  
  21.         System.exit(-1);  
  22.     }  
  23. }  
  24. %>  
  25.   
  26. <%  
  27. //清除缓存  
  28. response.setHeader("Pragma","No-cache");  
  29. response.setHeader("Cache-Control","no-cache");  
  30. response.setDateHeader("Expires"0);  
  31. out.clear();  
  32. //接收参数  
  33. int level = -1;  
  34. String levelStr = request.getParameter("level");  
  35. if(levelStr!=null && levelStr.matches("^\\d+$"))  
  36.     level = Integer.parseInt(levelStr);  
  37.   
  38. String parentidStr = request.getParameter("parentid");  
  39. long parentid = -1;  
  40. if(parentidStr!=null && parentidStr.matches("^\\d+$"))  
  41.     parentid = Long.parseLong(parentidStr);  
  42.   
  43. //查询数据  
  44. if(level<0 && parentid<0)  
  45.     return;  
  46.   
  47. if(level>=0 && parentid<0) {  
  48.     String sql = "select id,name from china_area where level=? order by id asc;";  
  49.     PreparedStatement ps = conn.prepareStatement(sql);  
  50.     ps.setInt(1, level);  
  51.     ResultSet rs = ps.executeQuery();  
  52.     StringBuffer sb = new StringBuffer();  
  53.     while (rs.next()) {  
  54.         sb.append(";"+rs.getLong("id")+","+rs.getString("name"));  
  55.     }  
  56.     rs.close();  
  57.     ps.close();  
  58.     if(sb.length()>0)  
  59.         sb.delete(01);  
  60.     out.print(sb.toString());  
  61. }  
  62.   
  63. if(level<0 && parentid>=0) {  
  64.     String sql = "select id,name from china_area where parentid=? order by id asc;";  
  65.     PreparedStatement ps = conn.prepareStatement(sql);  
  66.     ps.setLong(1, parentid);  
  67.     ResultSet rs = ps.executeQuery();  
  68.     StringBuffer sb = new StringBuffer();  
  69.     while (rs.next()) {  
  70.         sb.append(";"+rs.getLong("id")+","+rs.getString("name"));  
  71.     }  
  72.     rs.close();  
  73.     ps.close();  
  74.     if(sb.length()>0)  
  75.         sb.delete(01);  
  76.     out.print(sb.toString());  
  77. }  
  78.   
  79. if(level>=0 && parentid>=0) {  
  80.     String sql = "select id,name from china_area where level=? and parentid=? order by id asc;";  
  81.     PreparedStatement ps = conn.prepareStatement(sql);  
  82.     ps.setInt(1, level);  
  83.     ps.setLong(2, parentid);  
  84.     ResultSet rs = ps.executeQuery();  
  85.     StringBuffer sb = new StringBuffer();  
  86.     while (rs.next()) {  
  87.         sb.append(";"+rs.getLong("id")+","+rs.getString("name"));  
  88.     }  
  89.     rs.close();  
  90.     ps.close();  
  91.     if(sb.length()>0)  
  92.         sb.delete(01);  
  93.     out.print(sb.toString());  
  94. }  
  95. %>  


数据库表结构说明: 
Html代码  收藏代码
  1. jsp查询页面接收parentid和level这2个参数,参数的值如果小于0,则表示没有传这个参数。  
  2.   
  3. level表示行政单位的等级:省/直辖市=1,地级市/盟=2,县级市/旗=3  
  4.   
  5. parentid表示父行政单位的id,父行政单位,也就是管它的那一级,省/直辖市的parentid均为0,其他根据行政规划而定。例如:昌平区的parentid就是北京市的id。  
  6.   
  7. 表结构为:  
  8.   
  9. china_area  
  10. |  
  11. |———id bigint 主键  
  12. |———name varchar 地区名  
  13. |———level int 级别  
  14. |———parentid bigint 父行政单位id 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约