Javascript无限分类算法的实现(转)

(来自: http://www.pconline.com.cn/pcedu/empolder/wz/javascript/0510/710147.html

 通过asp 动态生成 js 的数组,然后js在客户端去排列,最大的减少了服务器端的压力。(服务器端只是查询了一次,没有其他操作)

数据库设计:

  id: 索引,自动编号
  mc: varchar 100字节,记录分类名称
  fl: 数字,记录属于哪个分类,0为根分类
  ceng: 数字,记录处于多少层 根分类为0层,以后递增1

生成的html代码如下:

None.gif < html >
None.gif
< head >
None.gif
< title > fenlei </ title >
None.gif
< meta  http-equiv ="Content-Type"  content ="text/html; charset=gb2312" >
None.gif
</ head >
None.gif
< body  bgcolor ="#FFFFFF"  text ="#000000" >
ExpandedBlockStart.gifContractedBlock.gif
< SCRIPT  LANGUAGE ="JavaScript" > dot.gif
InBlock.gif
<!--
ExpandedSubBlockStart.gifContractedSubBlock.gif
var dataArray = dot.gif{};
ExpandedSubBlockStart.gifContractedSubBlock.gif
var tempArray = dot.gif{};
InBlock.gif
var xx="";
InBlock.giftempArray[
0]="0@_!_#_$_|_@1@_!_#_$_|_@test@_!_#_$_|_@0";tempArray[1]="1@_!_#_$_|_@2@_!_#_$_|_@test1@_!_#_$_|_@1";tempArray[2]="2@_!_#_$_|_@3@_!_#_$_|_@test1-test2@_!_#_$_|_@2";tempArray[3]="0@_!_#_$_|_@4@_!_#_$_|_@test@_!_#_$_|_@0";tempArray[4]="4@_!_#_$_|_@5@_!_#_$_|_@test5@_!_#_$_|_@1";tempArray[5]="2@_!_#_$_|_@6@_!_#_$_|_@aaa@_!_#_$_|_@2";tempArray[6]="2@_!_#_$_|_@7@_!_#_$_|_@sss@_!_#_$_|_@2";
InBlock.gif
var y=0;
ExpandedSubBlockStart.gifContractedSubBlock.gif
function loadNextType(upid)dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
for(var key in tempArray)dot.gif{
InBlock.gif 
var temps=tempArray[key].split("@_!_#_$_|_@");
InBlock.gif 
var z=temps[1];
ExpandedSubBlockStart.gifContractedSubBlock.gif  
if(temps[0]==upid)dot.gif{
InBlock.gif  y
+=1;
InBlock.gif  xx
="";
ExpandedSubBlockStart.gifContractedSubBlock.gif  
for(k=0;k<parseInt(temps[3]);k++)dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif  
if(k!=parseInt(temps[3])-1)dot.gif{
InBlock.gif  xx
+="&nbsp;";
ExpandedSubBlockStart.gifContractedSubBlock.gif  }
elsedot.gif{
InBlock.gif  xx
+="&nbsp;◇";
ExpandedSubBlockEnd.gif  }

ExpandedSubBlockEnd.gif  }

InBlock.gif  dataArray[y]
=temps[0]+"@_!_#_$_|_@"+temps[1]+"@_!_#_$_|_@"+xx+temps[2];
InBlock.gif  loadNextType(z);
ExpandedSubBlockEnd.gif  }

ExpandedSubBlockEnd.gif }

ExpandedSubBlockEnd.gif}

