데이터베이스가 포함된 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) '카테고리 ID(기본 키)를 가져옵니다.
nClassID=str
call ClassProperty() '카테고리 ID를 얻을 때 클래스의 모든 속성을 읽으려면 이 함수를 호출하세요.
끝 속성
공용 속성 Let ClassName(str) '클래스 이름을 가져옵니다.
sClassName=str
끝 속성
공용 속성 클래스 이름 가져오기
클래스이름=s클래스이름
끝 속성
공용 속성 Let ParentID(str) '카테고리 상위 ID를 가져옵니다.
nParentID=str
끝 속성
공용 자산 ParentID 가져오기
부모ID=n부모ID
끝 속성
공용 속성 Let ParentPath(str) '부모 경로 ID를 가져옵니다.
sParentPath=str
끝 속성
공용 속성 Get ParentPath
ParentPath=sParentPath
끝 속성
공용 속성 Let Depth(str) '범주 깊이를 가져옵니다.
n깊이=str
끝 속성
공공 재산의 깊이를 알아보세요
깊이=n깊이
끝 속성
공용 속성 Let RootID(str) '카테고리 루트 ID를 가져옵니다.
nRootID=str
끝 속성
공용 속성 RootID 가져오기
루트ID=n루트ID
끝 속성
공공 재산 Let Child(str) '하위 카테고리 수
nChild=str
끝 속성
공공재산 자녀 확보
하위=n 하위
끝 속성
공용 속성 Let OrderID(str) '주문 ID
nOrderID=str
끝 속성
공공 재산 OrderID 가져오기
주문ID=n주문ID
끝 속성
Public Property Let FilePath(str) '카테고리 파일 루트 디렉터리(정적 파일 경로 생성, Xiaozhan Laoyang 웹 기술 블로그는 정적 파일 생성을 사용하므로 이 필드를 설정)
sFilePath=str
끝 속성
공용 속성 FilePath 가져오기
FilePath=sFilePath
끝 속성
'************************************************ * ******************************
Private Sub ClassProperty() '클래스의 모든 속성 읽기
sql=select * from ArticleClass, 여기서 ClassID=& nClassID
rs=conn.execute(sql) 설정
rs.eof가 아니라면
sClassName=trim(rs(클래스이름))
nParentID=trim(rs(부모ID))
sParentPath=trim(rs(ParentPath))
n깊이=트림(rs(깊이))
nRootID=trim(rs(루트ID))
nChild=trim(rs(하위))
nOrderID=trim(rs(주문ID))
sFilePath=trim(rs(파일 경로))
종료하면
rs=아무것도 설정하지 않음
서브 끝
Public Function FAddCheck() '범주에 검사 함수를 추가합니다. 결과가 0이면 검사가 통과되었음을 의미하고, 1이면 오류가 발생함을 의미합니다. 오류가 발생하면 함수를 종료하고 오류 정보를 오류에 씁니다. 변수 ErrorStr
어두운 온도
FAddCheck=0
if sClassName= then '클래스 이름이 비어 있습니다.
FAddCheck=1
ErrorStr=클래스 이름은 비워둘 수 없습니다!
종료 기능
또 다른
if nParentID= then '부모 ID가 비어 있습니다.
FAddCheck=1
ErrorStr=상위 ID는 비워둘 수 없습니다!
종료 기능
또 다른
nParentID<>0이면
set temprs=conn.execute(select ClassID From ArticleClass where ClassID= & nParentID) '상위 카테고리가 존재하지 않습니다.
temprs.eof이면
FAddCheck=1
ErrorStr=카테고리가 존재하지 않거나 삭제되었습니다!
종료 기능
또 다른
sql=ClassName='& sClassName &' 및 ParentID=& nParentID '중복된 클래스 이름인 ArticleClass에서 ClassID를 선택하세요.
rs=conn.execute(sql) 설정
rs.eof가 아니라면
FAddCheck=1
ErrorStr=클래스 이름이 중복되었습니다!
종료 기능
종료하면
rs=아무것도 설정하지 않음
종료하면
settemprs=아무것도 없음
또 다른
sql=ClassName='& sClassName &' 및 ParentID=& nParentID '중복된 클래스 이름인 ArticleClass에서 ClassID를 선택하세요.
rs=conn.execute(sql) 설정
rs.eof가 아니라면
FAddCheck=1
ErrorStr=클래스 이름이 중복되었습니다!
종료 기능
종료하면
rs=아무것도 설정하지 않음
종료하면
종료하면
종료하면
기능 종료
공개 서브 SAdd()
희미한 maxClassID, maxRootID
set rs = conn.execute(select Max(ClassID) from ArticleClass) '현재 데이터베이스에서 가장 큰 카테고리 ID를 찾습니다. 데이터가 없으면 0으로 설정합니다. 삽입할 카테고리 ID는 현재 가장 큰 ID에 1을 더한 값입니다.
최대클래스ID=rs(0)
if isnull(maxClassID)이면
최대클래스ID=0
종료하면
rs=아무것도 설정하지 않음
nClassID=최대클래스ID+1
set rs=conn.execute(select max(rootid) From ArticleClass) '현재 데이터베이스에서 가장 큰 루트 ID를 찾습니다. 데이터가 없으면 0으로 설정합니다. 삽입할 루트 ID는 현재 가장 큰 루트 ID에 더한 값입니다. 1
최대 루트ID=rs(0)
isnull(maxRootID)인 경우
최대 루트ID=0
종료하면
nRootID=최대RootID+1
set rs=conn.execute(select RootID,Depth,ParentPath,Child,OrderID From ArticleClass where ClassID= & nParentID) '상위 카테고리의 해당 정보 찾기
rs.eof가 아니라면
nRootID=trim(rs(Rootid)) '루트 ID는 상위 카테고리 루트 ID와 동일합니다.
sParentPath=trim(rs(ParentPath))& , &nParentID
if cint(trim(nParentID))>0 then '부모 id가 0보다 크면 부모 카테고리가 있으므로 삽입되는 카테고리의 깊이에 부모 카테고리의 깊이에 1을 더한 것입니다. 상위 ID가 0보다 크지 않은 경우 삽입할 현재 카테고리는 루트 카테고리입니다. 그러면 깊이는 0입니다.
n깊이=cint(trim(rs(깊이)))+1
또 다른
n깊이=0
종료하면
if cint(trim(rs(Child)))>0이면
dimmer이전 주문 ID
'이 열과 동일한 수준에 있는 마지막 열의 OrderID를 가져옵니다.
rsPrevOrderID=conn.execute(ParentID= & ParentID인 ArticleClass에서 Max(OrderID) 선택)를 설정합니다.
prevOrderID=rsPrevOrderID(0)
'동일한 상위 열이지만 이 열보다 큰 하위 열의 최대 OrderID를 가져옵니다. 이전 값보다 큰 경우 대신 이 값을 사용합니다.
set rsPrevOrderID=conn.execute(Select Max(OrderID) From ArticleClass where ParentPath like ' & ParentPath & ,%')
if (not(rsPrevOrderID.bof 및 rsPrevOrderID.eof)) then
IsNull(rsPrevOrderID(0))이 아닌 경우
rsPrevOrderID(0)>prevOrderID인 경우
prevOrderID=rsPrevOrderID(0)
종료하면
종료하면
종료하면
rsPrevOrderID=아무것도 설정하지 않음
종료하면
nOrderID=이전 주문ID+1
또 다른
n주문ID=0
sParentPath=0
n깊이=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(ClassID=& nParentID인 경우 ArticleClass 세트 child=child+1 업데이트)
'이 열의 정렬과 이 필요 이상으로 이 범주에 속하는 열의 정렬 순서 번호를 업데이트합니다.
prevOrderID<>인 경우
conn.execute(ArticleClass 세트 OrderID=OrderID+1, 여기서 rootid= & nRootid & OrderID>& prevOrderID & ClassID<>& nClassID)
종료하면
종료하면
서브 끝
Public Function FEditCheck() '카테고리 수정 확인 함수, 결과가 0이면 확인이 통과되었음을 의미하고, 1은 오류가 발생했음을 의미합니다. 오류가 발생하면 함수를 종료하고 오류 정보를 오류 변수 ErrorStr에 씁니다.
어두운 온도
FEditCheck=0
if nClassID= then '카테고리 ID가 비어 있습니다.
FEditCheck=1
ErrorStr=카테고리 ID는 비워둘 수 없습니다!
종료 기능
또 다른
if sClassName= then '클래스 이름이 비어 있습니다.
FEditCheck=1
ErrorStr=클래스 이름은 비워둘 수 없습니다!
종료 기능
또 다른
nParentID<>0이면
set temprs=conn.execute(select ClassID From ArticleClass where ClassID= & nParentID) '상위 카테고리가 존재하지 않습니다.
temprs.eof이면
FAddCheck=1
ErrorStr=카테고리가 존재하지 않거나 삭제되었습니다!
종료 기능
또 다른
set rs=conn.execute(ClassName='& sClassName &' 및 ClassID<>& nClassID &and ParentID=& nParentID인 ArticleClass에서 ClassID 선택)
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=삭제할 카테고리 ID는 비워둘 수 없습니다!
종료 기능
또 다른
rs=conn.execute 설정(ClassID=& nClassID인 ArticleClass에서 하위 선택)
rs.bof 및 rs.eof인 경우
FDeleteCheck=1
ErrorStr=카테고리가 존재하지 않거나 삭제되었습니다!
종료 기능
또 다른
Trim(rs(Child))>0이면
FDeleteCheck=1
ErrorStr=이 카테고리에는 하위 카테고리가 포함되어 있습니다. 이 카테고리를 삭제하기 전에 해당 하위 카테고리를 삭제하십시오!
종료 기능
종료하면
종료하면
종료하면
기능 종료
공개 하위 삭제()
if nDepth>0이면 '부모 ID의 자식 수를 수정합니다.
conn.execute(child>0 및 ClassID= & nParentID인 경우 ArticleClass 세트 child=child-1 업데이트)
종료하면
sql=ClassID=& nClassID인 ArticleClass에서 삭제
conn.execute(sql)
서브 끝
공용 함수FErrStr()
FErrStr=오류Str
기능 종료
수업 종료
%>
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 />
<제목></제목>
<스타일 유형=텍스트/css>
본문{마진:0;패딩:0;글꼴 크기:12px 배경색:#FFFFFF;}
ul{ 목록 스타일 유형: 없음; 여백:0 0 0 20px;
li{ 공백:nowrap;
.childdiv{ 배경:url(images/dot.gif);배경-반복:반복-y;}
범위 { 커서:포인터;}
</style>
<스크립트 유형=텍스트/자바스크립트>
var xmlHttp; //전역 변수 정의
var currentID=1;//현재 선택된 ID를 설정합니다. 이 ID가 존재하지 않으면 js 오류가 발생합니다.
//카테고리 표시 주요 기능
//cid--하위 카테고리의 레이어 ID
//id --카테고리 ID
//pid--[+] 및 [-] 아이콘 ID
//fid--카테고리 아이콘 ID
함수 DivDisplay(cid,id,pid,fid)
{
if (GetId(cid).style.display=='') //하위 카테고리가 표시되지 않을 때 아이콘 표시 제어
{
GetId(cid).style.display='없음';
GetId(pid).src = 'images/closed.gif';
GetId(fid).src = '이미지/폴더.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)
{
if (GetId(cid).style.display=='')
{
GetId(cid).style.display='없음';
GetId(pid).src = 'images/lastclosed.gif';
GetId(fid).src = '이미지/폴더.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--카테고리 ID
함수 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);}; //카테고리 텍스트를 표시하는 범위에 대한 더블클릭 이벤트를 추가합니다.
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(현재ID,ID)
BrowseRight(id);
}
//하위 카테고리가 하나만 있는 카테고리에 대한 삭제 함수
함수 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(현재ID,ID);
BrowseRight(id);
}
//오른쪽 프레임에 매개변수 전달
함수 BrowseRight(id){
CurrentSelect(현재ID,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()
{
if(window.ActiveXObject)
{
xmlHttp = 새 ActiveXObject(Microsoft.XMLHTTP);
}
또 다른
{
xmlHttp = 새로운 XMLHttpRequest();
}
}
//Ajax 처리 함수
//id, 레이어 ID
//rid, 테이블에 있는 데이터의 ID
함수 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=함수()
{
if(xmlHttp.readyState==4)
{
if(xmlHttp.status==200)
{
GetId(cid).innerHTML = xmlHttp.responseText;
}
또 다른
{
GetId(cid).innerHTML='오류:'+xmlHttp.statusText;
}
}
또 다른
{
GetId(cid).innerHTML=데이터 제출 중...;
}
}
}
또 다른
{
GetId(cid).innerHTML='죄송합니다. 귀하의 브라우저는 XMLHttpRequest를 지원하지 않습니다. IE6 이상을 사용하십시오! ';
}
}
//페이지 객체 가져오기
//id, 레이어 ID
함수 GetId(id)
{
return document.getElementById(id);
}
</script>
</head>
<본문>
<!--#포함 파일=../conn.asp-->
<%
'루트 디렉토리 표시
sql=select *,(Depth=0인 ArticleClass에서 ClassID 순서로 상위 1개 ClassID 선택) Depth=0인 ArticleClass의 ClassID 순서로 lastid로 선택
rs=conn.execute(sql) 설정
rs.eof가 아니라면
응답.<ul>쓰기&vbcr
rs.eof가 아닌 동안 수행
if 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(클래스 이름) &</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 (클래스ID)) &)>& rs(클래스이름) &</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 (클래스ID)) &)>& rs(클래스이름) &</span>
종료하면
종료하면
if 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=아무것도 설정하지 않음
연결 닫기
conn = 없음 설정
%>
</body>
</html>