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

  代码可以优化,请根据自己需求进行优化

  说明:

  所先把所有分类读取存放到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>

  运行后结果

  

   [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

  数据库:

关于无限分级(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)

  %>