大量的数据需要用树形结构展现时,无限级树就派上用场了。在没有Ajax与Dhtml的时代,无限级树是个麻烦事儿,几乎统一的做法是一次把所有数据都读取出来,再用table表现,数据量大并且结构复杂,结果是一棵树变得相当笨重。有了Ajax后,数据分批读取,结构使用优化的ul列表,再结合css定义ul的margin-left,轻松就能完成一棵树。下面的例子使用“下拉级联”的省市数据。数据在页面作了局部缓存,第一次展开某枝节获取数据后,第二次再展开该枝节,将使用缓存数据。
function loadData(id,obj){
if (obj.innerHTML == "-"){
if (obj.parentNode.getElementsByTagName("ul").length>0){
$(obj.parentNode.getElementsByTagName("ul")[0]).hide(); //如果下级有数据,则收起下级节点
obj.innerHTML = "+";
}
return;
}
if (id!=0 && obj.parentNode.getElementsByTagName("ul").length>0){
$(obj.parentNode.getElementsByTagName("ul")[0]).show(); //如果下级有数据,则展开节点,不再去服务端取数据,即使用缓存数据
obj.innerHTML = "-";
return;
}
//获取下级节点数据
var myAjax = new Ajax.Request(
"data.asp",
{
setRequestHeader:{"If-Modified-Since":"0"},
parameters:"id="+id,
onComplete:function(x){
eval("var arr="+x.responseText);
var html = new StringBuffer();
for (var i=0,j; j=arr[i]; i++){
html.append("+"+$D(j["name"])+"");
}
if (id==0){
$(obj).innerHTML = html.toString();
}else{
obj.innerHTML=="+" ? obj.innerHTML = "-" : obj.innerHTML = "+";
if (html.length()>0){ //如果下级有数据,则添加进来
var ul = document.createElement("ul");
ul.innerHTML = html.toString();
obj.parentNode.appendChild(ul);
}
}
}
}
);
}