手机
当前位置:查字典教程网 >编程开发 >ASP教程 >ajax+asp无限级分类树型结构(带数据库)
ajax+asp无限级分类树型结构(带数据库)
摘要:IE测试通过,FF有点小BUGCls_Leibie.asp复制代码代码如下:0thendimrsPrevOrderID'得到与本栏目同级的最...

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></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 = 'images/closed.gif';

GetId(fid).src = 'images/folder.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 = 'images/lastclosed.gif';

GetId(fid).src = 'images/folder.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 = 'images/lastnochild.gif'; //图标设置

}

else{

GetId("p"+id).style.cursor="cursor"; //非最后一个类别的删除操作

GetId("p"+id).onclick=function (){};

GetId("s"+id).ondblclick=function (){};

GetId("p"+id).src = 'images/nofollow2.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>

<>

<%

'显示根目录

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=""images/lastclosed.gif""DivDisplay2('c"&rs("ClassID")&"','"&rs("ClassID")&"','p"&rs("ClassID")&"','f"& rs("ClassID") &"')""cursor : hand;"" align=""absmiddle"">"

response.Write "<img src=""images/folder.gif"" align=""absmiddle"" id='f"& rs("ClassID") &"' /> <span id='s"& trim(rs("ClassID")) &"'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=""images/lastnochild.gif"" align=""absmiddle"" />"

response.Write "<img src=""images/folder.gif"" align=""absmiddle"" id='f"& rs("ClassID") &"' /> <span id='s"& trim(rs("ClassID")) &"'BrowseRight("& trim(rs("ClassID")) &")"">"& rs("ClassName") &"</span>"

end if

else

if rs("Child")>0 then

response.Write "<li><img id='p"&rs("ClassID")&"' src=""images/closed.gif""DivDisplay('c"&rs("ClassID")&"','"&rs("ClassID")&"','p"&rs("ClassID")&"','f"& rs("ClassID") &"')""cursor : hand;"" align=""absmiddle"">"

response.Write "<img src=""images/folder.gif"" align=""absmiddle"" id='f"& rs("ClassID") &"' /> <span id='s"& trim(rs("ClassID")) &"'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=""images/nofollow2.gif"" align=""absmiddle"" />"

response.Write "<img src=""images/folder.gif"" align=""absmiddle"" id='f"& rs("ClassID") &"' /> <span id='s"& trim(rs("ClassID")) &"'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")&"'></div>"

else

response.Write "<div id='c"&rs("ClassID")&"'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>

打包下载地址 http://xiazai.jb51.net/200906/yuanma/ajaxtree_51281.rar

【ajax+asp无限级分类树型结构(带数据库)】相关文章:

ASP代码实现图片上传并存入数据库中

asp 过滤数组重复数据

asp 字符串连接数据库方法

asp无限分级(递归调用)

js+asp总结

asp最常用的分页函数

asp中"无限流"分页程序代码

asp 日期格式化函数

把无限级分类生成数组

asp从缓存读数据实例

精品推荐
分类导航