关于无限分级(ASP+数据库+JS)的实现代码

时间:2021-11-02 01:42:42

代码可以优化,请根据自己需求进行优化  
说明: 
所先把所有分类读取存放到JS数组中(如果数据量大可能就有点麻烦) 
当选择时候返回父分类ID 在从数组中找出符合的分类,然后显示给用户 
数据库设计(可以根据自己需求添加字段,如此分类属于什么分类等等) 
字段            类型          说明 
id               自动编号     记录编号 
cotename    文本           分类名称 
byid            数字           父分类ID(即为此表ID,根接点时值为0) 

JS部分代码(命名为*.asp) 

复制代码代码如下:


<%Dim conn 
Set conn=Server.CreateObject("ADODB.Connection") 
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
"Data Source=" & Server.MapPath("Cote.mdb") 
conn.Open 
%> 

function CheckLm(thevalue){ 
  var byid=new Array(); 
  var cotename=new Array(); 
  var id=new Array(); 
  var i; 
  var id_s; 
  var byid_s; 
  var cotename_s; 
  var thevalue_r;  
  var data='<select name="lm" onchange="CheckLm(this.value)">' 
  id_s="|"; 
  cotename_s='-选择-|'; 
  <%set rs=server.CreateObject("adodb.recordset") 
     sql="select * from [DB_Cote] Order by byid,id" 
    rs.open sql,conn,1,1 
      i=0 
   if not rs.eof then 
     do while not rs.eof  
       response.Write("id["&i&"]="&rs("id")&";"&chr(10)) 
    response.Write("byid["&i&"]="&rs("byid")&";"&chr(10)) 
    response.Write("cotename["&i&"]='"&rs("cotename")&"';"&chr(10)) 
     rs.movenext 
     i=i+1 
     loop 
   else 
     response.Write("id[0]=0;byid[0]=0;cotename[0]='无分类';") 
   end if 
   rs.close 
  set rs=nothing%> 
  if(thevalue==null||thevalue==undefined||thevalue==''){thevalue=0;} 
  //if(lmvalue==null||lmvalue==undefined||lmvalue==''){lmvalue=0;} 
    for(k=0;k<id.length;k++){ 
      if(thevalue==id[k]){id_s+=thevalue+"|";cotename_s+=cotename[k]+"|";thevalue_r=byid[k];break;}else{thevalue_r=0;} 
    } 
   for(i=0;i<id.length;i++){ 
     if(thevalue==byid[i]){ 
    id_s+=id[i]+"|";cotename_s+=cotename[i]+"|"; 
    }  
   } 
   if(id_s=='-1|'){ 
      for(i=0;i<id.length;i++){ 
     if(thevalue==id[i]){ 
  id_s+=id[i]+"|";cotename_s+=cotename[i]+"|"; 
  }  
   }  
    } 
  id_v=id_s.split("|"); 
  cotename_v=cotename_s.split("|"); 
  var length=id_v.length-1;   
  for(j=0;j<length;j++){ 
    if(thevalue==id_v[j]){ 
    data+="<option value='"+id_v[j]+"' selected>"+cotename_v[j]+"</option>";} 
    else{ 
    data+="<option value='"+id_v[j]+"'>"+cotename_v[j]+"</option>"; 
    } 
   } 
  if(thevalue!=0){data+="<option value='"+thevalue_r+"'>上级分类</option>";} 
 //alert(length+'/'+thevalue); 
    var lm=document.getElementById('lmid'); 
 lm.innerHTML=data+"</select>"; 

<%Conn.Close:Set Conn=Nothing%> 


调用页面代码

复制代码代码如下:


<% 
Dim lm 
lm=request("lm") 
if lm=Empyt or Not Isnumeric(lm) then lm=0 
%> 
<html> 
<script type="text/javascript" src="*.asp"></script> 
<body onLoad="CheckLm(<%=lm%>)"> 
<div id="lmid"></div> 
</body> 
</html>


运行后结果  

数据库:

关于无限分级(ASP+数据库+JS)的实现代码

递归 

复制代码代码如下:


Sub GetA(TheID) 

set rs=server.CreateObject("adodb.recordset") 
dim rs,sql 
     sql="select * from [DB_Cote] Where ByID in("&TheID&")" 
    rs.open sql,conn,1,1 
      i=0 
   if not rs.eof then 
     do while not rs.eof  
       response.Write(rs("cotename")&"<br>") 
    call GetA(Rs("id")) 
     rs.movenext 
     i=i+1 
     loop    
   end if 
   rs.close 
  set rs=nothing 

End Sub 

if m=empty then m=0 
call GetA(m) 
%>