ExpandedSubBlockStart.gifContractedSubBlock.gif
for(var key in tempArray)dot.gif{
InBlock.gif
var tmp=tempArray[key].split("@_!_#_$_|_@");
ExpandedSubBlockStart.gifContractedSubBlock.gif 
if(tmp[0]==0)dot.gif{
InBlock.gif  dataArray[y]
=tmp[0]+"@_!_#_$_|_@"+tmp[1]+"@_!_#_$_|_@"+""+tmp[2];
InBlock.gif  loadNextType(tmp[
1]);
InBlock.gif  y
+=1;
ExpandedSubBlockEnd.gif }

ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif
//-->
None.gif
</ SCRIPT >
None.gif
< span  style ="border:1px solid #000000; position:absolute; overflow:hidden;"   >  
None.gif
< select  name ="fenlei"  style ="margin:-2px;" >
ExpandedBlockStart.gifContractedBlock.gif  
< SCRIPT  LANGUAGE ="JavaScript" > dot.gif
InBlock.gif
<!--
ExpandedSubBlockStart.gifContractedSubBlock.gif
for(var key in dataArray)dot.gif{
InBlock.gif
var tp=dataArray[key].split("@_!_#_$_|_@");
InBlock.gifdocument.write('
<option value='+tp[1]+'>'+tp[2]+'</option>');
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif
//-->
None.gif
</ SCRIPT >
None.gif
</ select ></ span >  
None.gif
</ body >
None.gif
</ html >
None.gif
None.gif

服务器端asp代码如下:

None.gif < ! -- #include file = " ../conn.asp " -->
None.gif
< ! -- #include file = " ck.asp " -->
None.gif
< html >
None.gif
< head >
None.gif
< title > fenlei </ title >
None.gif
< meta http - equiv = " Content-Type "  content = " text/html; charset=gb2312 " >
None.gif
</ head >
None.gif
< body bgcolor = " #FFFFFF "  text = " #000000 " >
None.gif
< SCRIPT LANGUAGE = " JavaScript " >
None.gif
< ! --
None.gifvar dataArray 
=  {};
None.gifvar tempArray 
=  {};
None.gifvar xx
= "" ;
None.gif
< %
None.gif
dim  sql
None.gif
Set  rs = server.createobject( " adodb.recordset " )
None.gifsql
= " select * from fenlei "
None.gifrs.open sql,conn,
1 , 1
None.gif
dim  x
None.gifx
= 0
None.gif
do   while   not  rs.eof
None.gifresponse.write 
" tempArray[ "   &  x  &   " ]="" "   & rs( " fl " &   " @_!_#_$_|_@ "   & rs( " id " &   " @_!_#_$_|_@ "   &  rs( " mc " &   " @_!_#_$_|_@ "   &  rs( " ceng " &   " ""; "
None.gifx
= x + 1
None.gifrs.movenext
None.gif
loop
None.gif%
>
None.gifvar y
= 0 ;
ExpandedBlockStart.gifContractedBlock.gif
Function loadNextType() function loadNextType(upid){
InBlock.gif    
for(var key in tempArray){
InBlock.gif var temps
=tempArray[key].split("@_!_#_$_|_@");
InBlock.gif var z
=temps[1];
InBlock.gif  
if(temps[0]==upid){
InBlock.gif  y
+=1;
InBlock.gif  xx
="";
InBlock.gif  
for(k=0;k<parseInt(temps[3]);k++){
InBlock.gif  
if(k!=parseInt(temps[3])-1){
InBlock.gif  xx
+="&nbsp;";
InBlock.gif  }
else{
InBlock.gif  xx
+="&nbsp;◇";
InBlock.gif  }
InBlock.gif  }
InBlock.gif  dataArray[y]
=temps[0]+"@_!_#_$_|_@"+temps[1]+"@_!_#_$_|_@"+xx+temps[2];
InBlock.gif  loadNextType(z);
InBlock.gif  }
InBlock.gif }
InBlock.gif}
InBlock.gif
for(var key in tempArray){
InBlock.gifvar tmp
=tempArray[key].split("@_!_#_$_|_@");
InBlock.gif 
if(tmp[0]==0){
InBlock.gif  dataArray[y]
=tmp[0]+"@_!_#_$_|_@"+tmp[1]+"@_!_#_$_|_@"+""+tmp[2];
InBlock.gif  loadNextType(tmp[
1]);
InBlock.gif  y
+=1;
InBlock.gif }
InBlock.gif}
InBlock.gif
//-->
InBlock.gif
</SCRIPT>
InBlock.gif
<span style="border:1px solid #000000; position:absolute; overflow:hidden;" > 
InBlock.gif
<select name="fenlei" style="margin:-2px;">
InBlock.gif  
<SCRIPT LANGUAGE="JavaScript">
InBlock.gif
<!--
InBlock.gif
for(var key in dataArray){
InBlock.gifvar tp
=dataArray[key].split("@_!_#_$_|_@");
InBlock.gifdocument.write(
'<option value='+tp[1]+'>'+tp[2]+'</option>');
InBlock.gif
}
InBlock.gif
//-->
InBlock.gif
</SCRIPT>
InBlock.gif
</select></span> 
InBlock.gif
</body>
InBlock.gif
</html>
InBlock.gif
InBlock.gif

讲解:

  asp 查询数据库,生成js数据 object(不是数组,类似)
  数据库不同的行,对应不同的 tempArray[0] tempArray[1]......
  不同字段在每条数据中通过"@_!_#_$_|_@"分割,以避免会与数据中的文本有重复。

  用js通过递归算法重新排列tempArray 得到dataArray 并循环打印成为select中的option

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值