1. 截圖看看效果:
2.html結構
<div>
<asp:TreeView ID="tvList" runat="server" ShowCheckBoxes="All" ShowLines="True" οnclick="javascript:return postBackByObjectCheck()"/>
</div>
3.函數解析:
//**IE下,event對象有srcElement屬性,但是沒有target屬性;
//**Firefox下,event對象有target屬性,但是沒有srcElement屬性.但他們的作用是相當的
function getEvent() {
if (document.all) {
return window.event; //如果是ie
}
func = getEvent.caller;
while (func != null) {
var arg0 = func.arguments[0];
if (arg0) {
if ((arg0.constructor == Event || arg0.constructor == MouseEvent)
|| (typeof (arg0) == "object" && arg0.preventDefault && arg0.stopPropagation)) {
return arg0;
}
}
func = func.caller;
}
return null;
}
function postBackByObjectCheck() {
var evt = getEvent();//**call method
var o = evt.srcElement || evt.target;
if (o.tagName == "INPUT" && o.type == "checkbox") //點擊treeview的checkbox是觸發
{
var d = o.id; //獲得當前checkbox的id;
var e = d.replace("CheckBox", "Nodes"); //通過查看腳本信息,獲得包含所有子節點div的id
var div = window.document.getElementById(e); //獲得div對象
if (div != null) //如果不爲空則表示,存在自節點
{
var check = div.getElementsByTagName("INPUT"); //獲得div中所有的已input開始的標記
for (i = 0; i < check.length; i++) {
if (check[i].type == "checkbox") //如果是checkbox
{
check[i].checked = o.checked; //字節點的狀態和父節點的狀態相同,即達到全選
}
}
}
else //點子節點的時候,使父節點的狀態改變,即不爲全選
{
var divid = o.parentElement.parentElement.parentElement.parentElement.parentElement; //子節點所在的div
var id = divid.id.replace("Nodes", "CheckBox"); //獲得根節點的id
var checkbox = divid.getElementsByTagName("INPUT"); //獲取所有子節點數
var s = 0;
for (i = 0; i < checkbox.length; i++) {
if (checkbox[i].checked) //判斷有多少子節點被選中
{
s++;
}
}
if (s == checkbox.length) //如果全部選中 或者 選擇的是另外一個根節點的子節點 ,
{ // 則開始的根節點的狀態仍然爲選中狀態
window.document.getElementById(id).checked = true;
}
else { //否則爲沒選中狀態
window.document.getElementById(id).checked = false;
}
}
}
}
//**後臺獲取選中的ID
StringBuilder str = new StringBuilder();
for (int i = 0; i < tvList.CheckedNodes.Count; i++)
{
if (tvList.CheckedNodes[i].Checked)
str.Append(tvList.CheckedNodes[i].Value+";");
}