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>
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和文本节点;
原文:http://blog.csdn.net/liangwenmail/article/details/47176319