เมื่อทำการอนุญาต ฟังก์ชันต่อไปนี้จะถูกใช้งานเป็นหลัก:
1. หากสามารถเข้าถึงโหนดได้ โหนดหลักจะต้องสามารถเข้าถึงได้ด้วย
2. หากสามารถเข้าถึงโหนดได้ ก็สามารถเข้าถึงโหนดย่อยได้เช่นกัน
3. หากไม่สามารถเข้าถึงโหนดได้ โหนดย่อยก็จะไม่สามารถเข้าถึงได้เช่นกัน
การใช้โครงสร้างตัวเลขกับ CheckBox จะทำให้ผู้ใช้ได้รับประสบการณ์ที่ดี แต่ความยากในการเขียนโปรแกรมก็เพิ่มขึ้นเล็กน้อยเช่นกัน หากเซิร์ฟเวอร์ทำทั้งหมด จะไม่ทำงานอย่างแน่นอนหากคุณคลิกที่มัน คุณสามารถใช้แค่จาวาสคริปต์เท่านั้น ซึ่งน่าหงุดหงิดเมื่อทำการดีบักด้วยจาวาสคริปต์ มาก เป็นคลาสคำและการเรียกซ้ำที่น่าหงุดหงิด ฉันเคยใช้วิธีต่อไปนี้
<ภาษาสคริปต์ = "จาวาสคริปต์">
-
// เริ่มต้นโหนด
initchecknode(document.all("tvItemClientID").value,document.all("checked").value)
// เริ่มต้นโหนดที่เลือก
ฟังก์ชั่น initchecknode (ต้นไม้, tvvalue)
-
//รับสตริงของโหนดที่ต้องการเริ่มต้นสถานะการเลือก
var ที่เลือก Nodes = tvvalue;
var arrayNodes = อาร์เรย์ใหม่ ();
arrayNodes = เลือก Nodes.split (");
var AllRootNode=อาร์เรย์ใหม่();
AllRootNode=document.getElementById(tree).getChildren();
//เริ่มต้นโหนดที่เลือก
findAndCheckedNodes (AllRootNode, arrayNodes);
}
// เริ่มต้นโหนดที่เลือกตามสตริงของโหนดที่เลือก
ฟังก์ชั่น findAndCheckedNodes (NodeArray, nodeDatas)
-
//alert(NodeArray.length);
ถ้า (parseInt (NodeArray.length)==0)
-
กลับ;
-
อื่น
-
สำหรับ (var i=0;i<parseInt(NodeArray.length);i++)
-
var cNode, nodeData;
cNode=NodeArray[i];
///// หากโหนดอยู่ใน nodeDatas ให้เริ่มต้นการตรวจสอบ = true;
nodeData = cNode.getAttribute("NodeData");
สำหรับ (var j=0;j<nodeDatas.length;j++)
-
ถ้า (nodeDatas [j] == nodeData)
-
cNode.setAttribute("ตรวจสอบแล้ว", "จริง");
หยุดพัก;
-
-
//ถ้ามีโหนดลูก ให้ทำการเรียกซ้ำต่อไป
ถ้า (parseInt (cNode.getChildren().length)!=0)
findAndCheckedNodes(cNode.getChildren(),nodeDatas);
-
-
-
-
//เหตุการณ์ตรวจสอบ
ฟังก์ชั่น tree_oncheck (ต้นไม้)
-
วาร์ฉัน;
var node=tree.getTreeNode(tree.clickedNodeIndex);
var Pchecked=tree.getTreeNode(tree.clickedNodeIndex).getAttribute("ตรวจสอบแล้ว");
setcheck (โหนด, Pchecked);
setParent (โหนด, Pchecked);
//window.alert(Pchecked);
document.all.checked.value = "";
ถ้า (tree.getChildren().length > 0)
-
สำหรับ (i=0;i<=tree.getChildren().length-1;i++)
-
ถ้า (tree.getChildren()[i].getAttribute("ตรวจสอบแล้ว"))
-
AddChecked(tree.getChildren()[i]);
-
FindCheckedFromNode(tree.getChildren()[i]);
-
-
-
// ตั้งค่าฟังก์ชั่นการเลือกโหนดลูก
setcheck (โหนด, Pchecked)
-
วาร์ฉัน;
var ChildNode=อาร์เรย์ใหม่();
ChildNode=node.getChildren();
ถ้า (parseInt (ChildNode.length)==0)
-
กลับ;
-
อื่น
-
สำหรับ (i=0;i<ChildNode.length;i++)
-
var cNode;
cNode=โหนดลูก[i];
cNode.setAttribute("ตรวจสอบแล้ว",Pตรวจสอบแล้ว);
//cNode.Checked = Pchecked;
ถ้า (parseInt (cNode.getChildren().length)!=0)
-
setcheck (cNode, Pchecked);
-
-
-
}
// ตั้งค่าการเลือกโหนดลูก / ยกเลิก;
//ในเวลาเดียวกัน จำเป็นต้องตั้งค่าสถานะของโหนดหลัก (หากไม่ได้เลือก จะมีการตั้งค่าเฉพาะโหนดนี้และผู้ติดต่อทั้งหมดเท่านั้น และไม่เกี่ยวข้องกับผู้ติดต่อหลัก)
ฟังก์ชั่น setParent (โหนด, พีซี)
-
var parentNode = node.getParent();
ถ้า (โหนดหลัก)
-
var parentNodeFather = parentNode.getParent();
ถ้า (parentNodeFather)
-
setParent (โหนดหลัก, พีซี);
-
ถ้า(พีซี)
{parentNode.setAttribute("ตรวจสอบแล้ว",พีซี);}
อื่น
-
checkBrother (parentNode, พีซี, node.getAttribute ("NodeData"))
-
-
}
//ตรวจสอบว่าได้เลือกผู้ติดต่อย่อยหรือไม่ หากเลือกไว้ ให้คืนค่าเป็นจริง
//ตรวจสอบเฉพาะโหนดระดับแรกเท่านั้น
ฟังก์ชั่น checkBrother (parentNode, Pc, NodeData)
-
var childNodes = อาร์เรย์ใหม่ ();
childNodes = parentNode.getChildren();
ถ้า (childNodes.length >0)
-
var bChecked = จริง;
สำหรับ (var i=0;i<childNodes.length;i++)
-
if(childNodes[i].getAttribute("ตรวจสอบ") == true && childNodes[i].getAttribute("NodeData") != NodeData)
-
//alert(i+childNodes[i].getAttribute("ข้อความ"));
bChecked = เท็จ;
หยุดพัก;
-
-
ถ้า (bChecked)
-
parentNode.setAttribute("ตรวจสอบแล้ว",พีซี);
-
อื่น
-
//เลือกโหนดพาเรนต์ทั้งหมด
setParent (โหนดหลัก,!พีซี)
-
-
อื่น
-
parentNode.setAttribute("ตรวจสอบแล้ว",พีซี);
-
}
// รับสถานะโหนดทั้งหมด
ฟังก์ชั่น FindCheckedFromNode (โหนด)
-
วาร์ i = 0;
โหนด var = อาร์เรย์ใหม่ ();
โหนด = node.getChildren();
สำหรับ (i = 0; i <= nodes.length - 1; i++)
-
ถ้า (โหนด [i] .getAttribute ("ตรวจสอบ"))
-
AddChecked(โหนด[i]);
-
ถ้า (parseInt(nodes[i].getChildren().length) != 0 )
-
FindCheckedFromNode (โหนด [i]);
-
-
-
//เพิ่มโหนดที่เลือก
ฟังก์ชั่น AddChecked (โหนด)
-
document.all.checked.value += node.getAttribute("NodeData") + ",";
}
//-->
</script>เมธอดนี้มีปัญหาใหญ่ นั่นคือ ไม่สามารถรับช่องทำเครื่องหมายที่ไคลเอ็นต์กำหนดไว้บนฝั่งเซิร์ฟเวอร์ได้ ตอนนี้สามารถข้ามแผนผังระหว่างการตรวจสอบและใส่ค่าที่ตรวจสอบแล้วลงในข้อความเท่านั้น เซิร์ฟเวอร์แล้วเซิร์ฟเวอร์จะแยกวิเคราะห์อักขระ 1@2 @
ตอนนี้ฉันใช้ asp.net2.0 และใช้วิธีการต่อไปนี้
ฟังก์ชั่น public_GetParentByTagName (องค์ประกอบ tagName)
-
var parent = element.parentNode;
var upperTagName = tagName.toUpperCase();
//หากองค์ประกอบนี้ไม่ใช่แท็กที่ต้องการ ให้ติดตามต่อไป
ในขณะที่ (พาเรนต์ && (parent.tagName.toUpperCase() != upperTagName))
-
parent = parent.parentNode ? parent.parentNode : parent.parentElement;
-
กลับผู้ปกครอง;
}
//ตั้งค่าโหนดหลักของ Cheched - หากโหนดสามารถเข้าถึงได้ โหนดหลักของโหนดนั้นจะต้องสามารถเข้าถึงได้ด้วย
ฟังก์ชั่น setParentChecked (objNode)
-
var objParentDiv = public_GetParentByTagName(objNode,"div");
ถ้า (objParentDiv==null || objParentDiv == "ไม่ได้กำหนด")
-
กลับ;
-
var objID = objParentDiv.getAttribute("ID");
objID = objID.substring(0,objID.indexOf("โหนด"));
objID = objID+ "ช่องทำเครื่องหมาย";
var objParentCheckBox = document.getElementById(objID);
ถ้า (objParentCheckBox==null || objParentCheckBox == "ไม่ได้กำหนด")
-
กลับ;
-
ถ้า(objParentCheckBox.tagName!="INPUT" && objParentCheckBox.type == "ช่องทำเครื่องหมาย")
กลับ;
objParentCheckBox.checked = จริง;
setParentChecked(objParentCheckBox);
}
//ตั้งค่าโหนดลูกของโหนดโดยไม่ตรวจสอบ - หากโหนดไม่สามารถเข้าถึงได้ โหนดลูกจะไม่สามารถเข้าถึงได้เช่นกัน
ฟังก์ชั่น setChildUnChecked (divID)
-
var objchild = divID.children;
จำนวนนับ = objchild.length;
สำหรับ (var i=0;i<objchild.length;i++)
-
var tempObj = objchild[i];
ถ้า (tempObj.tagName=="INPUT" && tempObj.type == "ช่องทำเครื่องหมาย")
-
tempObj.checked = เท็จ;
-
setChildUnChecked(tempObj);
-
}
// ตั้งค่าโหนดลูกของโหนดที่แคช - หากสามารถเข้าถึงโหนดได้ โหนดย่อยก็สามารถเข้าถึงได้เช่นกัน
ฟังก์ชั่น setChildChecked (divID)
-
var objchild = divID.children;
จำนวนนับ = objchild.length;
สำหรับ (var i=0;i<objchild.length;i++)
-
var tempObj = objchild[i];
ถ้า (tempObj.tagName=="INPUT" && tempObj.type == "ช่องทำเครื่องหมาย")
-
tempObj.checked = จริง;
-
setChildChecked(tempObj);
-
}
//ทริกเกอร์เหตุการณ์
ฟังก์ชั่น CheckEvent()
{
var objNode = event.srcElement;
if(objNode.tagName!="INPUT" || objNode.type!="ช่องทำเครื่องหมาย")
กลับ;
ถ้า (objNode.checked==true)
-
setParentChecked (objNode);
var objID = objNode.getAttribute("ID");
var objID = objID.substring(0,objID.indexOf("ช่องทำเครื่องหมาย"));
var objParentDiv = document.getElementById(objID+ "โหนด");
ถ้า (objParentDiv==null || objParentDiv == "ไม่ได้กำหนด")
-
กลับ;
-
setChildChecked(objParentDiv);
-
อื่น
-
var objID = objNode.getAttribute("ID");
var objID = objID.substring(0,objID.indexOf("ช่องทำเครื่องหมาย"));
var objParentDiv = document.getElementById(objID+ "โหนด");
ถ้า (objParentDiv==null || objParentDiv == "ไม่ได้กำหนด")
-
กลับ;
-
setChildUnChecked(objParentDiv);
-
}ข้อได้เปรียบที่ใหญ่ที่สุดของวิธีนี้คือเซิร์ฟเวอร์สามารถรับค่าที่ตรวจสอบแล้วซึ่งกำหนดโดย javascript ไม่จำเป็นต้องดาวน์โหลดแผนผังทั้งหมดโดยไม่ต้องคลิก คุณสามารถดาวน์โหลดได้เพียงครั้งเดียวบนเซิร์ฟเวอร์
//สำรวจโหนดลูก
โมฆะสาธารณะ GetChildNode (โหนด TreeNode)
-
foreach (โหนด TreeNode ใน Node.ChildNodes)
-
ถ้า (โหนดตรวจสอบแล้ว)
-
StrChecked += node.Value+"@";
-
GetChildNode(โหนด);
-
-
} ฉันยังคงได้รับค่าเช็คของมัน