Ajax+asp неограниченная древовидная структура классификации с базой данных, хорошая штука, не пропустите, тест IE пройден, в FF есть небольшая ошибка
Cls_Leibie.asp
Скопируйте код кода следующим образом:
<%
«Поля базы данных — это атрибуты класса, а такие функции, как добавление, удаление, изменение и проверка операций, — это методы класса.
Класс Cls_Leibie
Private nClassID,sClassName,nParentID,sParentPath,nDepth,nRootID,nChild,nOrderID,sFilePath 'Определить частные переменные (атрибуты класса, то есть переменные, соответствующие полям базы данных)
Частный rs,sql,ErrorStr
Частный подкласс_Initialize()
ErrorStr= 'Сообщение об ошибке инициализации пусто
Конец субтитра
Private Sub Class_Terminate() 'Закрывает соединение с базой данных при уничтожении класса
Если IsObject(Conn) Тогда
Конн.Закрыть
SetConn=Ничего
Конец, если
Конец субтитра
'************************Установите различные свойства************************ ******** ***************************
Открытое свойство Let ClassID(str) 'Получить идентификатор категории (первичный ключ)
nClassID=str
call ClassProperty() 'Вызовите эту функцию, чтобы считывать все свойства класса при получении идентификатора категории
Конечная собственность
Открытое свойство Let ClassName(str) 'Получить имя класса
sClassName=str
Конечная собственность
Открытая собственность Получить имя класса
ИмяКласса=sИмяКласса
Конечная собственность
Открытое свойство Let ParentID(str) 'Получить родительский идентификатор категории
nParentID=str
Конечная собственность
Публичная собственность Получить ParentID
ParentID=nParentID
Конечная собственность
Открытое свойство Let ParentPath(str) 'Получить идентификатор родительского пути
sParentPath=str
Конечная собственность
Открытая собственность Получить ParentPath
ParentPath=sParentPath
Конечная собственность
Открытое свойство Let Depth(str) 'Получить глубину категории
nDepth=str
Конечная собственность
Общественная собственность Получить глубину
Глубина=nГлубина
Конечная собственность
Открытое свойство Let RootID(str) 'Получить корневой идентификатор категории
nRootID=str
Конечная собственность
Публичная собственность Получить RootID
RootID=nRootID
Конечная собственность
Public Property Let Child(str) 'Количество подкатегорий
nChild=str
Конечная собственность
Общественная собственность Получить ребенка
Ребенок=nChild
Конечная собственность
Открытое свойство Let OrderID(str) 'Идентификатор заказа
nOrderID=str
Конечная собственность
Публичная собственность Получить OrderID
OrderID=nOrderID
Конечная собственность
Открытое свойство Let FilePath(str) 'Корневой каталог файла категории (создать статический путь к файлу, блог веб-технологий Xiaozhan Laoyang использует генерацию статического файла, поэтому установите это поле)
sFilePath=str
Конечная собственность
Открытая собственность Получить FilePath
FilePath=sFilePath
Конечная собственность
'********************************************** * ******************************
Private Sub ClassProperty() 'Читать все свойства класса
sql=select * из ArticleClass, где ClassID=& nClassID
установить rs=conn.execute(sql)
если не rs.eof, то
sClassName=trim(rs(ClassName))
nParentID=trim(rs(ParentID))
sParentPath = обрезка (rs (ParentPath))
nDepth=обрезать(rs(Глубина))
nRootID=trim(rs(RootID))
nChild=обрезать(rs(Дочерний))
nOrderID=trim(rs(OrderID))
sFilePath = обрезка (rs (FilePath))
конец, если
установить rs=ничего
Конец субтитра
Открытая функция FAddCheck() 'Добавить проверочную функцию в категорию. Результат 0 означает, что проверка пройдена, а результат 1 означает, что произошла ошибка. При возникновении ошибки выйдите из функции и запишите информацию об ошибке в ошибку. переменная ErrorStr
тусклые температуры
FAddCheck=0
if sClassName= then 'Имя класса пусто
FAddCheck=1
ErrorStr=Имя класса не может быть пустым!
выход из функции
еще
если nParentID=, то «Идентификатор родителя пуст»
FAddCheck=1
ErrorStr=Идентификатор родителя не может быть пустым!
выход из функции
еще
если nParentID<>0, то
set temprs=conn.execute(выберите ClassID From ArticleClass, где ClassID= и nParentID) 'Родительская категория не существует
если temprs.eof тогда
FAddCheck=1
ErrorStr=Категория не существует или была удалена!
выход из функции
еще
sql=select ClassID из ArticleClass, где ClassName='& sClassName &' и ParentID=& nParentID 'Дублируемое имя класса
установить rs=conn.execute(sql)
если не rs.eof, то
FAddCheck=1
ErrorStr=Повторяющееся имя класса!
выход из функции
конец, если
установить rs=ничего
конец, если
settemprs=ничего
еще
sql=select ClassID из ArticleClass, где ClassName='& sClassName &' и ParentID=& nParentID 'Дублируемое имя класса
установить rs=conn.execute(sql)
если не rs.eof, то
FAddCheck=1
ErrorStr=Повторяющееся имя класса!
выход из функции
конец, если
установить rs=ничего
конец, если
конец, если
конец, если
Конечная функция
Публичная подписка SAdd()
тусклый maxClassID,maxRootID
set rs = conn.execute(select Max(ClassID) from ArticleClass) 'Найти наибольший идентификатор категории в текущей базе данных, установите для него значение 0. Вставляемый идентификатор категории равен текущему самому большому идентификатору плюс 1.
maxClassID=rs(0)
если isnull(maxClassID), то
МаксКлассИД=0
конец, если
установить rs=ничего
nClassID=maxClassID+1
set rs=conn.execute(select max(rootid) From ArticleClass) 'Найти наибольший идентификатор корня в текущей базе данных, если данных нет, установите его равным 0. Вставляемый идентификатор корня равен текущему самому большому идентификатору корня плюс. 1
maxRootID=rs(0)
если isnull(maxRootID), то
maxRootID=0
конец, если
nRootID=maxRootID+1
set rs=conn.execute(select RootID,Depth,ParentPath,Child,OrderID From ArticleClass, где ClassID= & nParentID) 'Найти соответствующую информацию родительской категории
если не rs.eof, то
nRootID=trim(rs(Rootid)) 'Идентификатор корня такой же, как идентификатор корня родительской категории
sParentPath=trim(rs(ParentPath))& , &nParentID
if cint(trim(nParentID))>0 then 'Если родительский идентификатор больше 0, родительская категория существует, поэтому глубина вставляемой категории добавляется к глубине родительской категории на 1. Если родительский идентификатор не больше 0, текущая вставляемая категория является корневой. Тогда глубина равна 0.
nDepth=cint(trim(rs(Depth)))+1
еще
nDepth=0
конец, если
если cint(trim(rs(Child)))>0, то
димрспревордерид
'Получаем OrderID последнего столбца на том же уровне, что и этот столбец
set rsPrevOrderID=conn.execute (выберите Max(OrderID) From ArticleClass, где ParentID= и ParentID)
prevOrderID=rsPrevOrderID(0)
'Получить максимальный OrderID подстолбца того же родительского столбца, но больше, чем этот столбец. Если он больше предыдущего значения, используйте вместо этого это значение.
set rsPrevOrderID=conn.execute (выберите Max(OrderID) From ArticleClass, где ParentPath, например ' & ParentPath &,%')
если (не(rsPrevOrderID.bof и rsPrevOrderID.eof)) то
если не IsNull(rsPrevOrderID(0)) то
если rsPrevOrderID(0)>prevOrderID, то
prevOrderID=rsPrevOrderID(0)
конец, если
конец, если
конец, если
установить rsPrevOrderID=ничего
конец, если
nOrderID=prevOrderID+1
еще
nOrderID=0
sParentPath=0
nDepth=0
конец, если
установить rs=ничего
nChild=0
sql=вставить в значения ArticleClass (ClassID,ClassName,ParentID,ParentPath,Depth,RootID,Child,OrderID,FilePath) (& nClassID &,'& sClassName &',& nParentID &,'& sParentPath &',& nDepth &, & nRootID &,& nChild &,& nOrderID &,'& sFilePath &')
conn.execute(sql)
если ParentID>0, то
'Обновляем количество подстолбцов родительского класса
conn.execute(обновить ArticleClass set child=child+1, где ClassID=& nParentID)
'Обновить сортировку этого столбца и порядковые номера сортировки столбцов, которые превышают эту потребность и относятся к этой категории.
если prevOrderID<> тогда
conn.execute(обновить набор ArticleClass OrderID=OrderID+1, где rootid= & nRootid & и OrderID>& prevOrderID & и ClassID<>& nClassID)
конец, если
конец, если
Конец субтитра
Открытая функция FEditCheck() 'Функция проверки модификации категории, результат 0 означает, что проверка пройдена, а 1 означает, что произошла ошибка. При возникновении ошибки выйдите из функции и запишите информацию об ошибке в переменную ошибки ErrorStr.
тусклые температуры
FEditCheck=0
if nClassID= then 'Идентификатор категории пуст
FEditCheck=1
ErrorStr=Идентификатор категории не может быть пустым!
выход из функции
еще
if sClassName= then 'Имя класса пусто
FEditCheck=1
ErrorStr=Имя класса не может быть пустым!
выход из функции
еще
если nParentID<>0, то
set temprs=conn.execute(выберите ClassID From ArticleClass, где ClassID= & nParentID) 'Родительская категория не существует
если temprs.eof тогда
FAddCheck=1
ErrorStr=Категория не существует или была удалена!
выход из функции
еще
set rs=conn.execute (выберите ClassID из ArticleClass, где ClassName='& sClassName &' и ClassID<>& nClassID &and ParentID=& nParentID)
если не rs.eof, то «Дубликат имени класса»
FEditCheck=1
ErrorStr=Повторяющееся имя класса!
выход из функции
конец, если
установить rs=ничего
конец, если
settemprs=ничего
конец, если
конец, если
конец, если
Конечная функция
Public Sub SEdit() 'Модификация категории
sql=update ArticleClass set ClassName='& sClassName &',FilePath='& sFilePath &' где ClassID=& nClassID
conn.execute(sql)
Конец субтитра
Public Function FDeleteCheck() 'Функция проверки удаления категории, результат 0 означает, что проверка пройдена, а 1 означает, что произошла ошибка. При возникновении ошибки выйдите из функции и запишите информацию об ошибке в переменную ошибки ErrorStr.
FDeleteCheck=0 'Удалите код здесь, не записывая часть статьи о каскадном удалении. При удалении необходимо каскадно удалить ее.
если nClassID= тогда
FDeleteCheck=1
ErrorStr=Идентификатор удаляемой категории не может быть пустым!
выход из функции
еще
set rs=conn.execute (выберите дочерний элемент из ArticleClass, где ClassID=& nClassID)
если rs.bof и rs.eof, то
FDeleteCheck=1
ErrorStr=Категория не существует или была удалена!
выход из функции
еще
если Trim(rs(Child))>0, то
FDeleteCheck=1
ErrorStr=Эта категория содержит подкатегории, пожалуйста, удалите подкатегории перед удалением этой категории!
выход из функции
конец, если
конец, если
конец, если
Конечная функция
Публичная подписка SDelete()
если nDepth>0, то «Изменить количество дочерних элементов родительского идентификатора»
conn.execute(обновить ArticleClass set child=child-1, где child>0 и ClassID= & nParentID)
конец, если
sql=удалить из ArticleClass, где ClassID=& nClassID
conn.execute(sql)
Конец субтитра
Открытая функцияFErrStr()
FErrStr=ErrorStr
Конечная функция
Конечный класс
%>
index.asp
<%@LANGUAGE=КОДОВАЯ СТРАНИЦА VBSCRIPT=65001%>
<%
Сайт автора: www.guaishi.org.
Электронная почта: [email protected]
'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>
<голова>
<meta http-equiv=Content-Type content=text/html; charset=utf-8 />
<title></title>
<тип стиля=текст/css>
тело {маржа: 0; отступ: 0; размер шрифта: 12 пикселей; цвет фона: # FFFFFF;}
ul {тип-стиля списка: нет поля: 0 0 0 20 пикселей;
li {пробел:nowrap; дополнение: 0;}
.childdiv{background:url(images/dot.gif);background-repeat:repeat-y;}
диапазон {курсор: указатель;}
</стиль>
<тип сценария=текст/javascript>
var xmlHttp; //Определение глобальной переменной
var currentID=1;//Установить текущий выбранный идентификатор. Если этот идентификатор не существует, произойдет ошибка js.
//Основная функция отображения категории
//cid — идентификатор слоя подкатегории
//id --идентификатор категории
//pid--[+] и [-] идентификатор значка
//fid — идентификатор значка категории
функция 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); //Вызов функции отображения подкатегории
}
}
}
//Тот же эффект, что и предыдущая функция, работает только с последней категорией
функция DivDisplay2(cid,id,pid,fid)
{
если (GetId(cid).style.display=='')
{
GetId(cid).style.display='none';
GetId(pid).src = 'images/lastclosed.gif';
GetId(fid).src = 'images/folder.gif';
}
еще
{
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 — идентификатор категории
функция ClassAdd(id){
if (GetId(p+id).src.indexOf(last)>0){ //Добавляем операцию для последней категории
если (!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);} //Добавляем событие двойного щелчка для диапазона, отображающего текст категории
GetId(p+id).src = 'images/lastopen.gif';
}
}
еще{
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);
}
//Функция модификации категории
функция ClassEdit(id,имя класса){
GetId(s+id).innerHTML=имя класса;
}
//Удалить функцию для категорий с несколькими подкатегориями
функция ClassDel(id){
ShowChild(c+id,id);
CurrentSelect(currentID,id)
BrowseRight (идентификатор);
}
//Удалить функцию для категорий только с одной подкатегорией
функция 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' //Настройки значка
}
еще{
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 (идентификатор);
}
//Передаем параметры в правый фрейм
функция BrowseRight(id){
CurrentSelect(currentID,id);
top.ContentFrame.location=../ArticleMain.asp?ClassID=+ id;
}
//Функция установки выбранного статуса категории
функция CurrentSelect(oldid,newid){
текущийID = новыйID;
document.getElementById(s+oldid).style.backgroundColor=white;
document.getElementById(s+currentID).style.backgroundColor=#C0C0E9;
}
//Создаем объект XMLHttpRequest
функция CreateXMLHttpRequest()
{
если (окно.ActiveXObject)
{
xmlHttp = новый ActiveXObject(Microsoft.XMLHTTP);
}
еще
{
xmlHttp = новый XMLHttpRequest();
}
}
//Функция обработки Ajax
//id, идентификатор слоя
//rid, идентификатор данных в таблице
функция ShowChild(cid,id)
{
СоздатьXMLHttpRequest();
если (xmlHttp)
{
xmlHttp.open('POST','child.asp',true);
xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
вар SendData = 'id ='+id;
xmlHttp.send(SendData);
xmlHttp.onreadystatechange=функция()
{
если (xmlHttp.readyState == 4)
{
если (xmlHttp.status == 200)
{
GetId(cid).innerHTML = xmlHttp.responseText;
}
еще
{
GetId(cid).innerHTML='Ошибка:'+xmlHttp.statusText;
}
}
еще
{
GetId(cid).innerHTML=Отправка данных...;
}
}
}
еще
{
GetId(cid).innerHTML='К сожалению, ваш браузер не поддерживает XMLHttpRequest, используйте IE6 или выше! ';
}
}
//Получаем объект страницы
//id, идентификатор слоя
функция GetId (идентификатор)
{
вернуть document.getElementById(id);
}
</скрипт>
</голова>
<тело>
<!--#include file=../conn.asp-->
<%
'Показать корневой каталог
sql=select *,(выберите первый 1 ClassID из ArticleClass, где Depth=0, в порядке по ClassID desc) как последний идентификатор из ArticleClass, где Depth=0, в порядке ClassID
установить rs=conn.execute(sql)
если не rs.eof, то
ответ. Напишите <ul>&vbcr
делай, пока не rs.eof
если cint(trim(rs(ClassID)))=cint(trim(rs(lastid))) то
если rs(Child)>0, то
response.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: align=absmiddle>
response.Write <img src=images/folder.gif align=absmiddle id='f& rs(ClassID) &' /> <span id='s& Trim(rs(ClassID)) &' onclick=BrowseRight(& Trim(rs) (КлассID)) &) ondblclick=DivDisplay2('c&rs(ClassID)&','&rs(ClassID)&','p&rs(ClassID)&','f& rs(ClassID) &')>& rs(ClassName) &</span>
еще
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)) &' onclick=BrowseRight(& Trim(rs) (ClassID)) &)>& rs(ClassName) &</span>
конец, если
еще
если rs(Child)>0, то
response.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: align=absmiddle>
response.Write <img src=images/folder.gif align=absmiddle id='f& rs(ClassID) &' /> <span id='s& Trim(rs(ClassID)) &' onclick=BrowseRight(& Trim(rs) (КлассID)) &) ondblclick=DivDisplay('c&rs(ClassID)&','&rs(ClassID)&','p&rs(ClassID)&','f& rs(ClassID) &')>& rs(ClassName) &</span>
еще
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)) &' onclick=BrowseRight(& Trim(rs) (ClassID)) &)>& rs(ClassName) &</span>
конец, если
конец, если
если cint(trim(rs(ClassID)))=cint(trim(rs(lastid))) то
response.Write <div id='c&rs(ClassID)&' style='display:none;'></div>
еще
response.Write <div id='c&rs(ClassID)&' style='display:none;' class=childdiv></div>
конец, если
ответ. Напишите </li>&vbcr
rs.movenext
петля
ответ. Напишите </ul>&vbcr
конец, если
RS.закрыть
установить rs=ничего
конн.закрыть
Установить соединение = Ничего
%>
</тело>
</html>