网络编程
位置:首页>> 网络编程>> Asp编程>> ajax+asp无限级分类树型结构

ajax+asp无限级分类树型结构

 来源:asp之家 发布时间:2011-04-02 11:05:00 

标签:ajax,asp,无限级分类,树型

IE测试通过,FF有点小BUG

Cls_Leibie.asp

代码如下:

<% 
'数据库字段为类属性,添加、删除、修改、操作检查等函数为类的方法 
Class Cls_Leibie 
Private nClassID,sClassName,nParentID,sParentPath,nDepth,nRootID,nChild,nOrderID,sFilePath '定义私有变量(类的属性,即数据库字段对应的变量) 
Private rs,sql,ErrorStr 
Private Sub Class_Initialize() 
ErrorStr="" '初始化错误信息为空 
End Sub 
Private Sub Class_Terminate() '销毁类时关闭数据库连接 
If IsObject(Conn) Then 
Conn.Close 
Set Conn = Nothing 
End If 
End Sub 
'*******************设置各个属性****************************************************** 
Public Property Let ClassID(str) '获取类别ID(主键) 
nClassID=str 
call ClassProperty() '获取类别ID时调用此函数读出类的所有属性 
End Property 
Public Property Let ClassName(str) '获取类别名称 
sClassName=str 
End Property 
Public Property Get ClassName 
ClassName=sClassName 
End Property 
Public Property Let ParentID(str) '获取类别父ID 
nParentID=str 
End Property 
Public Property Get ParentID 
ParentID=nParentID 
End Property 
Public Property Let ParentPath(str) '获取父路径ID 
sParentPath=str 
End Property 
Public Property Get ParentPath 
ParentPath=sParentPath 
End Property 
Public Property Let Depth(str) '获取类别深度 
nDepth=str 
End Property 
Public Property Get Depth 
Depth=nDepth 
End Property 
Public Property Let RootID(str) '获取类别根ID 
nRootID=str 
End Property 
Public Property Get RootID 
RootID=nRootID 
End Property 
Public Property Let Child(str) '子类别个数 
nChild=str 
End Property 
Public Property Get Child 
Child=nChild 
End Property 
Public Property Let OrderID(str) '排序ID 
nOrderID=str 
End Property 
Public Property Get OrderID 
OrderID=nOrderID 
End Property 
Public Property Let FilePath(str) '类别文件根目录(生成静态文件路径,小站老杨Web技术博客用的是生成静态,故设置此字段) 
sFilePath=str 
End Property 
Public Property Get FilePath 
FilePath=sFilePath 
End Property 
'****************************************************************************** 
Private Sub ClassProperty() '读取类的所有属性 
sql="select * from ArticleClass where ClassID="& nClassID 
set rs=conn.execute(sql) 
if not rs.eof then 
sClassName=trim(rs("ClassName")) 
nParentID=trim(rs("ParentID")) 
sParentPath=trim(rs("ParentPath")) 
nDepth=trim(rs("Depth")) 
nRootID=trim(rs("RootID")) 
nChild=trim(rs("Child")) 
nOrderID=trim(rs("OrderID")) 
sFilePath=trim(rs("FilePath")) 
end if 
set rs=nothing 
End Sub 
Public Function FAddCheck() '类别添加检查函数,结果为0表示通过检查,为1表示有错误发生,有错误发生时退出函数,将错误信息写入错误变量ErrorStr 
dim temprs 
FAddCheck=0 
if sClassName="" then '类名为空 
FAddCheck=1 
ErrorStr="类名不能为空!" 
exit Function 
else 
if nParentID="" then '父id为空 
FAddCheck=1 
ErrorStr="父id不能为空!" 
exit Function 
else 
if nParentID<>0 then 
set temprs=conn.execute("select ClassID From ArticleClass where ClassID=" & nParentID) '父类别不存在 
if temprs.eof then 
FAddCheck=1 
ErrorStr="所属类别不存在或已经被删除!" 
exit Function 
else 
sql="select ClassID from ArticleClass where ClassName='"& sClassName &"' and ParentID="& nParentID '类名重复 
set rs=conn.execute(sql) 
if not rs.eof then 
FAddCheck=1 
ErrorStr="类名重复!" 
exit Function 
end if 
set rs=nothing 
end if 
set temprs=nothing 
else 
sql="select ClassID from ArticleClass where ClassName='"& sClassName &"' and ParentID="& nParentID '类名重复 
set rs=conn.execute(sql) 
if not rs.eof then 
FAddCheck=1 
ErrorStr="类名重复!" 
exit Function 
end if 
set rs=nothing 
end if 
end if 
end if 
End Function 
Public Sub SAdd() 
dim maxClassID,maxRootID 
set rs = conn.execute("select Max(ClassID) from ArticleClass") '查找当前数据库中最大的类别id,如果没有数据则设置为0,要插入的类别id为当前最大id加1 
maxClassID=rs(0) 
if isnull(maxClassID) then 
maxClassID=0 
end if 
set rs=nothing 
nClassID=maxClassID+1 
set rs=conn.execute("select max(rootid) From ArticleClass") '查找当前数据库中最大的根id,如果没有数据则设置为0,要插入的根id为当前最大根id加1 
maxRootID=rs(0) 
if isnull(maxRootID) then 
maxRootID=0 
end if 
nRootID=maxRootID+1 
set rs=conn.execute("select RootID,Depth,ParentPath,Child,OrderID From ArticleClass where ClassID=" & nParentID) '查找父类别相应信息 
if not rs.eof then 
nRootID=trim(rs("Rootid")) '根id与父类别根id相同 
sParentPath=trim(rs("ParentPath"))& "," &nParentID 
if cint(trim(nParentID))>0 then '父id大于0则有父类别,故要插入的类别的深度父类别的深度加1,父id不大于0则当前要插入的类别为根类别,则深度为0 
nDepth=cint(trim(rs("Depth")))+1 
else 
nDepth=0 
end if 
if cint(trim(rs("Child")))>0 then 
dim rsPrevOrderID 
'得到与本栏目同级的最后一个栏目的OrderID 
set rsPrevOrderID=conn.execute("select Max(OrderID) From ArticleClass where ParentID=" & ParentID) 
prevOrderID=rsPrevOrderID(0) 
'得到同一父栏目但比本栏目级数大的子栏目的最大OrderID,如果比前一个值大,则改用这个值。 
set rsPrevOrderID=conn.execute("select Max(OrderID) From ArticleClass where ParentPath like '" & ParentPath & ",%'") 
if (not(rsPrevOrderID.bof and rsPrevOrderID.eof)) then 
if not IsNull(rsPrevOrderID(0)) then 
if rsPrevOrderID(0)>prevOrderID then 
prevOrderID=rsPrevOrderID(0) 
end if 
end if 
end if 
set rsPrevOrderID=nothing 
end if 
nOrderID=prevOrderID+1 
else 
nOrderID=0 
sParentPath="0" 
nDepth=0 
end if 
set rs=nothing 
nChild=0 
sql="insert into ArticleClass (ClassID,ClassName,ParentID,ParentPath,Depth,RootID,Child,OrderID,FilePath) values ("& nClassID &",'"& sClassName &"',"& nParentID &",'"& sParentPath &"',"& nDepth &","& nRootID &","& nChild &","& nOrderID &",'"& sFilePath &"')" 
conn.execute(sql) 
if ParentID>0 then 
'更新其父类的子栏目数 
conn.execute("update ArticleClass set child=child+1 where ClassID="& nParentID) 
'更新该栏目排序以及大于本需要和同在本分类下的栏目排序序号 
if prevOrderID<>"" then 
conn.execute("update ArticleClass set OrderID=OrderID+1 where rootid=" & nRootid & " and OrderID>"& prevOrderID &" and ClassID<>"& nClassID) 
end if 
end if 
End Sub 
Public Function FEditCheck() '类别修改检查函数,结果为0表示通过检查,为1表示有错误发生,有错误发生时退出函数,将错误信息写入错误变量ErrorStr 
dim temprs 
FEditCheck=0 
if nClassID="" then '类别id为空 
FEditCheck=1 
ErrorStr="类别id不能为空!" 
exit Function 
else 
if sClassName="" then '类名为空 
FEditCheck=1 
ErrorStr="类名不能为空!" 
exit Function 
else 
if nParentID<>0 then 
set temprs=conn.execute("select ClassID From ArticleClass where ClassID=" & nParentID) '父类别不存在 
if temprs.eof then 
FAddCheck=1 
ErrorStr="所属类别不存在或已经被删除!" 
exit Function 
else 
set rs=conn.execute("select ClassID from ArticleClass where ClassName='"& sClassName &"' and ClassID<>"& nClassID &"and ParentID="& nParentID) 
if not rs.eof then '类名重复 
FEditCheck=1 
ErrorStr="类名重复!" 
exit Function 
end if 
set rs=nothing 
end if 
set temprs=nothing 
end if 
end if 
end if 
End Function 
Public Sub SEdit() '类别修改 
sql="update ArticleClass set ClassName='"& sClassName &"',FilePath='"& sFilePath &"' where ClassID="& nClassID 
conn.execute(sql) 
End Sub 
Public Function FDeleteCheck() '类别删除检查函数,结果为0表示通过检查,为1表示有错误发生,有错误发生时退出函数,将错误信息写入错误变量ErrorStr 
FDeleteCheck=0 '这里删除没有写级联删除文章部分的代码,删除时应该级联删除 
if nClassID="" then 
FDeleteCheck=1 
ErrorStr="要删除的类别id不能为空!" 
exit Function 
else 
set rs=conn.execute("select Child from ArticleClass where ClassID="& nClassID) 
if rs.bof and rs.eof then 
FDeleteCheck=1 
ErrorStr="类别不存在或者已经被删除!" 
exit Function 
else 
if trim(rs("Child"))>0 then 
FDeleteCheck=1 
ErrorStr="该类别含有子类别,请删除其子类别后再进行删除本类别的操作!" 
exit Function 
end if 
end if 
end if 
End Function 
Public Sub SDelete() 
if nDepth>0 then '修改父id孩子数 
conn.execute("update ArticleClass set child=child-1 where child>0 and ClassID=" & nParentID) 
end if 
sql="delete from ArticleClass where ClassID="& nClassID 
conn.execute(sql) 
End Sub 
Public Function FErrStr() 
FErrStr=ErrorStr 
End Function 
End Class 
%> 
index.asp 
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> 
<% 
'作者站点:www.guaishi.org 
'邮箱:guaishiorg@126.com 
'QQ:514777880 
Session.CodePage=65001 
Response.Charset = "utf-8" 
%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>www.cidianwang.com</title> 
<style type="text/css"> 
body{margin:0;padding:0;font-size:12px; background-color:#FFFFFF;} 
ul{ list-style-type:none; margin:0 0 0 20px; padding:0;} 
li{ white-space:nowrap; padding:0;} 
.childdiv{ background:url(images/dot.gif);background-repeat:repeat-y;} 
span { cursor:pointer;} 
</style> 
<script type="text/javascript"> 
var xmlHttp; //定义一个全局变量 
var currentID=1;//设置当前选中ID,如果此ID不存在则会发生js错误 
//类别显示主函数 
//cid--子类别所在层id 
//id --类别id 
//pid--[+]和[-]图标id 
//fid--类别图标id 
function DivDisplay(cid,id,pid,fid) 

if (GetId(cid).style.display=='') //子类别不显示时图标显示控制 

GetId(cid).style.display='none'; 
GetId(pid).src = '/file/UploadPic/20112/5/201125112238600.gif'; 
GetId(fid).src = '/file/UploadPic/20112/5/201125112238234.gif'; 

else //展开子类别时的操作 

GetId(cid).style.display=''; 
GetId(pid).src = 'images/opened.gif'; 
GetId(fid).src = 'images/folderopen.gif'; 
if (GetId(cid).innerHTML==''||GetId(cid).innerHTML=='正在提交数据...') 

GetId(cid).innerHTML=''; 
ShowChild(cid,id); //调用显示子类别函数 



//与上一个函数作用相同,只作用在最后一个类别 
function DivDisplay2(cid,id,pid,fid) 

if (GetId(cid).style.display=='') 

GetId(cid).style.display='none'; 
GetId(pid).src = '/file/UploadPic/20112/5/201125112238419.gif'; 
GetId(fid).src = '/file/UploadPic/20112/5/201125112238234.gif'; 

else 

GetId(cid).style.display=''; 
GetId(pid).src = 'images/lastopen.gif'; 
GetId(fid).src = 'images/folderopen.gif'; 
if (GetId(cid).innerHTML==''||GetId(cid).innerHTML=='正在提交数据...') 

GetId(cid).innerHTML=''; 
ShowChild(cid,id); 



//类别添加函数 
//id--类别id 
function ClassAdd(id){ 
if (GetId("p"+id).src.indexOf("last")>0){ //最后一个类别时的添加操作 
if (!GetId("p"+id).onclick){ 
GetId("p"+id).onclick=function (){DivDisplay2("c"+id,id,"p"+id,"f"+id);}; //为[+]和[-]添加单击事件 
GetId("s"+id).ondblclick=function (){DivDisplay2("c"+id,id,"p"+id,"f"+id);}; //为显示类别文字的span添加双击事件 
GetId("p"+id).src = 'images/lastopen.gif'; 


else{ 
if (!GetId("p"+id).onclick){ //不为最后一个类别的添加操作 
GetId("p"+id).onclick=function (){DivDisplay("c"+id,id,"p"+id,"f"+id);}; 
GetId("s"+id).ondblclick=function (){DivDisplay("c"+id,id,"p"+id,"f"+id);}; 
GetId("p"+id).src = 'images/opened.gif'; 


GetId("c"+id).style.display=''; 
ShowChild("c"+id,id); 

//类别修改函数 
function ClassEdit(id,classname){ 
GetId("s"+id).innerHTML=classname; 

//有多个子类别的类别的删除函数 
function ClassDel(id){ 
ShowChild("c"+id,id); 
CurrentSelect(currentID,id) 
BrowseRight(id); 

//只有一个子类别的类别的删除函数 
function ClassDel1(id){ 
if (GetId("p"+id).src.indexOf("last")>0){ //当类别是当前类别的最后一个类别时 
GetId("p"+id).style.cursor="cursor"; //设置图标的鼠标经过样式 
GetId("p"+id).onclick=function (){}; //因为只有一个子类别删除后就不再有子类别,故将图标单击事件修改为空函数 
GetId("s"+id).ondblclick=function (){}; //同上 
GetId("p"+id).src = '/file/UploadPic/20112/5/201125112238139.gif'; //图标设置 

else{ 
GetId("p"+id).style.cursor="cursor"; //非最后一个类别的删除操作 
GetId("p"+id).onclick=function (){}; 
GetId("s"+id).ondblclick=function (){}; 
GetId("p"+id).src = '/file/UploadPic/20112/5/201125112238767.gif'; //这里的图标设置与前面不一样 

ShowChild("c"+id,id); 
CurrentSelect(currentID,id); 
BrowseRight(id); 

//向右边框架传递参数 
function BrowseRight(id){ 
CurrentSelect(currentID,id); 
top.ContentFrame.location="../ArticleMain.asp?ClassID="+ id; 

//设置类别选中状态的函数 
function CurrentSelect(oldid,newid){ 
currentID=newid; 
document.getElementById("s"+oldid).style.backgroundColor="white"; 
document.getElementById("s"+currentID).style.backgroundColor="#C0C0E9"; 

//创建XMLHttpRequest对象 
function CreateXMLHttpRequest() 

if (window.ActiveXObject) 

xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 

else 

xmlHttp = new XMLHttpRequest(); 


//Ajax处理函数 
//id,层id 
//rid,数据在表中的id 
function ShowChild(cid,id) 

CreateXMLHttpRequest(); 
if(xmlHttp) 

xmlHttp.open('POST','child.asp',true); 
xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); 
var SendData = 'id='+id; 
xmlHttp.send(SendData); 
xmlHttp.onreadystatechange=function() 

if(xmlHttp.readyState==4) 

if(xmlHttp.status==200) 

GetId(cid).innerHTML = xmlHttp.responseText; 

else 

GetId(cid).innerHTML='出错:'+xmlHttp.statusText; 


else 

GetId(cid).innerHTML="正在提交数据..."; 



else 

GetId(cid).innerHTML='抱歉,您的浏览器不支持XMLHttpRequest,请使用IE6以上版本!'; 


//取得页面对象 
//id,层id 
function GetId(id) 

return document.getElementById(id); 

</script> 
</head> 
<body> 
<!--#include file="../conn.asp"--> 
<% 
'显示根目录 
sql="select *,(select top 1 ClassID from ArticleClass where Depth=0 order by ClassID desc) as lastid from ArticleClass where Depth=0 order by ClassID" 
set rs=conn.execute(sql) 
if not rs.eof then 
response.Write "<ul>"&vbcr 
do while not rs.eof 
if cint(trim(rs("ClassID")))=cint(trim(rs("lastid"))) then 
if rs("Child")>0 then 
response.Write "<li><img id='p"&rs("ClassID")&"' src=""/file/UploadPic/20112/5/201125112238419.gif"" onclick=""DivDisplay2('c"&rs("ClassID")&"','"&rs("ClassID")&"','p"&rs("ClassID")&"','f"& rs("ClassID") &"')"" style=""cursor : hand;"" align=""absmiddle"">" 
response.Write "<img src=""/file/UploadPic/20112/5/201125112238234.gif"" align=""absmiddle"" id='f"& rs("ClassID") &"' /> <span id='s"& trim(rs("ClassID")) &"' onclick=""BrowseRight("& trim(rs("ClassID")) &")"" ondblclick=""DivDisplay2('c"&rs("ClassID")&"','"&rs("ClassID")&"','p"&rs("ClassID")&"','f"& rs("ClassID") &"')"">"& rs("ClassName") &"</span>" 
else 
response.Write "<li><img id='p"& rs("ClassID") &"' src=""/file/UploadPic/20112/5/201125112238139.gif"" align=""absmiddle"" />" 
response.Write "<img src=""/file/UploadPic/20112/5/201125112238234.gif"" align=""absmiddle"" id='f"& rs("ClassID") &"' /> <span id='s"& trim(rs("ClassID")) &"' onclick=""BrowseRight("& trim(rs("ClassID")) &")"">"& rs("ClassName") &"</span>" 
end if 
else 
if rs("Child")>0 then 
response.Write "<li><img id='p"&rs("ClassID")&"' src=""/file/UploadPic/20112/5/201125112238600.gif"" onclick=""DivDisplay('c"&rs("ClassID")&"','"&rs("ClassID")&"','p"&rs("ClassID")&"','f"& rs("ClassID") &"')"" style=""cursor : hand;"" align=""absmiddle"">" 
response.Write "<img src=""/file/UploadPic/20112/5/201125112238234.gif"" align=""absmiddle"" id='f"& rs("ClassID") &"' /> <span id='s"& trim(rs("ClassID")) &"' onclick=""BrowseRight("& trim(rs("ClassID")) &")"" ondblclick=""DivDisplay('c"&rs("ClassID")&"','"&rs("ClassID")&"','p"&rs("ClassID")&"','f"& rs("ClassID") &"')"">"& rs("ClassName") &"</span>" 
else 
response.Write "<li><img id='p"& rs("ClassID") &"' src=""/file/UploadPic/20112/5/201125112238767.gif"" align=""absmiddle"" />" 
response.Write "<img src=""/file/UploadPic/20112/5/201125112238234.gif"" align=""absmiddle"" id='f"& rs("ClassID") &"' /> <span id='s"& trim(rs("ClassID")) &"' onclick=""BrowseRight("& trim(rs("ClassID")) &")"">"& rs("ClassName") &"</span>" 
end if 
end if 
if cint(trim(rs("ClassID")))=cint(trim(rs("lastid"))) then 
response.Write "<div id='c"&rs("ClassID")&"' style='display:none;'></div>" 
else 
response.Write "<div id='c"&rs("ClassID")&"' style='display:none;' class=""childdiv""></div>" 
end if 
response.Write "</li>"&vbcr 
rs.movenext 
loop 
response.Write "</ul>"&vbcr 
end if 
rs.close 
set rs=nothing 
conn.close 
Set conn = Nothing 
%> 
</body> 
</html> 

0
投稿

猜你喜欢

  • 磁盘搜索是性能的很大瓶颈。这个问题在数据大量增长以至于无法使用有效的缓存时尤为明显。或多或少随即访问大数据库时,就必然会有至少一次磁盘搜索来
  • 我们也可以来做一个,但这个“定时器”的工作时间范围应控制在1个小时至100 毫秒之间: <%sub StartTi
  • 本人曾经用过的备份方式有:mysqldump、mysqlhotcopy、BACKUP TABLE 、SELECT INTO OUTFILE,
  • Rs.Open参数说明在ASP中经常用Rs.Open sql,conn,1,1这样的方式打开数据库,但仍有一部分同行不知道这是嘛意思,现整理
  • 停止mysql服务(以管理员身份,在cmd命令行下运行) net stop mysql或者在服务中停止mysql服务。使用 mysqld –
  • 由于连续的字符(字母、符号、数字)在默认情况下是不换行的,可能会破坏整个界面布局。那如何解决这个问题呢?在 IE 和 Safari 1.3+
  • 网页过渡是指当浏览者进入或离开网页时,页面呈现的不同的刷新效果,比如卷动、百叶窗等。注:通过模板所建网页无法添加网页过渡效果!制作步骤:1、
  • 折纸是日本著名的折叠纸张的艺术。折纸艺术只是使用一些不同的折叠方式,却能被用各种各样的方式组合成错综复杂的设计。而受折纸启发的logo设计则
  • 什么是1433端口 1433端口,是SQL Server默认的端口,SQL Server服务使用两个端口:TCP-1433、UDP-1434
  • 作为收费应用方面的数据库管理员(DBA),公司首席信息官(CIO)经常邀请我与Sarbanes-Oxley审查员开会讨 * 司数据的安全与整合
  • 如何修改数据库名(db_name)及实例名(Instance_name or Service_name) Nid是Oracle从9iR2开始
  • 之前我写过一篇文章介绍如何实现中国站长站的文章干扰码功能:《谈中国站长站的文章干扰码实现方法》 首发在asp之家。如果大家有兴趣可以先看看。
  • 您在访问网站时是否会在有些页面上见到这种功能---您在可以访问此网站的同时,还可以查看您免费邮箱中是否有新邮件。这个功能是不是让您觉得很心动
  • 如何获知用户的IP?<% Dim ValidLog ' 日志变量 Valid
  • 黑体是视觉设计师常用的一款字体,特别是针对广告的 Banner 等。根据 * 的相关介绍,有关黑体的定义可以认为:黑體与白体
  •  <1>IsArray 函数  返回 Boolean 值指明某变量是否为数组。 语法 IsArray(var
  • 最近网上再度兴起了CSS布局和Table 布局的争论。我最初颇有些不以为然:我原以为CSS 布局的意义早已深入人心,却没想到还有这么多设计师
  • 1.3 安装 ASP.net跟基督山一起检查你们的计算机哦CPU Pentium II 450以上,推荐733内存 256M 推荐 512M
  • 在CSS中我们会经常要用到“清除浮动”Clear,比较典型的就是clear:both;CSS手册上是这样说明的:该属性的值指出了不允许有浮动
  • 如果MySQL服务器启用了二进制日志,你可以使用mysqlbinlog工具来恢复从指定的时间点开始 (例如,从你最后一次备份)直到现在或另一
手机版 网络编程 asp之家 www.aspxhome.com