ajax+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)    '类别文件根目录(生成静态文件路径,小站奇人异事网([url]www.guaishi.org[/url])用的是生成静态,故设置此字段)
        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
%>

核心js代码 


代码如下:

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);
}

(0)

相关推荐

  • 利用Dojo和JSON建立无限级AJAX动态加载的功能模块树

    看了"使用hibernate实现树形结构无限级分类"这篇文章后,我也想将自己在所有开发的项目中使用的功能模块树的实现方法以及完整DEMO(含源码)贴出来和大家分享.其实在我的博客里是老早贴出来的,由于时间关系没好好整理.        功能模块树是几乎在每个项目里都要用到的东西,利用Dojo的好处就是可以实现树的子节点的动态加载,这在树节点很多的情况下是很有用的.         下载附件二dojotree.rar,解压后将dist\dojotree.war部署到应用服务器即可浏览DE

  • 完成了AJAX树附原理分析

    首先要纠正一个上篇博文<Rails中的Ajax初体验>中的一个错误:上篇博文中,我说"要在Rails中使用Ajax,局部模板是必须的",经实践检验,是错误的,特此更正.实践是检验真理的唯一标准,此言不虚.经过项目中真正通过RJS实现AJAX树,可知,通过使用insert_html.replace_html等辅助方法,可直接操作页面上的元素,无须使用局部模板. 整个的实现过程还是有点曲折: 之前使用的生成树结构的页面,是利用从服务器获取的所有数据,通过一系列javascrip

  • 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 Cl

  • 基于jstree使用AJAX请求获取数据形成树

    概述: 一般情况下都是通过ajax进行请求获取数据.boostrap+ajax 1.代码 //权限分配 $('#authority').click(function() { $("#jstree").jstree({ "core" : { "themes" : { "responsive": false }, // so that create works "check_callback" : true,

  • 一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)

    复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data.Linq; using System.Xml; using System.Xml.Linq; namespace WebApplication3 { public

  • jstree创建无限分级树的方法【基于ajax动态创建子节点】

    本文实例讲述了jstree创建无限分级树的方法.分享给大家供大家参考,具体如下: 首先来看一下效果 页面加载之初 节点全部展开后 首先数据库的表结构如下 其中Id为主键,PId为关联到自身的外键 两个字段均为GUID形式 层级关系主要靠这两个字段维护 其次需要有一个类型 public class MenuType { public Guid Id { get; set; } public Guid PId { get; set; } public string MenuName { get; s

  • ajax+asp无限级分类树型结构的代码

    复制代码 代码如下: <% '数据库字段为类属性,添加.删除.修改.操作检查等函数为类的方法 Class Cls_Leibie     Private nClassID,sClassName,nParentID,sParentPath,nDepth,nRootID,nChild,nOrderID,sFilePath '定义私有变量(类的属性,即数据库字段对应的变量)     Private rs,sql,ErrorStr Private Sub Class_Initialize()       

  • 创建无限极分类树型结构的简单方法

    先上效果图 顶级分类其实就是一级分类,二级分类也叫作一级分类的子分类,在这个基础上,子分类还可以拥有子分类,这样就构成了无限极分类. 接下来看具体实现的代码: 一.在控制器中按字段查询,查询出所有分类信息(id:该分类的ID值,cate_name:该分类的名称,pid:父ID,sorts:为显示标题顺序排序做准备,可不写.) public function cate_display() { $cate = D('Cate'); $field = array('id','cate_name','p

  • Python 无限级分类树状结构生成算法的实现

    后端研发的同学对无限级分类肯定映像深刻,当初花了不少时间吧? 无限级分类树状结构的应用场景很多,例如后端研发需要把用户相关权限读取出来并生成树状结构,前端研发拿到权限树之后可以按照结构展示用户有权限访问的栏目:再例如网页上的栏目分级: 作者在初次接触树状结构生成需求的时候,也是挠头,后来找到了一个代码少且清晰易懂的生成算法:递归. 首先,确保数据库中存储的类别信息如下: [ {"id": 1, "name": '电器', "parent": 0}

  • php+mysql实现无限级分类 | 树型显示分类关系

    无限级分类,主要是通过储存上级分类的id以及分类路径来实现.由于数据的结构简单,所以要将分类的关系由树状显示,我只能想到用递归的方式给于实现. 无限级分类,主要是通过储存上级分类的id以及分类路径来实现.由于数据的结构简单,所以要将分类的关系由树状显示,我只能想到用递归的方式给于实现,下面是分类数据表结构和自己写的一个树状显示函数,有什么不妥的地方希望大家能指出.  表结构:id字段为分类标识,name字段为分类名,father_id字段为所属父分类的id,path字段为分类路径(储存该分类祖先

  • asp实现树型结构

    蛙蛙推荐:asp实现树型结构     选择自 onlytiancai 的 Blog   关键字   蛙蛙推荐:asp实现树型结构  出处 <!--  -----------[test]表生成脚本--------------- if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo

  • 实现论坛树型结构的具体算法

    实现论坛树型结构的算法很多,具体你可以去www.chinaasp.com的全文搜索中查询.我现在的JSP论坛采用的也是当中的一种:不用递归实现树型结构的算法,现在我将论坛树型结构的具体算法和大家介绍一下,和大家一起交流. 1.演示表的结构: 表名:mybbslist 字段 数据类型 说明 BBSID 自动编号  RootID Int 根帖ID,本身为根帖则RootID = ID FID Int 父帖ID,上一层帖子的ID,如是根帖则FID = 0 DEPTH Int 根帖Level=0,其他依据

  • 树型结构列出指定目录里所有文件的PHP类

    <? //以树型结构列出指定目录里的所有文件,如果你想知道自己某个目录里有哪些子目录和文件,可以调用这个类来查看,很方便的. # 演示的例子:     $t = new TreeClimber( "asp" ); //新建物件,设置需要列出的目录:在此为asp目录     echo arrayValuesToString( $t->getFileList( $t->getPath() ), "<BR>\n" ); function ar

  • JavaScript解析任意形式的json树型结构展示

    在页面展示json成树形结构时,往往得到的json不是ztree的规范格式,需要对json循环迭代解析.即使不规范的json也可以树形展现: var arrayJsonContent=[]; //节点类 var JsonNodes = { id:"", name:"", pId:"", content:"", //location:"", linklocation:"", open:fa

  • PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例

    我们经常需要在关系型数据库中保存一些树状结构数据,比如分类.菜单.论坛帖子树状回复等.常用的方法有两种: 1. 领接表的方式: 2. 预排序遍历树方式: 假设树状结构如下图: 领接表方式 主要依赖于一个 parent 字段,用于指向上级节点,将相邻的上下级节点连接起来,id 为自动递增自动,parent_id 为上级节点的 id.一目了然,"Java"是"Language"的子节点. 我们要显示树,PHP 代码也可以很直观,代码如下: 复制代码 代码如下: <

随机推荐