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=なし
終了の場合
エンドサブ
'************************各種プロパティの設定********************* ******** **************************
Public プロパティ Let ClassID(str) 'カテゴリID(主キー)を取得します
nClassID=str
call ClassProperty() 'カテゴリ ID を取得するときにクラスのすべてのプロパティを読み出すためにこの関数を呼び出します
終了プロパティ
Public プロパティ Let ClassName(str) 'クラス名を取得します
sClassName=str
終了プロパティ
Public プロパティ Get ClassName
クラス名=sクラス名
終了プロパティ
Public プロパティ Let ParentID(str) 'カテゴリの親IDを取得します
nParentID=str
終了プロパティ
Public プロパティ Get ParentID
親ID=n親ID
終了プロパティ
Public プロパティ Let ParentPath(str) '親パス ID を取得します
sParentPath=str
終了プロパティ
Public プロパティ Get ParentPath
親パス=s親パス
終了プロパティ
Public プロパティ Let Depth(str) 'カテゴリの深さを取得します
nDepth=str
終了プロパティ
Public プロパティ Get Depth
深さ=n深さ
終了プロパティ
Public プロパティ Let RootID(str) 'カテゴリのルートIDを取得します
nRootID=str
終了プロパティ
Public プロパティ Get RootID
ルートID=nルートID
終了プロパティ
Public プロパティ Let Child(str) 'サブカテゴリの数
nChild=str
終了プロパティ
Public プロパティ Get Child
子=n子
終了プロパティ
Public プロパティ Let OrderID(str) '注文ID
nOrderID=str
終了プロパティ
Public プロパティ Get OrderID
注文ID=n注文ID
終了プロパティ
Public Property Let FilePath(str) 'カテゴリ ファイルのルート ディレクトリ (静的ファイル パスを生成します。Xiaozhan Laoyang Web Technology Blog では静的ファイル生成を使用するため、このフィールドを設定します)
sFilePath=str
終了プロパティ
Public プロパティ Get FilePath
ファイルパス=sファイルパス
終了プロパティ
'************************************************ * ******************************
Private Sub ClassProperty() 'クラスのすべてのプロパティを読み取ります
sql=select * from ArticleClass where ClassID=& nClassID
set rs=conn.execute(sql)
そうでない場合は、
sClassName=trim(rs(クラス名))
nParentID=trim(rs(親ID))
sParentPath=trim(rs(ParentPath))
nDepth=trim(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) '親カテゴリが存在しません
if temprs.eof then
FAddCheck=1
ErrorStr=カテゴリが存在しないか、削除されました。
終了関数
それ以外
sql=select ClassID from ArticleClass where ClassName='& sClassName &' and ParentID=& nParentID '重複したクラス名
set rs=conn.execute(sql)
そうでない場合は、
FAddCheck=1
ErrorStr=クラス名が重複しています!
終了関数
終了する場合
rs=何も設定しない
終了する場合
settemprs=なし
それ以外
sql=select ClassID from ArticleClass where ClassName='& sClassName &' and ParentID=& nParentID '重複したクラス名
set rs=conn.execute(sql)
そうでない場合は、
FAddCheck=1
ErrorStr=クラス名が重複しています!
終了関数
終了する場合
rs=何も設定しない
終了する場合
終了する場合
終了する場合
終了機能
パブリックサブSAdd()
dim maxClassID、maxRootID
set rs = conn.execute(select Max(ClassID) from ArticleClass) '現在のデータベースで最大のカテゴリ ID を検索します。データがない場合は、0 に設定します。挿入されるカテゴリ ID は、現在の最大 ID に 1 を加えたものです。
maxClassID=rs(0)
isnull(maxClassID) の場合
maxClassID=0
終了する場合
rs=何も設定しない
nクラスID=最大クラスID+1
set rs=conn.execute(select max(rootid) From ArticleClass) '現在のデータベースで最大のルート ID を検索します。データがない場合は、0 に設定します。挿入されるルート ID は、現在の最大のルート ID に加えたものです。 1
maxRootID=rs(0)
isnull(maxRootID)の場合
maxRootID=0
終了する場合
nRootID=maxRootID+1
set rs=conn.execute(select RootID,Depth,ParentPath,Child,OrderID From ArticleClass where ClassID= & nParentID) '親カテゴリの対応する情報を検索します
そうでない場合は、
nRootID=trim(rs(Rootid)) 'ルート ID は親カテゴリのルート ID と同じです
sParentPath=trim(rs(ParentPath))& , &nParentID
if cint(trim(nParentID))>0 then '親 ID が 0 より大きい場合、親カテゴリが存在するため、挿入されるカテゴリの深さが親カテゴリの深さに 1 追加されます。親 ID が 0 以下で、挿入される現在のカテゴリがルート カテゴリである場合、深さは 0 になります。
nDepth=cint(trim(rs(深度)))+1
それ以外
n深さ=0
終了する場合
if cint(trim(rs(Child)))>0 then
dimrs前の注文ID
'この列と同じレベルにある最後の列の OrderID を取得します
set rsPrevOrderID=conn.execute(ParentID= & ParentID の ArticleClass から Max(OrderID) を選択)
前の注文ID=rs前の注文ID(0)
' 同じ親列のサブ列の最大 OrderID を取得しますが、この列よりも大きい場合は、代わりにこの値を使用します。
set rsPrevOrderID=conn.execute(select Max(OrderID) From ArticleClass where ParentPath like ' & ParentPath & ,%')
if (not(rsPrevOrderID.bof および rsPrevOrderID.eof))
IsNull(rsPrevOrderID(0)) でない場合は、
if rsPrevOrderID(0)>prevOrderID then
前の注文ID=rs前の注文ID(0)
終了する場合
終了する場合
終了する場合
rsPrevOrderID=何も設定しない
終了する場合
n注文ID=前の注文ID+1
それ以外
n注文ID=0
s親パス=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(Update ArticleClass set child=child+1 where ClassID=& nParentID)
'この列の並べ替えと、この必要性を超え、このカテゴリに属する列の並べ替えシーケンス番号を更新します
if prevOrderID<> then
conn.execute(update ArticleClass set OrderID=OrderID+1 where rootid= & nRootid & and OrderID>& prevOrderID & and ClassID<>& nClassID)
終了する場合
終了する場合
エンドサブ
Public Function FEditCheck() 'カテゴリ変更チェック関数。結果は 0 はチェックに合格したことを意味し、1 はエラーが発生したことを意味します。エラーが発生した場合は関数を終了し、エラー変数 ErrorStr にエラー情報を書き込みます。
薄暗い
F編集チェック=0
if nClassID= then 'カテゴリ ID が空です
F編集チェック=1
ErrorStr=カテゴリ ID を空にすることはできません。
終了関数
それ以外
if sClassName= then 'クラス名が空です
F編集チェック=1
ErrorStr=クラス名を空にすることはできません!
終了関数
それ以外
nParentID<>0 の場合
set temprs=conn.execute(select ClassID From ArticleClass where ClassID= & nParentID) '親カテゴリが存在しません
if temprs.eof then
FAddCheck=1
ErrorStr=カテゴリが存在しないか、削除されました。
終了関数
それ以外
set rs=conn.execute(ClassName='& sClassName &' および ClassID<>& nClassID &and ParentID=& nParentID である ArticleClass から ClassID を選択します)
rs.eof でない場合は、「クラス名が重複しています」
F編集チェック=1
ErrorStr=クラス名が重複しています!
終了関数
終了する場合
rs=何も設定しない
終了する場合
settemprs=なし
終了する場合
終了する場合
終了する場合
終了機能
Public Sub SEdit() 'カテゴリの変更
sql=update ArticleClass set ClassName='& sClassName &',FilePath='& sFilePath &' where ClassID=& nClassID
conn.execute(SQL)
エンドサブ
Public Function FDeleteCheck() ' カテゴリの削除チェック関数。結果は 0 はチェックに合格したことを意味し、1 はエラーが発生したことを意味します。エラーが発生した場合は関数を終了し、エラー変数 ErrorStr にエラー情報を書き込みます。
FDeleteCheck=0 '記事のカスケード削除部分を書かずにここのコードを削除します。削除する場合はカスケード削除する必要があります。
nClassID= の場合
F削除チェック=1
ErrorStr=削除するカテゴリ ID を空にすることはできません。
終了関数
それ以外
set rs=conn.execute(ClassID=& nClassID の ArticleClass から子を選択)
rs.bof と rs.eof の場合
F削除チェック=1
ErrorStr=カテゴリが存在しないか、削除されました。
終了関数
それ以外
トリム(rs(子))>0の場合、
F削除チェック=1
ErrorStr=このカテゴリにはサブカテゴリが含まれています。このカテゴリを削除する前にサブカテゴリを削除してください。
終了関数
終了する場合
終了する場合
終了する場合
終了機能
パブリックサブSDelete()
if nDepth>0 then '親 ID の子の数を変更します
conn.execute(Update ArticleClass set child=child-1 where child>0 and ClassID= & nParentID)
終了する場合
sql=delete from ArticleClass where ClassID=& nClassID
conn.execute(SQL)
エンドサブ
パブリック関数FErrStr()
FErrStr=エラーStr
終了機能
終了クラス
%>
インデックス.asp
<%@LANGUAGE=VBSCRIPT コードページ=65001%>
<%
著者サイト: www.guaishi.org
'メール: [email protected]
'QQ:514777880
セッション.コードページ=65001
応答.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;
<タイトル></タイトル>
<スタイルタイプ=テキスト/css>
ボディ{マージン:0;パディング:0;フォントサイズ:12px;背景色:#FFFFFF;}
ul{ リストスタイルタイプ: マージン:0 0 0 20px;}
li{ ホワイトスペース:パディング:0;}
.childdiv{ 背景:url(images/dot.gif);背景-リピート:リピート-y;}
スパン { カーソル:ポインタ;}
</スタイル>
<script type=text/javascript>
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='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)
{
if (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--カテゴリ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,classname){
GetId(s+id).innerHTML=クラス名;
}
//複数のサブカテゴリを持つカテゴリの削除関数
関数 ClassDel(id){
ShowChild(c+id,id);
CurrentSelect(現在のID,ID)
BrowseRight(id);
}
// サブカテゴリが 1 つしかないカテゴリの削除関数
関数 ClassDel1(id){
if (GetId(p+id).src.indexOf(last)>0){ //カテゴリが現在のカテゴリの最後のカテゴリの場合
GetId(p+id).style.cursor=cursor; //アイコンのマウス通過スタイルを設定します。
GetId(p+id).onclick=function (){}; //削除後はサブカテゴリが 1 つしかないため、アイコンのクリック イベントを空の関数に変更します。
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=function()
{
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)
{
document.getElementById(id) を返します。
}
</script>
</head>
<本文>
<!--#include file=../conn.asp-->
<%
'ルートディレクトリを表示
sql=select *,(Depth=0 の ArticleClass から ClassID 順に上位 1 の ClassID を選択) as lastid from ArticleClass where Depth=0 order by ClassID
set rs=conn.execute(sql)
そうでない場合は、
response.Write <ul>&vbcr
rs.eof ではないときに実行します
if cint(trim(rs(ClassID)))=cint(trim(rs(lastid)))
rs(子)>0 の場合
response.Write <li><img id='p&rs(クラスID)&' src=images/lastclosed.gif onclick=DivDisplay2('c&rs(クラスID)&','&rs(クラスID)&','p&rs(クラスID)& ','f& rs(ClassID) &') style=cursor : align=absmiddle>
response.Write <img src=images/folder.gif align=absmiddle id='f& rs(ClassID) &' /> <span id='s&rim(rs(ClassID)) &' onclick=BrowseRight(&trim(rs) (クラスID)) &) ondblclick=DivDisplay2('c&rs(クラスID)&','&rs(クラスID)&','p&rs(クラスID)&','f& rs(クラスID) &')>& 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&rim(rs(ClassID)) &' onclick=BrowseRight(&trim(rs) (クラスID)) &)>& rs(クラス名) &</span>
終了する場合
それ以外
rs(子)>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&rim(rs(ClassID)) &' onclick=BrowseRight(&trim(rs) (クラスID)) &) ondblclick=DivDisplay('c&rs(クラスID)&','&rs(クラスID)&','p&rs(クラスID)&','f& rs(クラスID) &')>& rs(クラス名) &</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&rim(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.close
rs=何も設定しない
接続閉じる
conn = なしを設定します
%>
</body>
</html>