Struktur pohon klasifikasi tak terbatas Ajax+asp dengan database, barang bagus, jangan lewatkan, tes IE lulus, FF memiliki sedikit bug
Cls_Leibie.asp
Copy kode kodenya sebagai berikut:
<%
'Bidang basis data adalah atribut kelas, dan fungsi seperti menambah, menghapus, memodifikasi, dan memeriksa operasi adalah metode kelas.
Kelas Cls_Leibie
Private nClassID,sClassName,nParentID,sParentPath,nDepth,nRootID,nChild,nOrderID,sFilePath 'Tentukan variabel privat (atribut kelas, yaitu variabel yang sesuai dengan bidang database)
Rs pribadi,sql,ErrorStr
Sub Kelas Pribadi_Inisialisasi()
ErrorStr= 'Pesan kesalahan inisialisasi kosong
Akhiri Sub
Private Sub Class_Terminate() 'Tutup koneksi database ketika menghancurkan kelas
Jika IsObject(Conn) Lalu
Sambung.Tutup
SetConn=Tidak ada
Akhiri Jika
Akhiri Sub
'************************Tetapkan berbagai properti************************ ***********************************
Properti Publik Biarkan ClassID(str) 'Dapatkan ID kategori (kunci utama)
nClassID=str
call ClassProperty() 'Panggil fungsi ini untuk membacakan semua properti kelas saat mendapatkan ID kategori
Properti Akhir
Properti Publik Biarkan ClassName(str) 'Dapatkan nama kelas
sNamaKelas=str
Properti Akhir
Properti Publik Dapatkan Nama Kelas
NamaKelas=sNamaKelas
Properti Akhir
Properti Publik Biarkan ParentID(str) 'Dapatkan ID induk kategori
nIDOrang Tua=str
Properti Akhir
Properti Publik Dapatkan ParentID
ID Orang Tua=nID Orang Tua
Properti Akhir
Properti Publik Biarkan ParentPath(str) 'Dapatkan ID jalur induk
sParentPath=str
Properti Akhir
Properti Publik Dapatkan ParentPath
ParentPath=sParentPath
Properti Akhir
Properti Publik Biarkan Kedalaman(str) 'Dapatkan kedalaman kategori
nKedalaman=str
Properti Akhir
Properti Publik Dapatkan Kedalaman
Kedalaman=nKedalaman
Properti Akhir
Properti Publik Biarkan RootID(str) 'Dapatkan ID root kategori
nRootID=str
Properti Akhir
Properti Publik Dapatkan RootID
RootID=nRootID
Properti Akhir
Properti Publik Biarkan Anak(str) 'Jumlah subkategori
nAnak=str
Properti Akhir
Milik Umum Dapatkan Anak
Anak=nAnak
Properti Akhir
Properti Publik Biarkan OrderID(str) 'ID Pesanan
nOrderID=str
Properti Akhir
Properti Umum Dapatkan OrderID
IDPesanan=nIDPesanan
Properti Akhir
Properti Publik Biarkan FilePath(str) 'Kategori direktori akar file (menghasilkan jalur file statis, Blog Teknologi Web Xiaozhan Laoyang menggunakan pembuatan file statis, jadi setel bidang ini)
sFilePath=str
Properti Akhir
Properti Publik Dapatkan FilePath
FilePath=sFilePath
Properti Akhir
'******************************************************* ******************************
Private Sub ClassProperty() 'Baca semua properti kelas
sql=pilih * dari ArticleClass di mana ClassID=& nClassID
setel rs=sambungan.eksekusi(sql)
jika bukan rs.eof maka
sNamaKelas=trim(rs(NamaKelas))
nParentID=trim(rs(ParentID))
sParentPath=trim(rs(ParentPath))
nKedalaman=trim(rs(Kedalaman))
nRootID=trim(rs(RootID))
nAnak=trim(rs(Anak))
nOrderID=trim(rs(OrderID))
sFilePath=trim(rs(FilePath))
berakhir jika
atur rs=tidak ada
Akhiri Sub
Fungsi Publik FAddCheck() 'Tambahkan fungsi pemeriksaan ke kategori. Hasil 0 berarti pemeriksaan lolos, dan hasil 1 berarti terjadi kesalahan. Jika terjadi kesalahan, keluar dari fungsi dan tulis informasi kesalahan ke kesalahan tersebut variabel ErrorStr
suhu redup
FATambahkanPeriksa=0
if sClassName= maka 'Nama kelas kosong
FATambahkanPeriksa=1
ErrorStr=Nama kelas tidak boleh kosong!
keluar Fungsi
kalau tidak
jika nParentID= maka 'ID Orang Tua kosong
FATambahkanPeriksa=1
ErrorStr=ID induk tidak boleh kosong!
keluar Fungsi
kalau tidak
jika nParentID<>0 maka
set temprs=conn.execute(pilih ClassID Dari ArticleClass di mana ClassID= & nParentID) 'Kategori induk tidak ada
jika temprs.eof maka
FATambahkanPeriksa=1
ErrorStr=Kategori tidak ada atau telah dihapus!
keluar Fungsi
kalau tidak
sql=pilih ClassID dari ArticleClass di mana ClassName='& sClassName &' dan ParentID=& nParentID 'Nama kelas duplikat
setel rs=sambungan.eksekusi(sql)
jika bukan rs.eof maka
FATambahkanPeriksa=1
ErrorStr=Gandakan nama kelas!
keluar Fungsi
berakhir jika
atur rs=tidak ada
berakhir jika
settemprs=tidak ada
kalau tidak
sql=pilih ClassID dari ArticleClass di mana ClassName='& sClassName &' dan ParentID=& nParentID 'Nama kelas duplikat
setel rs=sambungan.eksekusi(sql)
jika bukan rs.eof maka
FATambahkanPeriksa=1
ErrorStr=Gandakan nama kelas!
keluar Fungsi
berakhir jika
atur rs=tidak ada
berakhir jika
berakhir jika
berakhir jika
Fungsi Akhir
Sub SAdd Publik()
redupkan maxClassID,maxRootID
set rs = conn.execute(select Max(ClassID) from ArticleClass) 'Cari id kategori terbesar di database saat ini. Jika tidak ada data, setel ke 0. Id kategori yang akan dimasukkan adalah id terbesar saat ini ditambah 1
maxClassID=rs(0)
jika isnull(maxClassID) maka
maxClassID=0
berakhir jika
atur rs=tidak ada
nClassID=maxClassID+1
set rs=conn.execute(select max(rootid) From ArticleClass) 'Temukan id root terbesar di database saat ini. Jika tidak ada data, setel ke 0. Root id yang akan dimasukkan adalah root id terbesar saat ini plus 1
maxRootID=rs(0)
jika isnull(maxRootID) maka
maxRootID=0
berakhir jika
nRootID=maksRootID+1
set rs=conn.execute(pilih RootID,Depth,ParentPath,Child,OrderID Dari ArticleClass di mana ClassID= & nParentID) 'Temukan informasi yang sesuai dari kategori induk
jika bukan rs.eof maka
nRootID=trim(rs(Rootid)) 'ID root sama dengan id root kategori induk
sParentPath=trim(rs(ParentPath))& , &nParentID
if cint(trim(nParentID))>0 maka 'Jika id induk lebih besar dari 0 maka ada kategori induk, maka kedalaman kategori yang akan disisipkan ditambah kedalaman kategori induk sebanyak 1. Jika id induk tidak lebih besar dari 0, kategori saat ini yang akan dimasukkan adalah kategori root. Maka kedalamannya adalah 0
nKedalaman=cint(trim(rs(Kedalaman)))+1
kalau tidak
nKedalaman=0
berakhir jika
jika cint(trim(rs(Anak)))>0 maka
dimrsPrevOrderID
'Dapatkan OrderID kolom terakhir pada tingkat yang sama dengan kolom ini
setel rsPrevOrderID=conn.execute(pilih Max(OrderID) Dari ArticleClass di mana ParentID= & ParentID)
prevOrderID=rsPrevOrderID(0)
'Dapatkan OrderID maksimum dari subkolom kolom induk yang sama tetapi lebih besar dari kolom ini. Jika lebih besar dari nilai sebelumnya, gunakan nilai ini.
setel rsPrevOrderID=conn.execute(pilih Max(OrderID) Dari ArticleClass di mana ParentPath seperti ' & ParentPath & ,%')
jika (bukan(rsPrevOrderID.bof dan rsPrevOrderID.eof)) lalu
jika bukan IsNull(rsPrevOrderID(0)) maka
jika rsPrevOrderID(0)>prevOrderID maka
prevOrderID=rsPrevOrderID(0)
berakhir jika
berakhir jika
berakhir jika
atur rsPrevOrderID=tidak ada
berakhir jika
nOrderID=IDPesanan sebelumnya+1
kalau tidak
nIDPesanan=0
sPathPath=0
nKedalaman=0
berakhir jika
atur rs=tidak ada
nAnak=0
sql=masukkan ke dalam nilai ArticleClass (ClassID,ClassName,ParentID,ParentPath,Depth,RootID,Child,OrderID,FilePath) (& nClassID &,'& sClassName &',& nParentID &,'& sParentPath &',& nDepth &, & nRootID &,& nAnak &,& nOrderID &,'& sFilePath &')
samb.execute(sql)
jika ParentID>0 maka
'Perbarui jumlah sub-kolom kelas induknya
conn.execute(perbarui set ArticleClass anak=anak+1 di mana ClassID=& nParentID)
'Perbarui pengurutan kolom ini dan nomor urut pengurutan kolom yang lebih besar dari kebutuhan ini dan di bawah kategori ini
jika prevOrderID<> maka
conn.execute(perbarui ArticleClass set OrderID=OrderID+1 di mana rootid= & nRootid & dan OrderID>& prevOrderID & dan ClassID<>& nClassID)
berakhir jika
berakhir jika
Akhiri Sub
Fungsi Publik FEditCheck() 'Fungsi pemeriksaan modifikasi kategori, hasilnya 0 berarti pemeriksaan telah berlalu, dan 1 berarti telah terjadi kesalahan, keluar dari fungsi dan tulis informasi kesalahan ke variabel kesalahan ErrorStr
suhu redup
FEditPeriksa=0
jika nClassID= maka 'Id kategori kosong
FEditPeriksa=1
ErrorStr=Id kategori tidak boleh kosong!
keluar Fungsi
kalau tidak
if sClassName= maka 'Nama kelas kosong
FEditPeriksa=1
ErrorStr=Nama kelas tidak boleh kosong!
keluar Fungsi
kalau tidak
jika nParentID<>0 maka
set temprs=conn.execute(pilih ClassID Dari ArticleClass di mana ClassID= & nParentID) 'Kategori induk tidak ada
jika temprs.eof maka
FATambahkanPeriksa=1
ErrorStr=Kategori tidak ada atau telah dihapus!
keluar Fungsi
kalau tidak
set rs=conn.execute(pilih ClassID dari ArticleClass di mana ClassName='& sClassName &' dan ClassID<>& nClassID &dan ParentID=& nParentID)
jika bukan rs.eof maka 'Gandakan nama kelas
FEditPeriksa=1
ErrorStr=Gandakan nama kelas!
keluar Fungsi
berakhir jika
atur rs=tidak ada
berakhir jika
settemprs=tidak ada
berakhir jika
berakhir jika
berakhir jika
Fungsi Akhir
Sub Publik SEdit() 'Modifikasi kategori
sql=perbarui ArticleClass set ClassName='& sClassName &',FilePath='& sFilePath &' di mana ClassID=& nClassID
samb.execute(sql)
Akhiri Sub
Fungsi Publik FDeleteCheck() 'Fungsi pemeriksaan penghapusan kategori, hasilnya 0 berarti pemeriksaan telah berlalu, dan 1 berarti telah terjadi kesalahan, keluar dari fungsi dan tulis informasi kesalahan ke variabel kesalahan ErrorStr
FDeleteCheck=0 'Hapus kode di sini tanpa menulis bagian penghapusan berjenjang pada artikel.
jika nClassID= maka
FHapusPeriksa=1
ErrorStr=Id kategori yang akan dihapus tidak boleh kosong!
keluar Fungsi
kalau tidak
set rs=conn.execute(pilih Anak dari ArticleClass di mana ClassID=& nClassID)
jika rs.bof dan rs.eof maka
FHapusPeriksa=1
ErrorStr=Kategori tidak ada atau telah dihapus!
keluar Fungsi
kalau tidak
jika trim(rs(Anak))>0 maka
FHapusPeriksa=1
ErrorStr=Kategori ini berisi subkategori, harap hapus subkategorinya sebelum menghapus kategori ini!
keluar Fungsi
berakhir jika
berakhir jika
berakhir jika
Fungsi Akhir
Sub Publik SDelete()
jika nDepth>0 maka 'Ubah jumlah anak dari id induk
conn.execute(perbarui set ArticleClass child=child-1 di mana child>0 dan ClassID= & nParentID)
berakhir jika
sql=hapus dari ArticleClass di mana ClassID=& nClassID
samb.execute(sql)
Akhiri Sub
Fungsi PublikFErrStr()
FErrStr=KesalahanStr
Fungsi Akhir
Kelas Akhir
%>
indeks.asp
<%@LANGUAGE=KODE VBSCRIPT=65001%>
<%
'Situs penulis: www.guaishi.org
'Email: [email protected]
'QQ: 514777880
Sesi.CodePage=65001
Respon.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>
<kepala>
<meta http-equiv=Jenis Konten konten=teks/html; charset=utf-8 />
<judul></judul>
<tipe gaya=teks/css>
body{margin:0;padding:0;ukuran font:12px; warna latar:#FFFFFF;}
ul{ tipe-gaya daftar: tidak ada; margin:0 0 0 20px;
li{ spasi putih:nowrap; padding:0;}
.childdiv{ background:url(images/dot.gif);background-repeat:repeat-y;}
rentang { kursor:penunjuk;}
</gaya>
<tipe skrip=teks/javascript>
var xmlHttp; //Tentukan variabel global
var currentID=1;//Setel ID yang dipilih saat ini. Jika ID ini tidak ada, kesalahan js akan terjadi.
//Kategori menampilkan fungsi utama
//cid--id lapisan subkategori
//id --id kategori
//pid--[+] dan [-] id ikon
//fid--id ikon kategori
fungsi DivDisplay(cid,id,pid,fid)
{
if (GetId(cid).style.display=='') //Kontrol tampilan ikon ketika subkategori tidak ditampilkan
{
GetId(cid).style.display='tidak ada';
GetId(pid).src = 'gambar/closed.gif';
GetId(fid).src = 'gambar/folder.gif';
}
else //Operasi saat memperluas subkategori
{
GetId(cid).style.display='';
GetId(pid).src = 'gambar/dibuka.gif';
GetId(fid).src = 'gambar/folderopen.gif';
if (GetId(cid).innerHTML==''||GetId(cid).innerHTML=='Mengirimkan data...')
{
GetId(cid).innerHTML='';
ShowChild(cid,id); //Panggil fungsi subkategori tampilan
}
}
}
//Efek yang sama seperti fungsi sebelumnya, hanya bekerja pada kategori terakhir
fungsi DivDisplay2(cid,id,pid,fid)
{
jika (GetId(cid).style.display=='')
{
GetId(cid).style.display='tidak ada';
GetId(pid).src = 'gambar/lastclosed.gif';
GetId(fid).src = 'gambar/folder.gif';
}
kalau tidak
{
GetId(cid).style.display='';
GetId(pid).src = 'gambar/lastopen.gif';
GetId(fid).src = 'gambar/folderopen.gif';
if (GetId(cid).innerHTML==''||GetId(cid).innerHTML=='Mengirimkan data...')
{
GetId(cid).innerHTML='';
TampilkanAnak(cid,id);
}
}
}
//Fungsi penambahan kategori
//id--id kategori
fungsi KelasTambah(id){
if (GetId(p+id).src.indexOf(last)>0){ //Tambahkan operasi untuk kategori terakhir
jika (!GetId(p+id).onclick){
GetId(p+id).onclick=function (){DivDisplay2(c+id,id,p+id,f+id);}; //Tambahkan event klik untuk [+] dan [-]
GetId(s+id).ondblclick=function (){DivDisplay2(c+id,id,p+id,f+id);}; //Tambahkan event klik dua kali untuk rentang yang menampilkan teks kategori
GetId(p+id).src = 'gambar/lastopen.gif';
}
}
kalau tidak{
if (!GetId(p+id).onclick){ //Jangan tambahkan kategori terakhir
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 = 'gambar/dibuka.gif';
}
}
GetId(c+id).style.display='';
ShowChild(c+id,id);
}
//Fungsi modifikasi kategori
fungsi ClassEdit(id,nama kelas){
GetId(s+id).innerHTML=nama kelas;
}
//Hapus fungsi untuk kategori dengan beberapa subkategori
fungsi ClassDel(id){
ShowChild(c+id,id);
Pilih Saat Ini(ID saat ini,id)
Telusuri Kanan(id);
}
//Hapus fungsi untuk kategori dengan hanya satu subkategori
fungsi KelasDel1(id){
if (GetId(p+id).src.indexOf(last)>0){ //Ketika kategori tersebut adalah kategori terakhir dari kategori saat ini
GetId(p+id).style.cursor=cursor; //Mengatur gaya passing mouse pada ikon
GetId(p+id).onclick=function (){}; //Karena hanya ada satu subkategori setelah penghapusan, tidak akan ada subkategori lagi, jadi ubah event klik ikon menjadi fungsi kosong
GetId(s+id).ondblclick=function (){}; //Sama seperti di atas
GetId(p+id).src = 'gambar/lastnochild.gif'; //Pengaturan ikon
}
kalau tidak{
GetId(p+id).style.cursor=cursor; //Hapus operasi dari kategori yang bukan terakhir
GetId(p+id).onclick=fungsi (){};
GetId(s+id).ondblclick=fungsi (){};
GetId(p+id).src = 'images/nofollow2.gif'; //Pengaturan ikon di sini berbeda dengan yang sebelumnya
}
ShowChild(c+id,id);
Pilih Saat Ini(ID saat ini,id);
Telusuri Kanan(id);
}
//Melalui parameter ke frame kanan
fungsi Telusuri Kanan(id){
Pilih Saat Ini(ID saat ini,id);
top.ContentFrame.location=../ArticleMain.asp?ClassID=+ id;
}
//Berfungsi untuk mengatur status kategori yang dipilih
fungsi CurrentSelect(lama,baru){
ID saat ini=newid;
document.getElementById(s+oldid).style.backgroundColor=putih;
document.getElementById(s+currentID).style.backgroundColor=#C0C0E9;
}
//Buat objek XMLHttpRequest
fungsi BuatXMLHttpRequest()
{
jika (jendela.ActiveXObject)
{
xmlHttp = ActiveXObject baru(Microsoft.XMLHTTP);
}
kalau tidak
{
xmlHttp = XMLHttpRequest baru();
}
}
//Fungsi pemrosesan Ajax
//id, id lapisan
//rid, id data dalam tabel
fungsi ShowChild(cid,id)
{
BuatXMLHttpRequest();
jika(xmlHttp)
{
xmlHttp.open('POST','child.asp',true);
xmlHttp.setRequestHeader('Jenis Konten','application/x-www-form-urlencoded');
var KirimData = 'id='+id;
xmlHttp.kirim(KirimData);
xmlHttp.onreadystatechange=fungsi()
{
if(xmlHttp.readyState==4)
{
if(xmlHttp.status==200)
{
GetId(cid).innerHTML = xmlHttp.responseText;
}
kalau tidak
{
GetId(cid).innerHTML='Kesalahan:'+xmlHttp.statusText;
}
}
kalau tidak
{
GetId(cid).innerHTML=Mengirimkan data...;
}
}
}
kalau tidak
{
GetId(cid).innerHTML='Maaf, browser Anda tidak mendukung XMLHttpRequest, silakan gunakan IE6 atau lebih tinggi! ';
}
}
//Dapatkan objek halaman
//id, id lapisan
fungsi GetId(id)
{
kembalikan dokumen.getElementById(id);
}
</skrip>
</kepala>
<tubuh>
<!--#sertakan file=../conn.asp-->
<%
'Tampilkan direktori root
sql=pilih *,(pilih 1 ClassID teratas dari ArticleClass di mana Depth=0 diurutkan berdasarkan ClassID desc) sebagai lastid dari ArticleClass di mana Depth=0 diurutkan berdasarkan ClassID
setel rs=sambungan.eksekusi(sql)
jika bukan rs.eof maka
respon.Tulis <ul>&vbcr
lakukan selagi tidak rs.eof
jika cint(trim(rs(ClassID)))=cint(trim(rs(lastid))) maka
jika rs(Anak)>0 maka
respon.Tulis <li><img id='p&rs(ClassID)&' src=images/lastclosed.gif onclick=DivDisplay2('c&rs(ClassID)&','&rs(ClassID)&','p&rs(ClassID)& ','f& rs(ClassID) &') style=kursor : tangan; align=absmiddle>
respon.Tulis <img src=gambar/folder.gif align=absmiddle id='f& rs(ClassID) &' /> <span id='s& trim(rs(ClassID)) &' onclick=BrowseRight(& trim(rs (ID Kelas)) &) ondblclick=DivDisplay2('c&rs(ClassID)&','&rs(ClassID)&','p&rs(ClassID)&','f& rs(ClassID) &')>& rs(ClassName) &</span>
kalau tidak
respon.Tulis <li><img id='p& rs(ClassID) &' src=images/lastnochild.gif align=absmiddle />
respon.Tulis <img src=gambar/folder.gif align=absmiddle id='f& rs(ClassID) &' /> <span id='s& trim(rs(ClassID)) &' onclick=BrowseRight(& trim(rs (IDKelas)) &)>& rs(NamaKelas) &</span>
berakhir jika
kalau tidak
jika rs(Anak)>0 maka
respon.Tulis <li><img id='p&rs(ClassID)&' src=images/closed.gif onclick=DivDisplay('c&rs(ClassID)&','&rs(ClassID)&','p&rs(ClassID)& ','f& rs(ClassID) &') style=kursor : tangan; align=absmiddle>
respon.Tulis <img src=gambar/folder.gif align=absmiddle id='f& rs(ClassID) &' /> <span id='s& trim(rs(ClassID)) &' onclick=BrowseRight(& trim(rs (ID Kelas)) &) ondblclick=DivDisplay('c&rs(ClassID)&','&rs(ClassID)&','p&rs(ClassID)&','f& rs(ClassID) &')>& rs(ClassName) &</span>
kalau tidak
respon.Tulis <li><img id='p& rs(ClassID) &' src=images/nofollow2.gif align=absmiddle />
respon.Tulis <img src=gambar/folder.gif align=absmiddle id='f& rs(ClassID) &' /> <span id='s& trim(rs(ClassID)) &' onclick=BrowseRight(& trim(rs (IDKelas)) &)>& rs(NamaKelas) &</span>
berakhir jika
berakhir jika
jika cint(trim(rs(ClassID)))=cint(trim(rs(lastid))) maka
respon.Tulis <div id='c&rs(ClassID)&' style='display:none;'></div>
kalau tidak
respon.Tulis <div id='c&rs(ClassID)&' style='display:none;' class=childdiv></div>
berakhir jika
respon.Tulis </li>&vbcr
rs.movenext
lingkaran
respon.Tulis </ul>&vbcr
berakhir jika
rs.tutup
atur rs=tidak ada
samb.tutup
Setel samb = Tidak ada
%>
</tubuh>
</html>