Structure arborescente de classification illimitée Ajax+asp avec base de données, bonnes choses, ne le manquez pas, test IE réussi, FF a un petit bug
Cls_Leibie.asp
Copiez le code comme suit :
<%
« Les champs de base de données sont des attributs de classe et les fonctions telles que l'ajout, la suppression, la modification et la vérification des opérations sont des méthodes de classe.
Classe Cls_Leibie
Private nClassID,sClassName,nParentID,sParentPath,nDepth,nRootID,nChild,nOrderID,sFilePath 'Définir des variables privées (attributs de la classe, c'est-à-dire des variables correspondant aux champs de la base de données)
RS privé, SQL, ErrorStr
Sous-classe privée_Initialize()
ErrorStr= 'Le message d'erreur d'initialisation est vide
Fin du sous-marin
Private Sub Class_Terminate() 'Ferme la connexion à la base de données lors de la destruction de la classe
Si IsObject (Conn) Alors
Conn.Fermer
SetConn=Rien
Fin si
Fin du sous-marin
'************************Définir diverses propriétés************************ ******** **************************
Propriété publique Let ClassID(str) 'Obtenir l'ID de catégorie (clé primaire)
nClassID = chaîne
call ClassProperty() 'Appelle cette fonction pour lire toutes les propriétés de la classe lors de l'obtention de l'ID de catégorie
Propriété de fin
Propriété publique Let ClassName(str) 'Obtenir le nom de la classe
sClassName=str
Propriété de fin
Propriété publique Obtenir ClassName
Nom de classe = sNom de classe
Propriété de fin
Propriété publique Let ParentID(str) 'Obtenir l'ID parent de la catégorie
nParentID=str
Propriété de fin
Propriété publique Obtenir ParentID
IDParent=nIDParent
Propriété de fin
Propriété publique Let ParentPath(str) 'Obtenir l'ID du chemin parent
sParentPath=str
Propriété de fin
Propriété publique Obtenir ParentPath
CheminParent=sCheminParent
Propriété de fin
Propriété publique Let Depth(str) 'Obtenir la profondeur de la catégorie
nProfondeur=str
Propriété de fin
Propriété publique Obtenez de la profondeur
Profondeur=nProfondeur
Propriété de fin
Propriété publique Let RootID(str) 'Obtenir l'ID racine de la catégorie
nRootID=str
Propriété de fin
Propriété publique Obtenir RootID
RootID=nRootID
Propriété de fin
Propriété publique Let Child(str) 'Nombre de sous-catégories
nEnfant=str
Propriété de fin
Propriété publique, avoir un enfant
Enfant=nEnfant
Propriété de fin
Propriété publique Let OrderID(str) 'ID de commande
nOrderID=str
Propriété de fin
Propriété publique Obtenir l'ID de commande
IDCommande=nIDCommande
Propriété de fin
Propriété publique Let FilePath(str) 'Répertoire racine du fichier de catégorie (générer un chemin de fichier statique, le blog de technologie Web Xiaozhan Laoyang utilise la génération de fichiers statiques, définissez donc ce champ)
sFilePath=str
Propriété de fin
Propriété publique Obtenir FilePath
FilePath=sFilePath
Propriété de fin
'************************************************ * *****************************
Private Sub ClassProperty() 'Lire toutes les propriétés de la classe
sql=select * from ArticleClass où ClassID=& nClassID
définir rs=conn.execute(sql)
sinon rs.eof alors
sClassName=trim(rs(ClassName))
nParentID=trim(rs(ParentID))
sParentPath=trim(rs(ParentPath))
nProfondeur=trim(rs(Profondeur))
nRootID=trim(rs(RootID))
nEnfant=trim(rs(Enfant))
nIDCommande=trim(rs(IDCommande))
sFilePath=trim(rs(FilePath))
finir si
définir rs = rien
Fin du sous-marin
Fonction publique FAddCheck() 'Ajoutez une fonction de vérification à la catégorie. Un résultat de 0 signifie que la vérification est réussie et un résultat de 1 signifie qu'une erreur se produit. Lorsqu'une erreur se produit, quittez la fonction et écrivez les informations d'erreur dans l'erreur. variable ErreurStr
temps sombre
FAjouteVérification=0
if sClassName= then 'Le nom de la classe est vide
FAjouteVérification=1
ErrorStr=Le nom de la classe ne peut pas être vide !
Fonction de sortie
autre
si nParentID= alors 'L'ID parent est vide
FAjouteVérification=1
ErrorStr=L'identifiant du parent ne peut pas être vide !
Fonction de sortie
autre
si nParentID<>0 alors
set temprs=conn.execute(select ClassID From ArticleClass which ClassID= & nParentID) 'La catégorie parent n'existe pas
si temprs.eof alors
FAjouteVérification=1
ErrorStr=La catégorie n'existe pas ou a été supprimée !
Fonction de sortie
autre
sql=sélectionnez ClassID dans ArticleClass où ClassName='& sClassName &' et ParentID=& nParentID 'Nom de classe en double
définir rs=conn.execute(sql)
sinon rs.eof alors
FAjouteVérification=1
ErrorStr=Nom de classe en double !
Fonction de sortie
finir si
définir rs = rien
finir si
settemprs = rien
autre
sql=sélectionnez ClassID dans ArticleClass où ClassName='& sClassName &' et ParentID=& nParentID 'Nom de classe en double
définir rs=conn.execute(sql)
sinon rs.eof alors
FAjouteVérification=1
ErrorStr=Nom de classe en double !
Fonction de sortie
finir si
définir rs = rien
finir si
finir si
finir si
Fonction de fin
Sous-public SAdd()
faible maxClassID, maxRootID
set rs = conn.execute(select Max(ClassID) from ArticleClass) 'Trouver le plus grand identifiant de catégorie dans la base de données actuelle, définissez-le sur 0. L'identifiant de catégorie à insérer est le plus grand identifiant actuel plus 1.
maxClassID=rs(0)
si est nul (maxClassID) alors
IDClassemax=0
finir si
définir rs = rien
nClassID=maxClassID+1
set rs=conn.execute(select max(rootid) From ArticleClass) 'Trouver le plus grand identifiant racine dans la base de données actuelle, définissez-le sur 0. L'identifiant racine à insérer est le plus grand identifiant racine actuel plus. 1
maxRootID=rs(0)
si est nul (maxRootID) alors
maxRootID = 0
finir si
nRootID=maxRootID+1
set rs=conn.execute(select RootID,Depth,ParentPath,Child,OrderID From ArticleClass which ClassID= & nParentID) 'Trouver les informations correspondantes de la catégorie parent
sinon rs.eof alors
nRootID=trim(rs(Rootid)) 'L'identifiant racine est le même que l'identifiant racine de la catégorie parent
sParentPath=trim(rs(ParentPath))& , &nParentID
if cint(trim(nParentID))>0 then 'Si l'identifiant parent est supérieur à 0, il existe une catégorie parent, donc la profondeur de la catégorie à insérer est ajoutée à la profondeur de la catégorie parent par 1. Si le L'identifiant parent n'est pas supérieur à 0, la catégorie actuelle à insérer est la catégorie racine. Ensuite, la profondeur est 0.
nProfondeur=cint(trim(rs(Profondeur)))+1
autre
nProfondeur=0
finir si
si cint(trim(rs(Enfant)))>0 alors
dimrsPrevOrderID
'Obtenir le OrderID de la dernière colonne au même niveau que cette colonne
set rsPrevOrderID=conn.execute(select Max(OrderID) From ArticleClass où ParentID= & ParentID)
prevOrderID=rsPrevOrderID(0)
'Obtenir le OrderID maximum de la sous-colonne de la même colonne parent mais plus grand que cette colonne. S'il est plus grand que la valeur précédente, utilisez plutôt cette valeur.
set rsPrevOrderID=conn.execute(select Max(OrderID) From ArticleClass où ParentPath comme ' & ParentPath & ,%')
si (pas (rsPrevOrderID.bof et rsPrevOrderID.eof)) alors
sinon IsNull(rsPrevOrderID(0)) alors
si rsPrevOrderID(0)>prevOrderID alors
prevOrderID=rsPrevOrderID(0)
finir si
finir si
finir si
définir rsPrevOrderID = rien
finir si
nIDCommande=IDCommande précédent+1
autre
nIDCommande=0
sParentPath=0
nProfondeur=0
finir si
définir rs = rien
nEnfant=0
sql=insérer dans les valeurs ArticleClass (ClassID,ClassName,ParentID,ParentPath,Depth,RootID,Child,OrderID,FilePath) (& nClassID &,'& sClassName &',& nParentID &,'& sParentPath &',& nDepth &, & nRootID &,& nChild &,& nOrderID &,'& sFilePath &')
conn.execute(sql)
si IDParent>0 alors
'Mettre à jour le nombre de sous-colonnes de sa classe parent
conn.execute (mettre à jour ArticleClass set child=child+1 où ClassID=& nParentID)
'Mettre à jour le tri de cette colonne et les numéros de séquence de tri des colonnes supérieurs à ce besoin et sous cette catégorie
si prevOrderID<> alors
conn.execute (mettre à jour ArticleClass set OrderID=OrderID+1 où rootid= & nRootid & et OrderID>& prevOrderID & et ClassID<>& nClassID)
finir si
finir si
Fin du sous-marin
Fonction publique FEditCheck() 'Fonction de vérification de modification de catégorie, le résultat est 0 signifie que la vérification a été réussie et 1 signifie qu'une erreur s'est produite. Lorsqu'une erreur se produit, quittez la fonction et écrivez les informations d'erreur dans la variable d'erreur ErrorStr.
temps sombre
FEditCheck=0
si nClassID= alors 'L'identifiant de catégorie est vide
FEditCheck=1
ErrorStr=L'identifiant de catégorie ne peut pas être vide !
Fonction de sortie
autre
if sClassName= then 'Le nom de la classe est vide
FEditCheck=1
ErrorStr=Le nom de la classe ne peut pas être vide !
Fonction de sortie
autre
si nParentID<>0 alors
set temprs=conn.execute(select ClassID From ArticleClass which ClassID= & nParentID) 'La catégorie parent n'existe pas
si temprs.eof alors
FAjouteVérification=1
ErrorStr=La catégorie n'existe pas ou a été supprimée !
Fonction de sortie
autre
set rs=conn.execute (sélectionnez ClassID dans ArticleClass où ClassName='& sClassName &' et ClassID<>& nClassID &et ParentID=& nParentID)
sinon rs.eof alors 'Nom de classe en double
FEditCheck=1
ErrorStr=Nom de classe en double !
Fonction de sortie
finir si
définir rs = rien
finir si
settemprs = rien
finir si
finir si
finir si
Fonction de fin
Public Sub SEdit() 'Modification de catégorie
sql=mettre à jour ArticleClass set ClassName='& sClassName &',FilePath='& sFilePath &' où ClassID=& nClassID
conn.execute(sql)
Fin du sous-marin
Fonction publique FDeleteCheck() 'Fonction de vérification de suppression de catégorie, le résultat est 0 signifie que la vérification a été réussie et 1 signifie qu'une erreur s'est produite. Lorsqu'une erreur se produit, quittez la fonction et écrivez les informations d'erreur dans la variable d'erreur ErrorStr.
FDeleteCheck=0 'Supprimez le code ici sans écrire la partie de suppression en cascade de l'article Lors de la suppression, vous devez le supprimer en cascade.
si nClassID= alors
FDeleteCheck=1
ErrorStr=L'identifiant de la catégorie à supprimer ne peut pas être vide !
Fonction de sortie
autre
set rs=conn.execute (sélectionnez Child dans ArticleClass où ClassID=& nClassID)
si rs.bof et rs.eof alors
FDeleteCheck=1
ErrorStr=La catégorie n'existe pas ou a été supprimée !
Fonction de sortie
autre
si trim(rs(Enfant))>0 alors
FDeleteCheck=1
ErrorStr=Cette catégorie contient des sous-catégories, veuillez supprimer ses sous-catégories avant de supprimer cette catégorie !
Fonction de sortie
finir si
finir si
finir si
Fonction de fin
Sous-SDelete public()
si nDepth>0 then 'Modifier le nombre d'enfants de l'identifiant parent
conn.execute (mettre à jour ArticleClass set child=child-1 où child>0 et ClassID= & nParentID)
finir si
sql=supprimer de ArticleClass où ClassID=& nClassID
conn.execute(sql)
Fin du sous-marin
Fonction publiqueFErrStr()
FErrStr=ErreurStr
Fonction de fin
Fin du cours
%>
index.asp
<%@LANGUAGE=VBSCRIPT CODEPAGE=65001%>
<%
'Site de l'auteur : www.guaishi.org
'E-mail : [email protected]
'QQ:514777880
Session.CodePage=65001
Réponse.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>
<tête>
<meta http-equiv=Content-Type content=text/html; charset=utf-8 />
<titre></titre>
<style type=text/css>
body{margin:0;padding:0;font-size:12px; background-color:#FFFFFF;}
ul{ list-style-type:aucun; marge:0 0 0 20px;
li{ espace blanc:nowrap; rembourrage:0;}
.childdiv{ background:url(images/dot.gif);background-repeat:repeat-y;}
span { curseur: pointeur;}
</style>
<type de script=texte/javascript>
var xmlHttp; //Définir une variable globale
var currentID=1;//Définir l'ID actuellement sélectionné Si cet ID n'existe pas, une erreur js se produira.
//Fonction principale d'affichage de la catégorie
//cid--l'identifiant de couche de la sous-catégorie
//id --identifiant de catégorie
//pid--[+] et [-] identifiant d'icône
//fid--identifiant de l'icône de catégorie
fonction DivDisplay(cid,id,pid,fid)
{
if (GetId(cid).style.display=='') //Contrôle d'affichage de l'icône lorsque la sous-catégorie n'est pas affichée
{
GetId(cid).style.display='none';
GetId(pid).src = 'images/closed.gif';
GetId(fid).src = 'images/dossier.gif';
}
else //Opérations lors du développement des sous-catégories
{
GetId(cid).style.display='';
GetId(pid).src = 'images/opened.gif';
GetId(fid).src = 'images/folderopen.gif';
if (GetId(cid).innerHTML==''||GetId(cid).innerHTML=='Soumission des données...')
{
GetId(cid).innerHTML='';
ShowChild(cid,id); //Appelle la fonction de sous-catégorie d'affichage
}
}
}
//Même effet que la fonction précédente, ne fonctionne que sur la dernière catégorie
fonction DivDisplay2(cid,id,pid,fid)
{
si (GetId(cid).style.display=='')
{
GetId(cid).style.display='none';
GetId(pid).src = 'images/lastclosed.gif';
GetId(fid).src = 'images/dossier.gif';
}
autre
{
GetId(cid).style.display='';
GetId(pid).src = 'images/lastopen.gif';
GetId(fid).src = 'images/folderopen.gif';
if (GetId(cid).innerHTML==''||GetId(cid).innerHTML=='Soumission des données...')
{
GetId(cid).innerHTML='';
ShowChild(cid,id);
}
}
}
//Fonction d'ajout de catégorie
//id--identifiant de catégorie
fonction ClassAdd(id){
if (GetId(p+id).src.indexOf(last)>0){ //Ajouter une opération pour la dernière catégorie
if (!GetId(p+id).onclick){
GetId(p+id).onclick=function (){DivDisplay2(c+id,id,p+id,f+id);} //Ajouter des événements de clic pour [+] et [-]
GetId(s+id).ondblclick=function (){DivDisplay2(c+id,id,p+id,f+id);} //Ajouter un événement de double-clic pour la plage qui affiche le texte de la catégorie
GetId(p+id).src = 'images/lastopen.gif';
}
}
autre{
if (!GetId(p+id).onclick){ //Ne pas ajouter la dernière catégorie
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);
}
//Fonction de modification de catégorie
function ClassEdit (id, nom de classe) {
GetId(s+id).innerHTML=nom de classe;
}
//Fonction de suppression pour les catégories avec plusieurs sous-catégories
fonction ClassDel(id){
ShowChild(c+id,id);
CurrentSelect (ID actuel, identifiant)
ParcourirRight(id);
}
//Fonction de suppression pour les catégories avec une seule sous-catégorie
fonction ClassDel1(id){
if (GetId(p+id).src.indexOf(last)>0){ //Lorsque la catégorie est la dernière catégorie de la catégorie actuelle
GetId(p+id).style.cursor=cursor; //Définit le style de passage de la souris de l'icône
GetId(p+id).onclick=function (){}; //Comme il n'y a qu'une seule sous-catégorie après la suppression, il n'y aura plus de sous-catégories, donc remplacez l'événement de clic d'icône par une fonction vide.
GetId(s+id).ondblclick=function (){}; //Identique à ci-dessus
GetId(p+id).src = 'images/lastnochild.gif'; //Paramètres des icônes
}
autre{
GetId(p+id).style.cursor=cursor; //Supprimer l'opération de la non-dernière catégorie
GetId(p+id).onclick=function (){};
GetId(s+id).ondblclick=function (){};
GetId(p+id).src = 'images/nofollow2.gif'; //Le paramètre d'icône ici est différent du précédent
}
ShowChild(c+id,id);
CurrentSelect(currentID,id);
ParcourirRight(id);
}
// Passe les paramètres au cadre de droite
fonction BrowseRight(id){
CurrentSelect(currentID,id);
top.ContentFrame.location=../ArticleMain.asp?ClassID=+ identifiant ;
}
//Fonction pour définir le statut sélectionné de la catégorie
fonction CurrentSelect (oldid,newid){
ID actuel = nouvel identifiant ;
document.getElementById(s+oldid).style.backgroundColor=white;
document.getElementById(s+currentID).style.backgroundColor=#C0C0E9;
}
//Créer un objet XMLHttpRequest
fonction CreateXMLHttpRequest()
{
si (window.ActiveXObject)
{
xmlHttp = nouveau ActiveXObject(Microsoft.XMLHTTP);
}
autre
{
xmlHttp = nouveau XMLHttpRequest();
}
}
//Fonction de traitement Ajax
//id, identifiant de couche
//rid, l'identifiant des données dans la table
fonction ShowChild(cid,id)
{
CreateXMLHttpRequest();
si(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=fonction()
{
si(xmlHttp.readyState==4)
{
si(xmlHttp.status==200)
{
GetId(cid).innerHTML = xmlHttp.responseText;
}
autre
{
GetId(cid).innerHTML='Erreur :'+xmlHttp.statusText;
}
}
autre
{
GetId(cid).innerHTML=Soumission des données...;
}
}
}
autre
{
GetId(cid).innerHTML='Désolé, votre navigateur ne prend pas en charge XMLHttpRequest, veuillez utiliser IE6 ou supérieur ! ';
}
}
//Récupère l'objet page
//id, identifiant de couche
fonction GetId(id)
{
return document.getElementById(id);
}
</script>
</tête>
<corps>
<!--#include file=../conn.asp-->
<%
'Afficher le répertoire racine
sql=select *, (sélectionnez le premier ClassID de ArticleClass où Depth=0, trié par ClassID desc) comme lastid de ArticleClass où Depth=0, trié par ClassID
définir rs=conn.execute(sql)
sinon rs.eof alors
réponse.Écrivez <ul>&vbcr
faire sans rs.eof
si cint(trim(rs(ClassID)))=cint(trim(rs(lastid))) alors
si rs(Enfant)>0 alors
réponse.Write <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; align=absmiddle>
réponse.Write <img src=images/folder.gif align=absmiddle id='f& rs(ClassID) &' /> <span id='s& trim(rs(ClassID)) &' onclick=BrowseRight(& trim(rs (ID de classe)) &) ondblclick=DivDisplay2('c&rs(ClassID)&','&rs(ClassID)&','p&rs(ClassID)&','f& rs(ClassID) &')>& rs(ClassName) &</span>
autre
réponse.Write <li><img id='p& rs(ClassID) &' src=images/lastnochild.gif align=absmiddle />
réponse.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>
finir si
autre
si rs(Enfant)>0 alors
réponse.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; align=absmiddle>
réponse.Write <img src=images/folder.gif align=absmiddle id='f& rs(ClassID) &' /> <span id='s& trim(rs(ClassID)) &' onclick=BrowseRight(& trim(rs (ID de classe)) &) ondblclick=DivDisplay('c&rs(ClassID)&','&rs(ClassID)&','p&rs(ClassID)&','f& rs(ClassID) &')>& rs(ClassName) &</span>
autre
réponse.Write <li><img id='p& rs(ClassID) &' src=images/nofollow2.gif align=absmiddle />
réponse.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>
finir si
finir si
si cint(trim(rs(ClassID)))=cint(trim(rs(lastid))) alors
réponse.Write <div id='c&rs(ClassID)&' style='display:none;'></div>
autre
réponse.Write <div id='c&rs(ClassID)&' style='display:none;' class=childdiv></div>
finir si
réponse.Ecrire </li>&vbcr
rs.movenext
boucle
réponse.Ecrire </ul>&vbcr
finir si
rs.fermer
définir rs = rien
connexion.fermer
Définir la connexion = Rien
%>
</corps>
</html>