Estrutura de árvore de classificação ilimitada Ajax + asp com banco de dados, coisa boa, não perca, teste do IE aprovado, FF tem um pequeno bug
Cls_Leibie.asp
Copie o código do código da seguinte forma:
<%
'Os campos do banco de dados são atributos de classe e funções como adição, exclusão, modificação e verificação de operação são métodos de classe.
Classe Cls_Leibie
Private nClassID,sClassName,nParentID,sParentPath,nDepth,nRootID,nChild,nOrderID,sFilePath 'Define variáveis privadas (atributos da classe, ou seja, variáveis correspondentes aos campos do banco de dados)
RS privado,sql,ErrorStr
Subclasse Privada_Initialize()
ErrorStr= 'A mensagem de erro de inicialização está vazia
Finalizar sub
Private Sub Class_Terminate() 'Fecha a conexão com o banco de dados ao destruir a classe
Se IsObject(Conn) então
Conexão Fechar
SetConn=Nada
Terminar se
Finalizar sub
'**********************Definir várias propriedades************************ ***********************************
Propriedade pública Let ClassID(str) 'Obtém o ID da categoria (chave primária)
nClassID=str
call ClassProperty() 'Chame esta função para ler todas as propriedades da classe ao obter o ID da categoria
Fim da propriedade
Propriedade pública Let ClassName(str) 'Obtém o nome da classe
sClassName=str
Fim da propriedade
Propriedade Pública Obter ClassName
ClassName=sClassName
Fim da propriedade
Propriedade pública Let ParentID(str) 'Obtém o ID pai da categoria
nParentID=str
Fim da propriedade
Propriedade pública Obter ParentID
ParentID=nParentID
Fim da propriedade
Propriedade pública Let ParentPath(str) 'Obtém o ID do caminho pai
sParentPath=str
Fim da propriedade
Propriedade pública Obter ParentPath
ParentPath=sParentPath
Fim da propriedade
Propriedade pública Let Depth(str) 'Obtém a profundidade da categoria
nProfundidade=str
Fim da propriedade
Propriedade Pública Obtenha Profundidade
Profundidade=nProfundidade
Fim da propriedade
Propriedade pública Let RootID(str) 'Obtém o ID raiz da categoria
nRootID=str
Fim da propriedade
Propriedade pública Obtenha RootID
RootID=nRootID
Fim da propriedade
Propriedade Pública Let Child(str) 'Número de subcategorias
nCriança=str
Fim da propriedade
Propriedade Pública Obter Filho
Criança=nCriança
Fim da propriedade
Propriedade pública Let OrderID(str) 'ID do pedido
nOrderID=str
Fim da propriedade
Propriedade pública obter OrderID
ID do pedido=nID do pedido
Fim da propriedade
Propriedade pública Let FilePath(str) 'Diretório raiz do arquivo de categoria (gerar caminho de arquivo estático, Xiaozhan Laoyang Web Technology Blog usa geração de arquivo estático, então defina este campo)
sCaminhoDoArquivo=str
Fim da propriedade
Propriedade pública Obter FilePath
FilePath=sFilePath
Fim da propriedade
'********************************************** ******************************
Private Sub ClassProperty() 'Lê todas as propriedades da classe
sql=select * de ArticleClass onde ClassID=& nClassID
definir rs = conn.execute (sql)
se não rs.eof então
sClassName=trim(rs(ClassName))
nParentID=trim(rs(ParentID))
sParentPath=trim(rs(ParentPath))
nProfundidade=cortar(rs(Profundidade))
nRootID=trim(rs(RootID))
nCriança=trim(rs(Criança))
nOrderID=trim(rs(OrderID))
sCaminhoDoArquivo=trim(rs(CaminhoDoArquivo))
terminar se
definir rs = nada
Finalizar sub
Função pública FAddCheck() 'Adicionar uma função de verificação à categoria Um resultado 0 significa que a verificação foi aprovada e um resultado 1 significa que ocorreu um erro, saia da função e grave as informações do erro no erro. variável ErroStr
temperatura fraca
FAddCheck=0
if sClassName= then 'O nome da classe está vazio
FAddCheck=1
ErrorStr=O nome da classe não pode ficar vazio!
função de saída
outro
se nParentID = então 'ID do pai está vazio
FAddCheck=1
ErrorStr=ID do pai não pode estar vazio!
função de saída
outro
se nParentID<>0 então
set temprs=conn.execute(select ClassID From ArticleClass where ClassID= & nParentID) 'A categoria pai não existe
se temprs.eof então
FAddCheck=1
ErrorStr=A categoria não existe ou foi excluída!
função de saída
outro
sql=selecione ClassID de ArticleClass onde ClassName='& sClassName &' e ParentID=& nParentID 'Nome de classe duplicado
definir rs = conn.execute (sql)
se não rs.eof então
FAddCheck=1
ErrorStr=Nome da classe duplicado!
função de saída
terminar se
definir rs = nada
terminar se
settemprs = nada
outro
sql=selecione ClassID de ArticleClass onde ClassName='& sClassName &' e ParentID=& nParentID 'Nome de classe duplicado
definir rs = conn.execute (sql)
se não rs.eof então
FAddCheck=1
ErrorStr=Nome da classe duplicado!
função de saída
terminar se
definir rs = nada
terminar se
terminar se
terminar se
Função final
Sub SAd público()
dim maxClassID,maxRootID
set rs = conn.execute(select Max(ClassID) from ArticleClass) 'Encontre o maior ID da categoria no banco de dados atual. Se não houver dados, defina-o como 0. O ID da categoria a ser inserido é o maior ID atual mais 1.
maxClassID=rs(0)
se isnull(maxClassID) então
maxClassID=0
terminar se
definir rs = nada
nClassID=maxClassID+1
set rs=conn.execute(select max(rootid) From ArticleClass) 'Encontre o maior ID de raiz no banco de dados atual. Se não houver dados, defina-o como 0. O ID de raiz a ser inserido é o maior ID de raiz atual mais. 1
maxRootID=rs(0)
se isnull(maxRootID) então
maxRootID=0
terminar se
nRootID=maxRootID+1
set rs=conn.execute(select RootID,Depth,ParentPath,Child,OrderID From ArticleClass where ClassID= & nParentID) 'Encontre as informações correspondentes da categoria pai
se não rs.eof então
nRootID=trim(rs(Rootid)) 'O ID raiz é o mesmo que o ID raiz da categoria pai
sParentPath=trim(rs(ParentPath))& , &nParentID
if cint(trim(nParentID))>0 then 'Se o id pai for maior que 0, há uma categoria pai, então a profundidade da categoria a ser inserida é adicionada à profundidade da categoria pai por 1. Se o o id pai não é maior que 0, a categoria atual a ser inserida é a categoria raiz. Então a profundidade é 0.
nProfundidade=cint(trim(rs(Profundidade)))+1
outro
nProfundidade=0
terminar se
se cint(trim(rs(Child)))>0 então
dimrsPrevOrderID
'Obtém o OrderID da última coluna no mesmo nível desta coluna
definir rsPrevOrderID = conn.execute (selecione Max (OrderID) de ArticleClass onde ParentID = & ParentID)
prevOrderID=rsPrevOrderID(0)
'Obtenha o OrderID máximo da subcoluna da mesma coluna pai, mas maior que esta coluna. Se for maior que o valor anterior, use este valor.
definir rsPrevOrderID = conn.execute (selecione Max (OrderID) de ArticleClass onde ParentPath como '& ParentPath &,%')
se (não (rsPrevOrderID.bof e rsPrevOrderID.eof)) então
se não for IsNull(rsPrevOrderID(0)) então
se rsPrevOrderID(0)>prevOrderID então
prevOrderID=rsPrevOrderID(0)
terminar se
terminar se
terminar se
definir rsPrevOrderID = nada
terminar se
nOrderID=prevOrderID+1
outro
nIDPedido=0
sParentPath=0
nProfundidade=0
terminar se
definir rs = nada
nCriança=0
sql=inserir em ArticleClass (ClassID,ClassName,ParentID,ParentPath,Depth,RootID,Child,OrderID,FilePath) valores (& nClassID &,'& sClassName &',& nParentID &,'& sParentPath &',& nDepth &, & nRootID &,& nChild &,& nOrderID &,'& sFilePath &')
conn.execute(sql)
se ParentID>0 então
'Atualiza o número de subcolunas de sua classe pai
conn.execute(atualizar ArticleClass set child=child+1 onde ClassID=& nParentID)
'Atualizar a classificação desta coluna e os números de sequência de classificação das colunas que são maiores que esta necessidade e nesta categoria
se anteriorOrderID<> então
conn.execute (atualizar ArticleClass set OrderID=OrderID+1 onde rootid= & nRootid & e OrderID>& prevOrderID & e ClassID<>& nClassID)
terminar se
terminar se
Finalizar sub
Função pública FEditCheck() 'Função de verificação de modificação de categoria, o resultado é 0 significa que a verificação foi aprovada e 1 significa que ocorreu um erro. Quando ocorrer um erro, saia da função e grave as informações do erro na variável de erro ErrorStr.
temperatura fraca
FEditCheck=0
se nClassID = então 'ID da categoria está vazio
FEditCheck=1
ErrorStr=O ID da categoria não pode estar vazio!
função de saída
outro
if sClassName= then 'O nome da classe está vazio
FEditCheck=1
ErrorStr=O nome da classe não pode ficar vazio!
função de saída
outro
se nParentID<>0 então
set temprs=conn.execute(select ClassID From ArticleClass where ClassID= & nParentID) 'A categoria pai não existe
se temprs.eof então
FAddCheck=1
ErrorStr=A categoria não existe ou foi excluída!
função de saída
outro
defina rs=conn.execute (selecione ClassID em ArticleClass onde ClassName='& sClassName &' e ClassID<>& nClassID &and ParentID=& nParentID)
se não for rs.eof então 'Nome da classe duplicado
FEditCheck=1
ErrorStr=Nome da classe duplicado!
função de saída
terminar se
definir rs = nada
terminar se
settemprs = nada
terminar se
terminar se
terminar se
Função final
Public Sub SEdit() 'Modificação de categoria
sql=update ArticleClass set ClassName='& sClassName &',FilePath='& sFilePath &' where ClassID=& nClassID
conn.execute(sql)
Finalizar sub
Função pública FDeleteCheck() 'Função de verificação de exclusão de categoria, o resultado é 0 significa que a verificação foi aprovada e 1 significa que ocorreu um erro. Quando ocorrer um erro, saia da função e grave as informações do erro na variável de erro ErrorStr.
FDeleteCheck=0 'Exclua o código aqui sem escrever a parte de exclusão em cascata do artigo. Ao excluir, você deve excluí-lo em cascata.
se nClassID = então
FDeleteCheck=1
ErrorStr=O ID da categoria a ser excluída não pode estar vazio!
função de saída
outro
set rs=conn.execute(selecione Child em ArticleClass onde ClassID=& nClassID)
se rs.bof e rs.eof então
FDeleteCheck=1
ErrorStr=A categoria não existe ou foi excluída!
função de saída
outro
se trim(rs(Child))>0 então
FDeleteCheck=1
ErrorStr=Esta categoria contém subcategorias, por favor exclua suas subcategorias antes de excluir esta categoria!
função de saída
terminar se
terminar se
terminar se
Função final
Sub SDelete público()
if nDepth>0 then 'Modifica o número de filhos do id pai
conn.execute (atualizar ArticleClass set child=child-1 onde child>0 e ClassID= & nParentID)
terminar se
sql = excluir de ArticleClass onde ClassID = & nClassID
conn.execute(sql)
Finalizar sub
Função PúblicaFErrStr()
FErrStr=ErroStr
Função final
Fim da aula
%>
índice.asp
<%@LANGUAGE=PÁGINA DE CÓDIGO VBSCRIPT=65001%>
<%
'Site do autor: www.guaishi.org
'E-mail: [email protected]
'QQ:514777880
Sessão.CodePage=65001
Resposta.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>
<cabeça>
<meta http-equiv=Content-Type content=text/html; charset=utf-8 />
<título></título>
<tipo de estilo=texto/css>
corpo{margem:0;preenchimento:0;tamanho da fonte:12px;cor de fundo:#FFFFFF;}
ul{tipo de estilo de lista:none margem:0 0 0 20px;
li{espaço em branco:nowrap preenchimento:0;}
.childdiv{ background:url(images/dot.gif);background-repeat:repeat-y;}
span {cursor:ponteiro;}
</estilo>
<tipo de script=texto/javascript>
var xmlHttp; //Definir uma variável global
var currentID=1;//Define o ID atualmente selecionado. Se esse ID não existir, ocorrerá um erro de js.
//Função principal de exibição de categoria
//cid – o ID da camada da subcategoria
//id --categoria id
//pid--[+] e [-] ID do ícone
//fid--id do ícone da categoria
função DivDisplay(cid,id,pid,fid)
{
if (GetId(cid).style.display=='') //Controle de exibição do ícone quando a subcategoria não é exibida
{
GetId(cid).style.display='nenhum';
GetId(pid).src = 'imagens/closed.gif';
GetId(fid).src = 'imagens/pasta.gif';
}
else //Operações ao expandir subcategorias
{
GetId(cid).style.display='';
GetId(pid).src = 'images/opened.gif';
GetId(fid).src = 'imagens/folderopen.gif';
if (GetId(cid).innerHTML==''||GetId(cid).innerHTML=='Enviando dados...')
{
GetId(cid).innerHTML='';
ShowChild(cid,id); //Chama a função de subcategoria de exibição
}
}
}
//Mesmo efeito da função anterior, só funciona na última categoria
função DivDisplay2(cid,id,pid,fid)
{
if (GetId(cid).style.display=='')
{
GetId(cid).style.display='nenhum';
GetId(pid).src = 'images/lastclosed.gif';
GetId(fid).src = 'imagens/pasta.gif';
}
outro
{
GetId(cid).style.display='';
GetId(pid).src = 'images/lastopen.gif';
GetId(fid).src = 'imagens/folderopen.gif';
if (GetId(cid).innerHTML==''||GetId(cid).innerHTML=='Enviando dados...')
{
GetId(cid).innerHTML='';
MostrarCriança(cid,id);
}
}
}
//Função de adição de categoria
//id--id da categoria
função ClassAdd(id){
if (GetId(p+id).src.indexOf(last)>0){ //Adicionar operação para a última categoria
if (!GetId(p+id).onclick){
GetId(p+id).onclick=function (){DivDisplay2(c+id,id,p+id,f+id);} //Adicionar eventos de clique para [+] e [-]
GetId(s+id).ondblclick=function (){DivDisplay2(c+id,id,p+id,f+id);} //Adicionar um evento de clique duplo para o intervalo que exibe o texto da categoria
GetId(p+id).src = 'imagens/lastopen.gif';
}
}
outro{
if (!GetId(p+id).onclick){ //Não adicione a última categoria
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 = 'imagens/opened.gif';
}
}
GetId(c+id).style.display='';
ShowChild(c+id,id);
}
//Função de modificação de categoria
function ClassEdit(id,nomedaclasse){
GetId(s+id).innerHTML=nomedaclasse;
}
//Excluir função para categorias com múltiplas subcategorias
função ClassDel(id){
ShowChild(c+id,id);
SeleçãoAtual(IDAtual,id)
NavegarDireita(id);
}
//Excluir função para categorias com apenas uma subcategoria
função ClassDel1(id){
if (GetId(p+id).src.indexOf(last)>0){ //Quando a categoria é a última categoria da categoria atual
GetId(p+id).style.cursor=cursor; //Definir o estilo de passagem do mouse no ícone
GetId(p+id).onclick=function (){} //Como há apenas uma subcategoria após a exclusão, não haverá mais subcategorias, então altere o evento de clique do ícone para uma função vazia
GetId(s+id).ondblclick=function (){} //Igual ao acima
GetId(p+id).src = 'images/lastnochild.gif'; //Configurações do ícone
}
outro{
GetId(p+id).style.cursor=cursor; //Excluir operação da última categoria
GetId(p+id).onclick=função(){};
GetId(s+id).ondblclick=função(){};
GetId(p+id).src = 'images/nofollow2.gif' //A configuração do ícone aqui é diferente da anterior;
}
ShowChild(c+id,id);
CurrentSelect(IDAtual,id);
NavegarDireita(id);
}
//Passa os parâmetros para o frame direito
função BrowseRight(id){
CurrentSelect(IDAtual,id);
top.ContentFrame.location=../ArticleMain.asp?ClassID=+ id;
}
//Função para definir o status selecionado da categoria
function SeleçãoAtual(oldid,newid){
IDAtual=novoid;
document.getElementById(s+oldid).style.backgroundColor=branco;
document.getElementById(s+currentID).style.backgroundColor=#C0C0E9;
}
//Cria objeto XMLHttpRequest
função CreateXMLHttpRequest()
{
se (janela.ActiveXObject)
{
xmlHttp = novo ActiveXObject(Microsoft.XMLHTTP);
}
outro
{
xmlHttp = novo XMLHttpRequest();
}
}
//Função de processamento Ajax
//id, id da camada
//rid, o id dos dados na tabela
função ShowChild(cid,id)
{
CreateXMLHttpRequest();
if(xmlHTTP)
{
xmlHttp.open('POST','filho.asp',true);
xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
var EnviarDados = 'id='+id;
xmlHttp.send(EnviarDados);
xmlHttp.onreadystatechange=função()
{
if(xmlHttp.readyState==4)
{
se(xmlHttp.status==200)
{
GetId(cid).innerHTML = xmlHttp.responseText;
}
outro
{
GetId(cid).innerHTML='Erro:'+xmlHttp.statusText;
}
}
outro
{
GetId(cid).innerHTML=Enviando dados...;
}
}
}
outro
{
GetId(cid).innerHTML='Desculpe, seu navegador não suporta XMLHttpRequest, use IE6 ou superior! ';
}
}
//Obtém o objeto da página
//id, id da camada
função GetId(id)
{
retornar document.getElementById(id);
}
</script>
</head>
<corpo>
<!--#include arquivo=../conn.asp-->
<%
'Mostra o diretório raiz
sql=select *,(selecione o primeiro ClassID de ArticleClass onde Depth=0 ordene por ClassID desc) como lastid de ArticleClass onde Depth=0 ordene por ClassID
definir rs = conn.execute (sql)
se não rs.eof então
resposta.Write <ul>&vbcr
faça enquanto não rs.eof
se cint(trim(rs(ClassID)))=cint(trim(rs(lastid))) então
se rs(Criança)>0 então
resposta.Escreva <li><img id='p&rs(ClassID)&' src=images/lastclosed.gif onclick=DivDisplay2('c&rs(ClassID)&','&rs(ClassID)&','p&rs(ClassID)& ','f& rs(ClassID) &') style=cursor : hand;
resposta.Write <img src=images/folder.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>
outro
resposta.Write <li><img id='p& rs(ClassID) &' src=images/lastnochild.gif align=absmiddle />
resposta.Write <img src=images/folder.gif align=absmiddle id='f& rs(ClassID) &' /> <span id='s& trim(rs(ClassID)) &' onclick=BrowseRight(& trim(rs (ClassID)) &)>& rs(ClassName) &</span>
terminar se
outro
se rs(Criança)>0 então
resposta.Write <li><img id='p&rs(ClassID)&' src=images/closed.gif onclick=DivDisplay('c&rs(ClassID)&','&rs(ClassID)&','p&rs(ClassID)& ','f& rs(ClassID) &') style=cursor : hand;
resposta.Write <img src=images/folder.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>
outro
resposta.Write <li><img id='p& rs(ClassID) &' src=images/nofollow2.gif align=absmiddle />
resposta.Write <img src=images/folder.gif align=absmiddle id='f& rs(ClassID) &' /> <span id='s& trim(rs(ClassID)) &' onclick=BrowseRight(& trim(rs (ClassID)) &)>& rs(ClassName) &</span>
terminar se
terminar se
se cint(trim(rs(ClassID)))=cint(trim(rs(lastid))) então
resposta.Write <div id='c&rs(ClassID)&' style='display:none;'></div>
outro
resposta.Escreva <div id='c&rs(ClassID)&' style='display:none;' class=childdiv></div>
terminar se
resposta.Write </li>&vbcr
rs.movnext
laço
resposta.Write </ul>&vbcr
terminar se
rs.fechar
definir rs = nada
conexão.fechar
Definir conexão = Nada
%>
</body>
</html>