Saat melakukan izin, fungsi-fungsi berikut ini terutama diterapkan:
1. Jika node dapat diakses, maka node induknya juga harus dapat diakses;
2. Jika node dapat diakses, node turunannya juga dapat diakses;
3. Jika node tidak dapat diakses, node turunannya juga tidak dapat diakses.
Menggunakan struktur angka dengan CheckBox bisa mendapatkan pengalaman pengguna yang baik, namun kesulitan pemrogramannya juga sedikit meningkat. Jika semuanya dilakukan oleh server, maka pasti tidak akan berfungsi jika diklik. Anda hanya bisa menggunakan javascript , yang membuat frustrasi saat melakukan debug dengan javascript. Sangat, kelas kata, dan rekursi yang membuat frustrasi.
<skrip bahasa="javascript">
<!--
//Inisialisasi simpul
initchecknode(document.all("tvItemClientID").value,document.all("dicentang").value)
//Inisialisasi node yang dipilih
fungsi initchecknode(pohon,nilaitv)
{
//Dapatkan string dari node yang perlu menginisialisasi status pemilihan.
var Node yang dipilih = nilai tv;
var arrayNodes = Array baru();
arrayNodes = Nodes yang dipilih.split(",");
var AllRootNode=Array baru();
AllRootNode=dokumen.getElementById(pohon).getChildren();
//Inisialisasi node yang dipilih
findAndCheckedNodes(AllRootNode,arrayNodes);
}
//Inisialisasi node yang dipilih berdasarkan string dari node yang dipilih
fungsi findAndCheckedNodes(NodeArray,nodeDatas)
{
//alert(NodeArray.panjang);
if(parseInt(NodeArray.panjang)==0)
{
kembali;
}
kalau tidak
{
for(var i=0;i<parseInt(NodeArray.panjang);i++)
{
var cNode,nodeData;
cNode=NodeArray[i];
////Jika node berada di nodeDatas, inisialisasi dicentang = true;
nodeData = cNode.getAttribute("NodeData");
for(var j=0;j<nodeDatas.panjang;j++)
{
jika(datasimpul[j] == data simpul)
{
cNode.setAttribute("dicentang","benar");
merusak;
}
}
//Jika ada node anak, lanjutkan rekursi
if(parseInt(cNode.getChildren().panjang)!=0)
findAndCheckedNodes(cNode.getChildren(),nodeDatas);
}
}
}
//-->
//pada acara pemeriksaan
fungsi pohon_oncheck(pohon)
{
var saya;
var node=pohon.getTreeNode(pohon.clickedNodeIndex);
var Pchecked=tree.getTreeNode(tree.clickedNodeIndex).getAttribute("dicentang");
setcheck(simpul,Diperiksa);
setParent(simpul,Diperiksa);
//window.alert(Dicentang);
dokumen.semua.diperiksa.nilai = "";
jika (pohon.getChildren().panjang > 0)
{
untuk (i=0;i<=tree.getChildren().length-1;i++)
{
if (tree.getChildren()[i].getAttribute("Dicentang"))
{
AddChecked(tree.getChildren()[i]);
}
FindCheckedFromNode(pohon.getChildren()[i]);
}
}
}
//Atur
fungsi pemilihan node anak setcheck(node,Pchecked)
{
var saya;
var ChildNode=Array baru();
ChildNode=node.getChildren();
if(parseInt(ChildNode.panjang)==0)
{
kembali;
}
kalau tidak
{
for(i=0;i<ChildNode.panjang;i++)
{
var cNode;
cNode=NodeAnak[i];
cNode.setAttribute("Diperiksa",Pdiperiksa);
//cNode.Diperiksa = Diperiksa;
if(parseInt(cNode.getChildren().panjang)!=0)
{
setcheck(cNode,Pdiperiksa);
}
}
}
}
//Atur pemilihan node anak/batalkan;
//Pada saat yang sama, status node induk perlu disetel (jika tidak dipilih, hanya node ini dan semua kontaknya yang disetel, dan kontak induk tidak terlibat)
fungsi setParent(simpul,Pc)
{
var parentNode = simpul.getParent();
jika(Node Induk)
{
var parentNodeAyah = parentNode.getParent();
if(parentNodeAyah)
{
setParent(parentNode,Pc);
}
jika (Pc)
{parentNode.setAttribute("dicentang",Pc);}
kalau tidak
{
checkSaudara(parentNode,Pc,node.getAttribute("NodeData"))
}
}
}
//Periksa apakah sub-kontak dipilih, jika ada yang dipilih, kembalikan true
//Hanya periksa node tingkat pertama.
fungsi checkSaudara(parentNode,Pc,NodeData)
{
var childNodes = Array baru();
childNodes = parentNode.getChildren();
if(childNodes.panjang >0)
{
var bDiperiksa = benar;
for(var i=0;i<childNodes.length;i++)
{
if(childNodes[i].getAttribute("dicentang") == benar && childNodes[i].getAttribute("NodeData") != NodeData)
{
//alert(i+childNodes[i].getAttribute("Teks"));
bDicentang = salah;
merusak;
}
}
jika (b Dicentang)
{
parentNode.setAttribute("dicentang",Pc);
}
kalau tidak
{
//Pilih semua node induk
setParent(parentNode,!Pc)
}
}
kalau tidak
{
parentNode.setAttribute("dicentang",Pc);
}
}
//Dapatkan semua status simpul
fungsi TemukanDiperiksaDariNode(simpul)
{
var saya = 0;
var node = Array baru();
node = node.getChildren();
untuk (i = 0; i <= node.panjang - 1; i++)
{
if (node[i].getAttribute("Dicentang"))
{
AddChecked(node[i]);
}
jika (parseInt(node[i].getChildren().length) != 0 )
{
FindCheckedFromNode(node[i]);
}
}
}
//Tambahkan simpul yang dipilih
fungsi TambahkanDiperiksa(simpul)
{
dokumen.semua.diperiksa.nilai += node.getAttribute("NodeData") + ",";
}
//-->
</script>Metode ini memiliki masalah besar, yaitu Kotak Centang yang disetel oleh klien tidak dapat diperoleh di sisi server. Sekarang hanya dapat melintasi pohon selama Pemeriksaan dan memasukkan nilai Dicentang ke dalam teks server, dan kemudian server akan mengurai karakter 1@2 @
Sekarang saya menggunakan asp.net2.0 dan menggunakan metode berikut
fungsi public_GetParentByTagName(elemen, tagName)
{
var induk = elemen.parentNode;
var upperTagName = tagName.toUpperCase();
//Jika elemen ini bukan tag yang diinginkan, lanjutkan menelusuri
while (induk && (parent.tagName.toUpperCase() != upperTagName))
{
induk = induk.parentNode ? induk.parentNode : induk.parentElement;
}
kembalikan orang tua;
}
//Mengatur node induk dari node tersebut menjadi Cheched - jika node tersebut dapat diakses, maka node induknya juga harus dapat diakses
fungsi setParentChecked(objNode)
{
var objParentDiv = public_GetParentByTagName(objNode,"div");
if(objParentDiv==null || objParentDiv == "tidak terdefinisi")
{
kembali;
}
var objID = objParentDiv.getAttribute("ID");
objID = objID.substring(0,objID.indexOf("Node"));
objID = objID+"Kotak Centang";
var objParentCheckBox = dokumen.getElementById(objID);
if(objParentCheckBox==null || objParentCheckBox == "tidak terdefinisi")
{
kembali;
}
if(objParentCheckBox.tagName!="INPUT" && objParentCheckBox.type == "kotak centang")
kembali;
objParentCheckBox.diperiksa = benar;
setParentChecked(objParentCheckBox);
}
//Setel simpul anak dari simpul tersebut agar tidak dicentang - jika simpul tersebut tidak dapat diakses, simpul turunannya juga tidak akan dapat diakses.
fungsi setChildUnChecked (divID)
{
var objchild = divID.anak;
var count = objchild.panjang;
for(var i=0;i<objchild.panjang;i++)
{
var tempObj = objchild[i];
if(tempObj.tagName=="INPUT" && tempObj.type == "kotak centang")
{
tempObj.diperiksa = false;
}
setChildUnChecked(tempObj);
}
}
//Atur node anak dari node tersebut ke dalam cheched - jika node tersebut dapat diakses, maka node turunannya juga dapat diakses
fungsi setChildChecked (divID)
{
var objchild = divID.anak;
var count = objchild.panjang;
for(var i=0;i<objchild.panjang;i++)
{
var tempObj = objchild[i];
if(tempObj.tagName=="INPUT" && tempObj.type == "kotak centang")
{
tempObj.diperiksa = benar;
}
setChildChecked(tempObj);
}
}
// peristiwa pemicu
fungsi Periksa Acara()
{
var objNode = acara.srcElement;
if(objNode.tagName!="INPUT" || objNode.type!="kotak centang")
kembali;
jika(objNode.diperiksa==benar)
{
setParentChecked(objNode);
var objID = objNode.getAttribute("ID");
var objID = objID.substring(0,objID.indexOf("Kotak Centang"));
var objParentDiv = document.getElementById(objID+"Node");
if(objParentDiv==null || objParentDiv == "tidak terdefinisi")
{
kembali;
}
setChildChecked(objParentDiv);
}
kalau tidak
{
var objID = objNode.getAttribute("ID");
var objID = objID.substring(0,objID.indexOf("Kotak Centang"));
var objParentDiv = document.getElementById(objID+"Node");
if(objParentDiv==null || objParentDiv == "tidak terdefinisi")
{
kembali;
}
setChildUnChecked(objParentDiv);
}
}Keuntungan terbesar dari metode ini adalah server bisa mendapatkan nilai Checked yang ditetapkan oleh javascript. Tidak perlu mendownload semua pohon tanpa mengklik.
//Melintasi node anak
kekosongan publik GetChildNode(Node TreeNode)
{
foreach (simpul TreeNode di Node.ChildNodes)
{
if (simpul.Diperiksa)
{
StrChecked += simpul.Nilai+"@";
}
GetChildNode(simpul);
}
}
}Saya masih bisa mendapatkan nilai Ceknya