用ajax做省市联动案例
昨晚做省市联动的案例做到无法自拔,凌晨两点才结束,今早上补发一篇关于省市联动的案例
先贴上页面代码,jsp+javascript
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 <title>My JSP 'index.jsp' starting page</title> 12 <meta http-equiv="pragma" content="no-cache"> 13 <meta http-equiv="cache-control" content="no-cache"> 14 <meta http-equiv="expires" content="0"> 15 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 16 <meta http-equiv="description" content="This is my page"> 17 <!-- 18 <link rel="stylesheet" type="text/css" href="styles.css"> 19 --> 20 </head> 21 <script type="text/javascript"> 22 function createXMLHttpRequest() { 23 var xmlHttp; 24 // 适用于大多数浏览器,以及IE7和IE更高版本 25 try { 26 xmlHttp = new XMLHttpRequest(); 27 } catch (e) { 28 // 适用于IE6 29 try { 30 xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); 31 } catch (e) { 32 // 适用于IE5.5,以及IE更早版本 33 try { 34 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 35 } catch (e) { 36 } 37 } 38 } 39 return xmlHttp; 40 } 41 function pchange() 42 { 43 var pro= document.getElementById("province"); 44 var index= pro.selectedIndex ; // selectedIndex代表的是你所选中项的index 45 var pros= pro.options[index].value; // 选中值 46 var xmlHttp = createXMLHttpRequest(); 47 xmlHttp.open("post", "/shengshiliandong/servlet/cityServlet", true); 48 xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");//post方式独有的需要设置请求头 49 xmlHttp.send("pros="+pros);//发送省份值 50 xmlHttp.onreadystatechange=function(){ 51 if(xmlHttp.readyState == 4 && xmlHttp.status == 200) { 52 var city= xmlHttp.responseText;//获取city json串 53 var citys= eval("("+city+")");//取得city对象 54 var citySel=document.getElementById("city"); 55 citySel.options.length=0; //删除先前的option,使option数量为0 56 var i=0; //定义对象元素个数 57 for( i in citys);//遍历json对象,获取元素个数 58 for(var j=0;j<=i;j++) 59 { 60 citySel.options.add(new Option(citys[j].cityName,"")); //添加option,这个兼容IE与firefox 61 } 62 } 63 }; 64 } 65 </script> 66 <body> 67 This is my 省市联动 page. <br> 68 <select id="province" name="provinces" onchange="pchange()"> 69 <option>请选择</option> 70 <option value="beijing">北京市</option> 71 <option value="tianjin">天津市</option> 72 <option value="shanghai">上海市</option> 73 <option value="guangdong">广东省</option> 74 </select> 75 <select id="city" name="citys"> 76 <option>请选择</option> 77 </select> 78 </body> 79 </html>
我选择了北京,天津,上海,广东做案例,选择省份的select就只有这几个,重点说说js代码
首先是一个ajax大框架摆出来,添加进select对象内容改变事件 function pchange() ,内容一旦改变,拿到XMLHttpRequest 实例,然后打开链接,因为有参数传入servlet,所以使用post方式,需要设置请求头 xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 这是固定格式,然后用省份的select对象拿到option的value,用下面一段代码
var pro= document.getElementById("province"); var index= pro.selectedIndex ; // selectedIndex代表的是你所选中项的index var pros= pro.options[index].value; // 选中值
用 xmlHttp.send("pros="+pros); 发送省份值,到时候servlet就可以用pros这个关键字获取参数,当servlet处理完毕会发送回一个字符串,准确来说是json串,json串是这个样子的有多个city对象
其实这就是一个数组,当我想拿到第二个(城西区)的对象的时候,用 citys[j] 拿到城市名则用 citys[j].cityName ,下一步是清除所有option,避免积累
citySel.options.length=0; //删除先前的option,使option数量为0
如果想留下“请选择”这一项就把0换成1;
有一个我没见过的很有趣的小东西,可以遍历一个对象,获取里面有几个元素
var i=0; //定义对象元素个数 for( i in citys);//遍历json对象,获取元素个数
拿到i之后就可以用for添加option了
for(var j=0;j<=i;j++) { citySel.options.add(new Option(citys[j].cityName,"")); //添加option,这个兼容IE与firefox }
刚才试了一下,可以把获取元素个数和添加option合并
var i=0; //定义对象元素个数 for( i in citys)//遍历json对象,获取元素个数 { citySel.options.add(new Option(citys[i].cityName,"")); //添加option,这个兼容IE与firefox }
不过for里面是alert(message)的话好像不太好使,不知道为什么,希望有大神帮我解答一下
==========================================================哥哥割割割咯咯咯咯咯咯咯=======================================================
下面按贴出servlet代码
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //防止乱码 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); //获取省份值,传入proToCity处理 String province= request.getParameter("pros"); String cJson=proToCity.pTC(province); // 把返回的json串传回js out.print(cJson); }
上面按的注释也说的挺明白了,先是两行防乱码,然后传省份值进dao,出来一个字符串(json)串,然后传回js,没了
==========================================================哥哥割割割咯咯咯咯咯咯咯=======================================================
javabean对象
public class city { String cityName; public city(String cityName) { super(); this.cityName = cityName; } public String getCityName() { return cityName; } public void setCityName(String cityName) { this.cityName = cityName; } }
==========================================================哥哥割割割咯咯咯咯咯咯咯=======================================================
封装json串
public class makeJson { public String makeBeiJingJson() { JSONArray clist=new JSONArray(); clist.add(new city("城东区")); clist.add(new city("城西区")); clist.add(new city("朝阳区")); clist.add(new city("丰台区")); clist.add(new city("石景山区")); clist.add(new city("海淀区")); clist.add(new city("顺义区")); clist.add(new city("通州区")); clist.add(new city("房山区")); clist.add(new city("昌平区")); clist.add(new city("密云区")); return clist.toString(); } public String makeTianJinJson() { JSONArray clist=new JSONArray(); clist.add(new city("南开区")); clist.add(new city("和平区")); clist.add(new city("东丽区")); clist.add(new city("河北区")); clist.add(new city("河西区")); clist.add(new city("北辰区")); clist.add(new city("红桥区")); clist.add(new city("津南区")); clist.add(new city("滨海新区")); clist.add(new city("武清区")); clist.add(new city("静海区")); return clist.toString(); } public String makeShangHaiJson() { JSONArray clist=new JSONArray(); clist.add(new city("黄浦区")); clist.add(new city("长宁区")); clist.add(new city("徐汇区")); clist.add(new city("浦东新区")); clist.add(new city("杨浦区")); clist.add(new city("静安区")); clist.add(new city("宝山区")); clist.add(new city("金山区")); clist.add(new city("嘉定区")); clist.add(new city("青山区")); clist.add(new city("松浦区")); return clist.toString(); } public String makeGuangDongJson() { JSONArray clist=new JSONArray(); clist.add(new city("广州市")); clist.add(new city("中山市")); clist.add(new city("深圳市")); clist.add(new city("东莞市")); clist.add(new city("肇庆市")); clist.add(new city("汕头市")); clist.add(new city("惠州市")); clist.add(new city("珠海市")); clist.add(new city("江门市")); clist.add(new city("佛山市")); clist.add(new city("湛江市")); return clist.toString(); }
没啥好说的,都是体力活
==========================================================哥哥割割割咯咯咯咯咯咯咯=======================================================
判断省份并返回json串
public class proToCity { /** * * @param pro 用来判断使哪个省份,从而决定调用那个函数传回json串 * @return 返回json串 */ public static String pTC(String pro ) { makeJson mJson=new makeJson(); if("beijing".equals(pro)) { return mJson.makeBeiJingJson(); }else if("tianjin".equals(pro)) { return mJson.makeTianJinJson(); }else if("shanghai".equals(pro)) { return mJson.makeShangHaiJson(); }else if("guangdong".equals(pro)) { return mJson.makeGuangDongJson(); }else { return null; } } }
到这里整个代码基本就结束了
主要的几个不懂得点在这里在汇总一下:
1、获取选中的option
var pro= document.getElementById("province"); var index= pro.selectedIndex ; // selectedIndex代表的是你所选中项的index var pros= pro.options[index].value; // 选中值
2、删除option
citySel.options.length=1; //删除先前的option,使option数量为1
3、添加option
citySel.options.add(new Option(citys[i].cityName,"")); //添加option
可以添加text和value
4、解决乱码
//防止乱码 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8");
5、
var i=0; //定义对象元素个数 for( i in citys)//遍历json对象,获取元素个数
最后问一句...这么长的文章叫做随笔?