Estructura de árbol de clasificación ilimitada Ajax+asp con base de datos, buen material, no te lo pierdas, la prueba de IE pasó, FF tiene un pequeño error
Cls_Leibie.asp
Copie el código de código de la siguiente manera:
<%
'Los campos de la base de datos son atributos de clase y funciones como agregar, eliminar, modificar y verificar operaciones son métodos de clase.
Clase Cls_Leibie
Private nClassID,sClassName,nParentID,sParentPath,nDepth,nRootID,nChild,nOrderID,sFilePath 'Define variables privadas (atributos de la clase, es decir, variables correspondientes a los campos de la base de datos)
rs privados, sql, ErrorStr
Subclase privada_Initialize()
ErrorStr= 'El mensaje de error de inicialización está vacío
Subtítulo final
Private Sub Class_Terminate() 'Cierra la conexión de la base de datos al destruir la clase
Si esObjeto(Conn) Entonces
Conexión.Cerrar
SetConn=Nada
Terminar si
Subtítulo final
'************************Establecer varias propiedades********************** ******** ****************************
Propiedad pública Let ClassID(str) 'Obtener el ID de categoría (clave principal)
nClassID=cadena
call ClassProperty() 'Llame a esta función para leer todas las propiedades de la clase al obtener el ID de categoría
Propiedad final
Propiedad pública Let ClassName(str) 'Obtener el nombre de la clase
sClassName=cadena
Propiedad final
Propiedad pública Obtener nombre de clase
NombreClase=sNombreClase
Propiedad final
Propiedad pública Let ParentID(str) 'Obtener la categoría ID de padre
nParentID=cadena
Propiedad final
Propiedad pública Obtener ParentID
ID de padre=nID de padre
Propiedad final
Propiedad pública Let ParentPath(str) 'Obtener el ID de la ruta principal
sParentPath=cadena
Propiedad final
Propiedad pública Obtenga ParentPath
ParentPath=sParentPath
Propiedad final
Propiedad pública Let Depth(str) 'Obtener profundidad de categoría
nProfundidad=cadena
Propiedad final
La propiedad pública obtiene profundidad
Profundidad=nProfundidad
Propiedad final
Propiedad pública Let RootID(str) 'Obtener el ID raíz de la categoría
nRootID=cadena
Propiedad final
Propiedad pública Obtener RootID
ID de raíz=nID de raíz
Propiedad final
Propiedad pública Let Child(str) 'Número de subcategorías
nniño=cadena
Propiedad final
Propiedad pública obtener niño
Niño=nNiño
Propiedad final
Propiedad pública Let OrderID(str) 'ID de pedido
nIDOrden=cadena
Propiedad final
Propiedad pública Obtener ID de pedido
ID de pedido=nID de pedido
Propiedad final
Propiedad pública Let FilePath(str) 'Directorio raíz del archivo de categoría (genera una ruta de archivo estática, el blog de tecnología web Xiaozhan Laoyang utiliza la generación de archivos estáticos, así que configure este campo)
sFilePath=cadena
Propiedad final
Propiedad pública Obtener FilePath
RutaArchivo=sRutaArchivo
Propiedad final
'************************************************ * *******************************
Private Sub ClassProperty() 'Lee todas las propiedades de la clase
sql=select * de ArticleClass donde ClassID=& nClassID
establecer rs=conn.execute(sql)
si no rs.eof entonces
sClassName=trim(rs(ClassName))
nParentID=recortar(rs(ParentID))
sParentPath=recortar(rs(ParentPath))
nProfundidad=recortar(rs(Profundidad))
nRootID=recortar(rs(RootID))
nNiño=recortar(rs(Niño))
nIDOrden=recortar(rs(IDOrden))
sFilePath=recortar(rs(FilePath))
terminar si
establecer rs = nada
Subtítulo final
Función pública FAddCheck() 'Agrega una función de verificación a la categoría. Un resultado de 0 significa que se pasa la verificación y un resultado de 1 significa que ocurre un error. Cuando ocurre un error, salga de la función y escriba la información del error. variable ErrorStr
temperaturas tenues
FAddCheck=0
si sClassName= entonces 'El nombre de la clase está vacío
FAddCheck=1
ErrorStr=¡El nombre de la clase no puede estar vacío!
Función de salida
demás
si nParentID= entonces 'El ID del padre está vacío
FAddCheck=1
ErrorStr=¡La identificación del padre no puede estar vacía!
Función de salida
demás
si nParentID<>0 entonces
set temprs=conn.execute(seleccione ClassID de ArticleClass donde ClassID= & nParentID) 'La categoría principal no existe
si temprs.eof entonces
FAddCheck=1
ErrorStr=¡La categoría no existe o ha sido eliminada!
Función de salida
demás
sql=seleccione ClassID de ArticleClass donde ClassName='& sClassName &' y ParentID=& nParentID 'Nombre de clase duplicada
establecer rs=conn.execute(sql)
si no rs.eof entonces
FAddCheck=1
ErrorStr=¡Nombre de clase duplicado!
Función de salida
terminar si
establecer rs = nada
terminar si
settemprs=nada
demás
sql=seleccione ClassID de ArticleClass donde ClassName='& sClassName &' y ParentID=& nParentID 'Nombre de clase duplicada
establecer rs=conn.execute(sql)
si no rs.eof entonces
FAddCheck=1
ErrorStr=¡Nombre de clase duplicado!
Función de salida
terminar si
establecer rs = nada
terminar si
terminar si
terminar si
Función final
Public Sub SAAdd()
tenue maxClassID,maxRootID
set rs = conn.execute(select Max(ClassID) from ArticleClass) 'Encuentre el ID de categoría más grande en la base de datos actual. Si no hay datos, configúrelo en 0. El ID de categoría que se insertará es el ID más grande actual más 1.
maxClassID=rs(0)
si es nulo (maxClassID) entonces
maxClassID=0
terminar si
establecer rs = nada
nClaseID=maxClaseID+1
set rs=conn.execute(select max(rootid) From ArticleClass) 'Encuentre el ID de raíz más grande en la base de datos actual. Si no hay datos, configúrelo en 0. El ID de raíz que se insertará es el ID de raíz más grande actual más. 1
maxRootID=rs(0)
si es nulo (maxRootID) entonces
maxRootID=0
terminar si
nRootID=maxRootID+1
set rs=conn.execute(select RootID,Profundidad,ParentPath,Child,OrderID From ArticleClass donde ClassID= & nParentID) 'Busca la información correspondiente de la categoría principal
si no rs.eof entonces
nRootID=trim(rs(Rootid)) 'El ID de raíz es el mismo que el ID de raíz de la categoría principal
sParentPath=trim(rs(ParentPath))&, &nParentID
if cint(trim(nParentID))>0 entonces 'Si la identificación principal es mayor que 0, hay una categoría principal, por lo que la profundidad de la categoría que se va a insertar se suma a la profundidad de la categoría principal en 1. Si el La identificación principal no es mayor que 0, la categoría actual que se insertará es la categoría raíz. Entonces la profundidad es 0.
nProfundidad=cint(recortar(rs(Profundidad)))+1
demás
nProfundidad=0
terminar si
si cint(trim(rs(Child)))>0 entonces
dimrsPrevOrderID
'Obtiene el ID de pedido de la última columna al mismo nivel que esta columna
establezca rsPrevOrderID=conn.execute (seleccione Max(OrderID) de ArticleClass donde ParentID= y ParentID)
IDOrdenPrev=rsIDOrdenPrev(0)
'Obtiene el ID de pedido máximo de la subcolumna de la misma columna principal pero mayor que esta columna. Si es mayor que el valor anterior, utilice este valor en su lugar.
establezca rsPrevOrderID=conn.execute (seleccione Max(OrderID) de ArticleClass donde ParentPath sea como '& ParentPath &,%')
si (no (rsPrevOrderID.bof y rsPrevOrderID.eof)) entonces
si no es IsNull(rsPrevOrderID(0)) entonces
si rsPrevOrderID(0)>prevOrderID entonces
IDOrdenPrev=rsIDOrdenPrev(0)
terminar si
terminar si
terminar si
establecer rsPrevOrderID = nada
terminar si
nIDOrden=IDOrdenAnterior+1
demás
nID de pedido=0
sParentPath=0
nProfundidad=0
terminar si
establecer rs = nada
nniño=0
sql=insertar en ArticleClass (ClassID,ClassName,ParentID,ParentPath,Profundidad,RootID,Child,OrderID,FilePath) valores (& nClassID &,'& sClassName &',& nParentID &,'& sParentPath &',& nDepth &, & nRootID &,& nChild &,& nOrderID &,'& sFilePath &')
conexión.ejecutar(sql)
si ParentID>0 entonces
'Actualiza el número de subcolumnas de su clase padre
conn.execute (actualizar el conjunto de clase de artículo niño=niño+1 donde ClassID=& nParentID)
'Actualizar la clasificación de esta columna y los números de secuencia de clasificación de las columnas que son mayores que esta necesidad y en esta categoría
si prevOrderID<> entonces
conn.execute (actualizar ArticleClass set OrderID=OrderID+1 donde rootid= & nRootid & y OrderID>& prevOrderID & y ClassID<>& nClassID)
terminar si
terminar si
Subtítulo final
Función pública FEditCheck() 'Función de verificación de modificación de categoría, el resultado es 0 significa que se pasó la verificación y 1 significa que se produjo un error. Cuando ocurre un error, salga de la función y escriba la información del error en la variable de error ErrorStr.
temperaturas tenues
FEditCheck=0
si nClassID = entonces 'el ID de categoría está vacío
FEditCheck=1
ErrorStr=¡El ID de categoría no puede estar vacío!
Función de salida
demás
si sClassName= entonces 'El nombre de la clase está vacío
FEditCheck=1
ErrorStr=¡El nombre de la clase no puede estar vacío!
Función de salida
demás
si nParentID<>0 entonces
set temprs=conn.execute(seleccione ClassID de ArticleClass donde ClassID= & nParentID) 'La categoría principal no existe
si temprs.eof entonces
FAddCheck=1
ErrorStr=¡La categoría no existe o ha sido eliminada!
Función de salida
demás
set rs=conn.execute(seleccione ClassID de ArticleClass donde ClassName='& sClassName &' y ClassID<>& nClassID &y ParentID=& nParentID)
si no es rs.eof entonces 'Nombre de clase duplicada
FEditCheck=1
ErrorStr=¡Nombre de clase duplicado!
Función de salida
terminar si
establecer rs = nada
terminar si
settemprs=nada
terminar si
terminar si
terminar si
Función final
Public Sub SEdit() 'Modificación de categoría
sql=actualizar ArticleClass set ClassName='& sClassName &',FilePath='& sFilePath &' donde ClassID=& nClassID
conexión.ejecutar(sql)
Subtítulo final
Función pública FDeleteCheck() 'Función de verificación de eliminación de categoría, el resultado es 0 significa que se pasó la verificación y 1 significa que se produjo un error. Cuando ocurre un error, salga de la función y escriba la información del error en la variable de error ErrorStr.
FDeleteCheck=0 'Elimine el código aquí sin escribir la parte de eliminación en cascada del artículo. Al eliminarlo, debe eliminarlo en cascada.
si nClassID = entonces
FDeleteCheck=1
ErrorStr=¡La identificación de categoría a eliminar no puede estar vacía!
Función de salida
demás
set rs=conn.execute(seleccione Niño de ArticleClass donde ClassID=& nClassID)
si rs.bof y rs.eof entonces
FDeleteCheck=1
ErrorStr=¡La categoría no existe o ha sido eliminada!
Función de salida
demás
si trim(rs(Child))>0 entonces
FDeleteCheck=1
ErrorStr=Esta categoría contiene subcategorías, ¡borre sus subcategorías antes de eliminar esta categoría!
Función de salida
terminar si
terminar si
terminar si
Función final
Sub SDeliminar pública()
si nDepth>0 entonces 'Modificar el número de hijos de la identificación del padre
conn.execute (actualizar el conjunto ArticleClass child=child-1 donde child>0 y ClassID= & nParentID)
terminar si
sql=eliminar de ArticleClass donde ClassID=& nClassID
conexión.ejecutar(sql)
Subtítulo final
Función públicaFErrStr()
FErrStr=ErrorStr
Función final
Fin de clase
%>
índice.asp
<%@LANGUAGE=PÁGINA DE CÓDIGOS VBSCRIPT=65001%>
<%
'Sitio del autor: www.guaishi.org
'Correo electrónico: [email protected]
'QQ:514777880
Sesión.CodePage=65001
Respuesta.Charset = utf-8
%>
<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transicional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd>
<html xmlns=http://www.w3.org/1999/xhtml>
<cabeza>
<meta http-equiv=Tipo de contenido content=text/html;charset=utf-8 />
<título></título>
<tipo de estilo=texto/css>
cuerpo{margen:0;relleno:0;tamaño de fuente:12px; color de fondo:#FFFFFF;}
ul{ tipo-estilo de lista: ninguno; margen: 0 0 0 20px;
li{ espacio en blanco:nowrap; relleno:0;}
.childdiv{ fondo:url(imágenes/punto.gif);repetición de fondo:repetir-y;}
abarcar {cursor:puntero;}
</estilo>
<tipo de script=texto/javascript>
var xmlHttp; //Definir una variable global
var currentID=1;//Establezca la ID seleccionada actualmente. Si esta ID no existe, se producirá un error de js.
// Función principal de visualización de categorías
//cid--el id de capa de la subcategoría
//id --id de categoría
//pid--[+] y [-] ID del icono
//fid--id del icono de categoría
función DivDisplay(cid,id,pid,fid)
{
if (GetId(cid).style.display=='') //Control de visualización de iconos cuando no se muestra la subcategoría
{
GetId(cid).style.display='none';
GetId(pid).src = 'imágenes/closed.gif';
GetId(fid).src = 'imágenes/carpeta.gif';
}
else //Operaciones al expandir subcategorías
{
GetId(cid).style.display='';
GetId(pid).src = 'imágenes/abierto.gif';
GetId(fid).src = 'imágenes/carpetaopen.gif';
if (GetId(cid).innerHTML==''||GetId(cid).innerHTML=='Enviando datos...')
{
GetId(cid).innerHTML='';
ShowChild(cid,id); //Llama a la función de subcategoría de visualización
}
}
}
//Mismo efecto que la función anterior, solo funciona en la última categoría
función DivDisplay2(cid,id,pid,fid)
{
si (GetId(cid).style.display=='')
{
GetId(cid).style.display='none';
GetId(pid).src = 'imagenes/lastclosed.gif';
GetId(fid).src = 'imágenes/carpeta.gif';
}
demás
{
GetId(cid).style.display='';
GetId(pid).src = 'imagenes/lastopen.gif';
GetId(fid).src = 'imágenes/carpetaopen.gif';
if (GetId(cid).innerHTML==''||GetId(cid).innerHTML=='Enviando datos...')
{
GetId(cid).innerHTML='';
MostrarChild(cid,id);
}
}
}
// Función de agregar categoría
//id--id de categoría
función ClassAdd(id){
if (GetId(p+id).src.indexOf(last)>0){ //Agregar operación para la última categoría
si (!GetId(p+id).onclick){
GetId(p+id).onclick=function (){DivDisplay2(c+id,id,p+id,f+id);} //Agregar eventos de clic para [+] y [-]
GetId(s+id).ondblclick=function (){DivDisplay2(c+id,id,p+id,f+id);} //Agrega un evento de doble clic para el intervalo que muestra el texto de la categoría.
GetId(p+id).src = 'imagenes/lastopen.gif';
}
}
demás{
if (!GetId(p+id).onclick){ //No agregue la última categoría
GetId(p+id).onclick=function (){DivDisplay(c+id,id,p+id,f+id);};
GetId(s+id).ondblclick=función (){DivDisplay(c+id,id,p+id,f+id);};
GetId(p+id).src = 'imágenes/abierto.gif';
}
}
GetId(c+id).style.display='';
MostrarChild(c+id,id);
}
//Función de modificación de categoría
función ClassEdit(id,nombre de clase){
GetId(s+id).innerHTML=nombre de clase;
}
//Función de eliminación para categorías con múltiples subcategorías
función ClassDel(id){
MostrarChild(c+id,id);
SelecciónActual(IDactual,id)
NavegarDerecha(id);
}
//Función de eliminación para categorías con una sola subcategoría
función ClassDel1(id){
if (GetId(p+id).src.indexOf(last)>0){ //Cuando la categoría es la última categoría de la categoría actual
GetId(p+id).style.cursor=cursor; //Establece el estilo de paso del mouse del icono
GetId(p+id).onclick=function (){}; // Debido a que solo hay una subcategoría después de la eliminación, no habrá más subcategorías, así que cambie el evento de clic del ícono a una función vacía
GetId(s+id).ondblclick=function (){} //Igual que el anterior.
GetId(p+id).src = 'images/lastnochild.gif'; //Configuración de iconos
}
demás{
GetId(p+id).style.cursor=cursor; //Eliminar operación de la categoría que no es la última
GetId(p+id).onclick=función (){};
GetId(s+id).ondblclick=función (){};
GetId(p+id).src = 'images/nofollow2.gif'; //La configuración del icono aquí es diferente a la anterior.
}
MostrarChild(c+id,id);
SelecciónActual(IDactual,id);
NavegarDerecha(id);
}
//Pasar parámetros al fotograma derecho
función NavegarDerecha(id){
SelecciónActual(IDactual,id);
top.ContentFrame.location=../ArticleMain.asp?ClassID=+ identificación;
}
//Función para establecer el estado seleccionado de la categoría
función CurrentSelect(oldid,newid){
IDactual=nuevoID;
document.getElementById(s+oldid).style.backgroundColor=blanco;
document.getElementById(s+currentID).style.backgroundColor=#C0C0E9;
}
//Crear objeto XMLHttpRequest
función CreateXMLHttpRequest()
{
si (ventana.ActiveXObject)
{
xmlHttp = nuevo ActiveXObject(Microsoft.XMLHTTP);
}
demás
{
xmlHttp = nueva XMLHttpRequest();
}
}
//Función de procesamiento Ajax
//id, identificación de capa
//rid, la identificación de los datos en la tabla
función ShowChild(cid,id)
{
CrearXMLHttpRequest();
si(xmlHttp)
{
xmlHttp.open('POST','child.asp',verdadero);
xmlHttp.setRequestHeader('Tipo de contenido','aplicación/x-www-form-urlencoded');
var EnviarDatos = 'id='+id;
xmlHttp.send(EnviarDatos);
xmlHttp.onreadystatechange=función()
{
si(xmlHttp.readyState==4)
{
si(xmlHttp.status==200)
{
GetId(cid).innerHTML = xmlHttp.responseText;
}
demás
{
GetId(cid).innerHTML='Error:'+xmlHttp.statusText;
}
}
demás
{
GetId(cid).innerHTML=Enviando datos...;
}
}
}
demás
{
GetId(cid).innerHTML='Lo sentimos, su navegador no admite XMLHttpRequest, utilice IE6 o superior. ';
}
}
//Obtener el objeto de la página
//id, id de capa
función ObtenerId(identificación)
{
devolver document.getElementById(id);
}
</script>
</cabeza>
<cuerpo>
<!--#include file=../conn.asp-->
<%
'Mostrar directorio raíz
sql=select *,(seleccione el 1 ClassID superior de ArticleClass donde Depth=0 ordene por ClassID desc) como último ID de ArticleClass donde Depth=0 ordene por ClassID
establecer rs=conn.execute(sql)
si no rs.eof entonces
respuesta.Escribir <ul>&vbcr
hacer mientras no rs.eof
si cint(trim(rs(ClassID)))=cint(trim(rs(lastid))) entonces
si rs(Niño)>0 entonces
respuesta.Escribir <li><img id='p&rs(ClassID)&' src=images/lastclosed.gif onclick=DivDisplay2('c&rs(ClassID)&','&rs(ClassID)&','p&rs(ClassID)& ','f& rs(ClassID) &') estilo=cursor: mano; align=absmiddle>
respuesta.Escribir <img src=images/folder.gif align=absmiddle id='f& rs(ClassID) &' /> <span id='s& trim(rs(ClassID)) &' onclick=BrowseRight(& trim(rs (ID de clase)) &) ondblclick=DivDisplay2('c&rs(ClassID)&','&rs(ClassID)&','p&rs(ClassID)&','f& rs(ClassID) &')>& rs(ClassName) &</span>
demás
respuesta.Escribir <li><img id='p& rs(ClassID) &' src=images/lastnochild.gif align=absmiddle />
respuesta.Escribir <img src=images/folder.gif align=absmiddle id='f& rs(ClassID) &' /> <span id='s& trim(rs(ClassID)) &' onclick=BrowseRight(& trim(rs (ID de clase)) &)>& rs(Nombre de clase) &</span>
terminar si
demás
si rs(Niño)>0 entonces
respuesta.Escribir <li><img id='p&rs(ClassID)&' src=images/closed.gif onclick=DivDisplay('c&rs(ClassID)&','&rs(ClassID)&','p&rs(ClassID)& ','f& rs(ClassID) &') estilo=cursor: mano; align=absmiddle>
respuesta.Escribir <img src=images/folder.gif align=absmiddle id='f& rs(ClassID) &' /> <span id='s& trim(rs(ClassID)) &' onclick=BrowseRight(& trim(rs (ID de clase)) &) ondblclick=DivDisplay('c&rs(ClassID)&','&rs(ClassID)&','p&rs(ClassID)&','f& rs(ClassID) &')>& rs(ClassName) &</span>
demás
respuesta.Escribir <li><img id='p& rs(ClassID) &' src=images/nofollow2.gif align=absmiddle />
respuesta.Escribir <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 si
terminar si
si cint(trim(rs(ClassID)))=cint(trim(rs(lastid))) entonces
respuesta.Escribir <div id='c&rs(ClassID)&' style='display:none;'></div>
demás
respuesta.Escribir <div id='c&rs(ClassID)&' style='display:none;' class=childdiv></div>
terminar si
respuesta.Escribir </li>&vbcr
rs.movenext
bucle
respuesta.Escribir </ul>&vbcr
terminar si
rs.cerrar
establecer rs = nada
con.cerrar
Establecer conexión = Nada
%>
</cuerpo>
</html>