Jquery级联下拉菜单
注释:
该方法是一个通用方法,不局限多少级,无限级都可以,该示例演示新建页,和编辑页面不同的调用。
新建页面时需要初始化第一个select。编辑页面无需初始化。返回json时,后台对象做过一次简单处理,把pojo的list转换为Object list,object中只有两个属性id、name。然后再toJson,返回view。
按照调用的先后顺序贴代码,如下:
新建页面代码:
<select name="categoryid1" id="categoryid1" class="required">
<option value=""></option>
</select>
<select name="categoryid2" id="categoryid2" class="required">
</select>
<select name="categoryid3" id="categoryid3" class="required">
</select>
<select name="categoryid4" id="categoryid4" class="required">
</select>
<script type="text/javascript">
/* 初始化第一个下拉框数据 */
setSelect('0','categoryid1','getCaseCategory.htm');
$(function() {
$("#categoryid1").change(function(){
$("#dynamic_html").hide();
onSelectChange($(this),'categoryid2','getCaseCategory.htm');
});
$("#categoryid2").change(function(){
onSelectChange($(this),'categoryid3','getCaseCategory.htm');
});
$("#categoryid3").change(function(){
onSelectChange($(this),'categoryid4','getCaseCategory.htm');
});
});
</script>
JS代码:
/*
* 基JQuery自动创建级联下拉菜单,动态ajax请求后台数据,
参数:下拉框变更的时候获取当前 对象、标识、url
如果是新建页面,需要直接调用该方法,obj=0或者是指定的根节点id,后台代码判断如果=0或者根节点id,直接查询,其它则会子级的,要根据ID获取下级数据,页面需要单独调用onSelectChange();如果是编辑页面则不需要直接调用
*/
function onSelectChange(obj,toSelId,urlStr){
if(obj.val() != null && obj.val() !="" && obj.val().length>0){
setSelect(obj.val(),toSelId,urlStr);
}else{
$("#" + toSelId).empty();//如果选择项为空时,当前控件清空
$("#" + toSelId).nextAll('select').empty()//如果选择项为空时,当前控件的子级全部清空
obj.nextAll('select').hide();
}
}
//请求后台获取数据
function setSelect(parentId,toSelId,urlStr,selectedId){
jQuery.ajax({
type: "POST",
url: urlStr,
async: false,
cache: false,
data:"parentid="+parentId,
success: function(data){
createSelectObj(data,toSelId,selectedId);
},
error:function(data){
window.location.href = "/ecs/index.html";
}
});
}
//根据已获取数据动态构建select控件
function createSelectObj(data,toSelId,selectedId){
var arr = jsonParse(data);
var obj = document.getElementById(toSelId);
if(arr != null && arr !="" && arr.length>0){
initSelectObj(obj,toSelId);
for(var i = 0; i < arr.length ; i++){
var op = document.createElement("option");
op.setAttribute("value",arr[i].id);
if(selectedId == arr[i].id){
op.setAttribute("selected","selected");
}
op.appendChild(document.createTextNode(arr[i].name));
obj.appendChild(op);
}
$("#" + toSelId).nextAll('select').hide();
$("#" + toSelId).show();
$("#" + toSelId).nextAll('select').empty();//清空所有子级select控件,否则当重新选择的时候,上次选择的子级值只是被隐藏,但值依旧存在,依然会被保存。
}else{//如果当前节点下没有子节点了,那么就把下一个select置空
$("#" + toSelId).nextAll('select').hide();
$("#" + toSelId).hide();
$("#" + toSelId).nextAll('select').empty();
initSelectObj(obj,toSelId);
}
}
//初始化指定id的select控件
function initSelectObj(obj,toSelId){
obj.innerHTML="";
var nullOp = document.createElement("option");
nullOp.setAttribute("value","");
nullOp.appendChild(document.createTextNode(""));
obj.appendChild(nullOp);
}
新建页面请求的后台代码:
@RequestMapping(value = {"/getCaseCategory.htm"})
public String getCaseCategory(ModelMap model,HttpServletRequest req, Integer parentId){
/*String parentId=req.getParameter("parentId");//获取父级ID */
log.info("获取服务类型,父id="+parentId);
/*List<SelectObj> sList = selectObjService.findCategorySelectObjListByParentId(Integer.parseInt(parentId));*/
List<SelectObj> sList = selectObjService.findCategorySelectObjListByParentId(parentId);
JSONArray jsonArray = JSONArray.fromObject(sList);
log.info("通过父id:"+parentId+"获取下级服务类型:"+jsonArray);
model.put("data", jsonArray);
return "json";
}
编辑页代码:
<select name="categoryid1" id="categoryid1" disabled="disabled"><option value=""></option>
#foreach($c1 in $c1List)
#if($!{c1.id} == $!case.categoryid1)
<option value="$!{c1.id}" selected="selected">$!{c1.name}</option>
#else
<option value="$!{c1.id}">$!{c1.name}</option>
#end
#end
</select>
#if(!$case.categoryid2.isNull() && ${case.categoryid2} && $!{case.categoryid2}!="0")
<select name="categoryid2" id="categoryid2" disabled="disabled">
<option value=""></option>
#foreach($c2 in $c2List)
#if($!{c2.id} == $!case.categoryid2)
<option value="$!{c2.id}" selected="selected">$!{c2.name}</option>
#else
<option value="$!{c2.id}">$!{c2.name}</option>
#end
#end
</select>
#end
#if(!$case.categoryid3.isNull() && ${case.categoryid3} && $!{case.categoryid3}!="0")
<select name="categoryid3" id="categoryid3" disabled="disabled">
<option value=""></option>
#foreach($c3 in $c3List)
#if($!{c3.id} == $!case.categoryid3)
<option value="$!{c3.id}" selected="selected">$!{c3.name}</option>
#else
<option value="$!{c3.id}">$!{c3.name}</option>
#end
#end
</select>
#end
#if(!$case.categoryid4.isNull() && ${case.categoryid4} && $!{case.categoryid4}!="0")
<select name="categoryid4" id="categoryid4" disabled="disabled">
<option value=""></option>
#foreach($c4 in $c4List)
#if($!{c4.id} == $!case.categoryid4)
<option value="$!{c4.id}" selected="selected">$!{c4.name}</option>
#else
<option value="$!{c4.id}">$!{c4.name}</option>
#end
#end
</select>
#end
编辑页调用的JS,也是上面的JS,只是在编辑页面使用时不需要初始化第一个select。