码迷,mamicode.com
首页 > Web开发 > 详细

ajax实现级联下拉菜单

时间:2015-07-31 23:35:50      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:javascript   级联菜单   ajax   

ajax实现级联下拉菜单非常简单,下面是一个用ajax实现的省市级联的下拉菜单;

 jsp中在<select>中添加onchange事件,触发该事件调用实现ajax的js:

<div>
	<form action="Pcs" method="post">
		所在省:<select name="pro" id="pro" onchange="chCity();">
				<option>--请选择--</option>
				<option value="beijing">北京市</option>
				<option value="shandong">山东省</option>
				<option value="hebei">河北省</option>				
			 </select>      
		所在市:<select name="cit" id="cit">
				<option>--请选择--</option>				
			 </select><br>
					
	</form>
</div>

正常的下拉菜单选项是在数据库取出来的,为了方便,我把省直接写在里面;所在市除了“选择”目前没有实际的option;


 js中实现ajax:

function chCity(){
	var pro=document.all("pro").value;	
	if(window.XmlHttpRequest){
		xmlHttpRequest=new XmlHttpRequest();
	}else{
		xmlHttpRequest=new ActiveXObject("Microsoft.XMLHTTP");
	}	
	xmlHttpRequest.onreadystatechange=callBack;
	var url="Pcs";
	xmlHttpRequest.open("post",url,true);
	xmlHttpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");
	xmlHttpRequest.send("pro="+pro+"&timeStamp="+(new Date()).getTime());	
}
//回调函数
function callBack(){
	
	if(xmlHttpRequest.readyState==4 && xmlHttpRequest.status==200){	
		var result=xmlHttpRequest.responseText;
		result=result.replace(/(^\s*)|(\s*$)/g, "");
		var city=result.split("|");
		
		var citySelect=document.all("cit");
	
		for(var i=citySelect.options.length-1;i>=0;i--){
			
			citySelect.options.remove(i);
		}
		for(var i=0;i<city.length;i++){
			var vn=city[i].split(",");
			var cvalue=vn[0];
			var cname=vn[1];
			var opt=document.createElement("option");
			citySelect.options.add(opt);
			opt.value=cvalue;
			opt.innerHTML=cname;
		}
	}
}

说明:

document.all("pro").value,根据name或id取值,这里用来获取select选项的value值;

把选择的option的value通过ajax提交到后台,先不看回调函数;


后台java程序:

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class Pcs extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.equals("utf-8");
		response.setCharacterEncoding("utf-8");
		String pro=request.getParameter("pro");		
		String cities="";
		if(pro.equalsIgnoreCase("beijing")){
			cities="haidian,海淀|changping,昌平|chaoyang,朝阳";
		}else if(pro.equalsIgnoreCase("shandong")){
			cities="jinan,济南|dezhou,德州|qingdao,青岛";
		}else if(pro.equalsIgnoreCase("hebei")){
			cities="shijiazhuang,石家庄|langfang,廊坊|xingtai,邢台";
		}else{
			cities=",--请选择--";
		}
		PrintWriter out=response.getWriter();
		out.print(cities);
		out.flush();
		out.close();

		
	}
	
	
}

说明:

正常的市是根据省在数据库查询出来的,为了方便我直接写在了字符串中;

在回调函数中我返回的是有一定格式的字符串,再在回调函数里用split分割;

注意最后一个else不能省掉,不然会在市里可能出现undefinded;



关于回调函数的说明:

var citySelect=document.all("cit");拿到市的select对象;

citySelect.options得到所有option对象,从后向前循环删掉option(因为这是我前一个选择出来的市,换了省市就得换);

var city=result.split("|");获取所有市(option的value,option的文本子节点),进行遍历;

var vn=city[i].split(",");
var cvalue=vn[0];
var cname=vn[1]; 获取option的value和文本节点

创建元素节点 option,并为select加子节点;

给option加value和文本节点;




ajax实现级联下拉菜单

标签:javascript   级联菜单   ajax   

原文地址:http://blog.csdn.net/liangwenmail/article/details/47176319

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!