";
};
this.onkeydown= function(e)
{
e = window.event || e; var key = e.keyCode || e.which;
switch(key)
{
case 37 : eval(Tname).upperNode(); break; //Arrow left, shrink child node
case 38 : eval(Tname).pervNode(); break; //Arrow up
case 39 : eval(Tname).lowerNode(); break; //Arrow right, expand child node
case 40 : eval(Tname).nextNode(); break; //Arrow down
}
};
}
//瀏覽器類型及版本檢測
MzTreeView.prototype.browserCheck = function()
{
var ua = window.navigator.userAgent.toLowerCase(), bname;
if(/msie/i.test(ua))
{
this.navigator = /opera/i.test(ua) ? "opera" : "";
if(!this.navigator) this.navigator = "msie";
}
else if(/gecko/i.test(ua))
{
var vendor = window.navigator.vendor.toLowerCase();
if(vendor == "firefox") this.navigator = "firefox";
else if(vendor == "netscape") this.navigator = "netscape";
else if(vendor == "") this.navigator = "mozilla";
}
else this.navigator = "msie";
if(window.opera) this.wordLine = false;
};
//給 TreeView 樹加上樣式設(shè)置
MzTreeView.prototype.setStyle = function()
{
/*
width: 16px;
height: 16px;
width: 20px;
height: 20px;
*/
var style = "";
document.write(style);
};
//當(dāng)根節(jié)點(diǎn)為空的時(shí)候做的處理
MzTreeView.prototype.atRootIsEmpty = function()
{
var RCN = this.node["0"].childNodes;
for(var i=0; i
{
if(!RCN[i].isLoad) this.expand(RCN[i].id);
if (RCN[i].text=="")
{
var node = RCN[i].childNodes[0], HCN = node.hasChild;
if(this.wordLine)
{
var span = this.getElementById(this.name +"_tree_"+ node.id);
span = span.childNodes[0].childNodes[0].childNodes[0];
span.innerHTML = RCN[i].childNodes.length>1 ? "┌" : "─";
}
else
{
node.iconExpand = RCN[i].childNodes.length>1 ? HCN ? "PM0" : "L0" : HCN ? "PM3" : "L3"
this.getElementById(this.name +"_expand_"+ node.id).src = this.icons[node.iconExpand].src;
}
}
}
};
//初始化數(shù)據(jù)源里的數(shù)據(jù)以便后面的快速檢索
MzTreeView.prototype.dataFormat = function()
{
var a = new Array();
for (var id in this.nodes) a[a.length] = id;
this.names = a.join(this._d + this._d);
this.totalNode = a.length; a = null;
};
//在數(shù)據(jù)源檢索所需的數(shù)據(jù)節(jié)點(diǎn)
//id 客戶端節(jié)點(diǎn)對應(yīng)的id
MzTreeView.prototype.load = function(id)
{
var node = this.node[id], d = this.divider, _d = this._d;
var sid = node.sourceIndex.substr(node.sourceIndex.indexOf(d) + d.length);
var reg = new RegExp("(^|"+_d+")"+ sid +d+"[^"+_d+d +"]+("+_d+"|$)", "g");
var cns = this.names.match(reg), tcn = this.node[id].childNodes; if (cns){
reg = new RegExp(_d, "g"); for (var i=0; i
tcn[tcn.length] = this.nodeInit(cns[i].replace(reg, ""), id); }
node.isLoad = true;
};
//初始化節(jié)點(diǎn)信息, 根據(jù) this.nodes 數(shù)據(jù)源生成節(jié)點(diǎn)的詳細(xì)信息
//sourceIndex 數(shù)據(jù)源中的父子節(jié)點(diǎn)組合的字符串 0_1
//parentId 當(dāng)前樹節(jié)點(diǎn)在客戶端的父節(jié)點(diǎn)的 id
MzTreeView.prototype.nodeInit = function(sourceIndex, parentId)
{
this.index++;
var source= this.nodes[sourceIndex], d = this.divider;
var text = this.getAttribute(source, "text");
var hint = this.getAttribute(source, "hint");
var sid = sourceIndex.substr(sourceIndex.indexOf(d) + d.length);
this.node[this.index] =
{
"id" : this.index,
"text" : text,
"hint" : hint ? hint : text,
"icon" : this.getAttribute(source, "icon"),
"path" : this.node[parentId].path + d + this.index,
"isLoad": false,
"isExpand": false,
"parentId": parentId,
"parentNode": this.node[parentId],
"sourceIndex" : sourceIndex,
"childAppend" : ""
};
this.nodes[sourceIndex] = "index:"+ this.index +";"+ source;
this.node[this.index].hasChild = this.names.indexOf(this._d + sid + d)>-1;
if(this.node[this.index].hasChild) this.node[this.index].childNodes = [];
return this.node[this.index];
};
//從XML格式字符串里提取信息
//source 數(shù)據(jù)源里的節(jié)點(diǎn)信息字符串(以后可以擴(kuò)展對XML的支持)
//name 要提取的屬性名
MzTreeView.prototype.getAttribute = function(source, name)
{
var reg = new RegExp("(^|;|s)"+ name +"s*:s*([^;]*)(s|;|$)", "i");
if (reg.test(source)) return RegExp.$2.replace(/[x0f]/g, ";"); return "";
};
//根據(jù)節(jié)點(diǎn)的詳細(xì)信息生成HTML
//node 樹在客戶端的節(jié)點(diǎn)對象
//AtEnd 布爾值 當(dāng)前要轉(zhuǎn)換的這個(gè)節(jié)點(diǎn)是否為父節(jié)點(diǎn)的子節(jié)點(diǎn)集中的最后一項(xiàng)
MzTreeView.prototype.nodeToHTML = function(node, AtEnd)
{
var source = this.nodes[node.sourceIndex];
var target = this.getAttribute(source, "target");
var data = this.getAttribute(source, "data");
var url = this.getAttribute(source, "url");
if(!url) url = this.url;
if(data) url += (url.indexOf("?")==-1?"?":"&") + data;
if(!target) target = this.target;
var id = node.id;
var HCN = node.hasChild, isRoot = node.parentId=="0";
if(isRoot && node.icon=="") node.icon = "root";
if(node.icon=="" || typeof(this.icons[node.icon])=="undefined")
node.icon = HCN ? "folder" : "file";
node.iconExpand = AtEnd ? "└" : "├";
var HTML = "
"; if(!isRoot) { node.childAppend = node.parentNode.childAppend + (AtEnd ? " " : "│"); if(this.wordLine) { HTML += ""+ node.parentNode.childAppend + (AtEnd ? "└" : "├") +" "; if(HCN) HTML += "+ "; } else { node.iconExpand = HCN ? AtEnd ? "PM2" : "PM1" : AtEnd ? "L2" : "L1"; HTML += ""+ this.word2image(node.parentNode.childAppend) +" "align='absmiddle' id='"+ this.name +"_expand_"+ id +"' "+ "src='"+ this.icons[node.iconExpand].src +"' style='cursor: "+ (!node.hasChild ? "": (this.navigator=="msie"||this.navigator=="opera"? "hand" : "pointer")) +"'> "; } } HTML += " "align='absMiddle' "+ "id='"+ this.name +"_icon_"+ id +"' "+ "src='"+ this.icons[node.icon].src +"'>"class='MzTreeview' hideFocus "+ "id='"+ this.name +"_link_"+ id +"' "+ "href='"+ url +"' "+ "target='"+ target +"' "+ "title='"+ node.hint +"' "+ "onfocus=""+ this.name +".focusLink('"+ id +"')" "+ "onclick="return "+ this.name +".nodeClick('"+ id +"')">"+ node.text + " ";
if(isRoot && node.text=="") HTML = "";
HTML = "rn
"+ HTML HTML +=" ";
return HTML;
};
//在使用圖片的時(shí)候?qū)?node.childAppend 的轉(zhuǎn)換
MzTreeView.prototype.word2image = function(word)
{
var str = "";
for(var i=0; i
{
var img = "";
switch (word.charAt(i))
{
case "│" : img = "L4"; break;
case "└" : img = "L2"; break;
case " " : img = "empty"; break;
case "├" : img = "L1"; break;
case "─" : img = "L3"; break;
case "┌" : img = "L0"; break;
}
if(img!="")
str += "
";
}
return str;
}
//將某個(gè)節(jié)點(diǎn)下的所有子節(jié)點(diǎn)轉(zhuǎn)化成詳細(xì)的元素表達(dá)
//id 樹的客戶端節(jié)點(diǎn) id
MzTreeView.prototype.buildNode = function(id)
{
if(this.node[id].hasChild)
{
var tcn = this.node[id].childNodes, str = "";
for (var i=0; i
str += this.nodeToHTML(tcn[i], i==tcn.length-1);
var temp = this.getElementById(this.name +"_tree_"+ id).childNodes;
temp[temp.length-1].innerHTML = str;
}
};
//聚集到客戶端生成的某個(gè)節(jié)點(diǎn)上
//id 客戶端樹節(jié)點(diǎn)的id
MzTreeView.prototype.focusClientNode = function(id)
{
if(!this.currentNode) this.currentNode=this.node["0"];
var a = this.getElementById(this.name +"_link_"+ id); if(a){ a.focus();
var link = this.getElementById(this.name +"_link_"+ this.currentNode.id);
if(link)with(link.style){color=""; backgroundColor="";}
with(a.style){color = this.colors.highLightText;
backgroundColor = this.colors.highLight;}
this.currentNode= this.node[id];}
};
//焦點(diǎn)聚集到樹里的節(jié)點(diǎn)鏈接時(shí)的處理
//id 客戶端節(jié)點(diǎn) id
MzTreeView.prototype.focusLink= function(id)
{
if(this.currentNode && this.currentNode.id==id) return;
this.focusClientNode(id);
};
//點(diǎn)擊展開樹節(jié)點(diǎn)的對應(yīng)方法
MzTreeView.prototype.expand = function(id, sureExpand)
{
var node = this.node[id];
if (sureExpand && node.isExpand) return;
if (!node.hasChild) return;
var area = this.getElementById(this.name +"_tree_"+ id);
if (area) area = area.childNodes[area.childNodes.length-1];
if (area)
{
var icon = this.icons[node.icon];
var iconE = this.iconsExpand[node.icon];
var Bool = node.isExpand = sureExpand || area.style.display == "none";
var img = this.getElementById(this.name +"_icon_"+ id);
if (img) img.src = !Bool ? icon.src :typeof(iconE)=="undefined" ? icon.src : iconE.src;
var exp = this.icons[node.iconExpand];
var expE = this.iconsExpand[node.iconExpand];
var expand= this.getElementById(this.name +"_expand_"+ id);
if (expand)
{
if(this.wordLine) expand.innerHTML = !Bool ? "+" : "-";
else expand.src = !Bool ? exp.src : typeof(expE) =="undefined" ? exp.src : expE.src;
}
if(!Bool && this.currentNode.path.indexOf(node.path)==0 && this.currentNode.id!=id)
{
try{this.getElementById(this.name +"_link_"+ id).click();}
catch(e){this.focusClientNode(id);}
}
area.style.display = !Bool ? "none" : "block";//(this.navigator=="netscape" ? "block" : "");
if(!node.isLoad)
{
this.load(id);
if(node.id=="0") return;
//當(dāng)子節(jié)點(diǎn)過多時(shí), 給用戶一個(gè)正在加載的提示語句
if(node.hasChild && node.childNodes.length>200)
{
setTimeout(this.name +".buildNode('"+ id +"')", 1);
var temp = this.getElementById(this.name +"_tree_"+ id).childNodes;
temp[temp.length-1].innerHTML = "
"+ (this.wordLine ? node.childAppend +"└" : this.word2image(node.childAppend +"└")) +" "+ " "+ "this.colors.highLightText +"; font-size: 9pt'>請稍候...";
}
else this.buildNode(id);
}
}
};
//節(jié)點(diǎn)鏈接單擊事件處理方法
//id 客戶端樹節(jié)點(diǎn)的 id
MzTreeView.prototype.nodeClick = function(id)
{
var source = this.nodes[this.node[id].sourceIndex];
eval(this.getAttribute(source, "method"));
return !(!this.getAttribute(source, "url") && this.url=="#");
};
//為配合系統(tǒng)初始聚集某節(jié)點(diǎn)而寫的函數(shù), 得到某節(jié)點(diǎn)在數(shù)據(jù)源里的路徑
//sourceId 數(shù)據(jù)源里的節(jié)點(diǎn) id
MzTreeView.prototype.getPath= function(sourceId)
{
Array.prototype.indexOf = function(item)
{
for(var i=0; i
{
if(this[i]==item) return i;
}
return -1;
};
var _d = this._d, d = this.divider;
var A = new Array(), id=sourceId; A[0] = id;
while(id!="0" && id!="")
{
var str = "(^|"+_d+")([^"+_d+d+"]+"+d+ id +")("+_d+"|$)";
if (new RegExp(str).test(this.names))
{
id = RegExp.$2.substring(0, RegExp.$2.indexOf(d));
if(A.indexOf(id)>-1) break;
A[A.length] = id;
}
else break;
}
return A.reverse();
};
//在源代碼里指定 MzTreeView 初始聚集到某個(gè)節(jié)點(diǎn)
//sourceId 節(jié)點(diǎn)在數(shù)據(jù)源里的 id
MzTreeView.prototype.focus = function(sourceId, defer)
{
if (!defer)
{
setTimeout(this.name +".focus('"+ sourceId +"', true)", 100);
return;
}
var path = this.getPath(sourceId);
if(path[0]!="0")
{
alert("節(jié)點(diǎn) "+ sourceId +" 沒有正確的掛靠有效樹節(jié)點(diǎn)上!rn"+
"節(jié)點(diǎn) id 序列 = "+ path.join(this.divider));
return;
}
var root = this.node["0"], len = path.length;
for(var i=1; i
{
if(root.hasChild)
{
var sourceIndex= path[i-1] + this.divider + path[i];
for (var k=0; k
{
if (root.childNodes[k].sourceIndex == sourceIndex)
{
root = root.childNodes[k];
if(i
else this.focusClientNode(root.id);
break;
}
}
}
}
};
//樹的單擊事件處理函數(shù)
MzTreeView.prototype.clickHandle = function(e)
{
e = window.event || e; e = e.srcElement || e.target;
//alert(e.tagName)
switch(e.tagName)
{
case "IMG" :
if(e.id)
{
if(e.id.indexOf(this.name +"_icon_")==0)
this.focusClientNode(e.id.substr(e.id.lastIndexOf("_") + 1));
else if (e.id.indexOf(this.name +"_expand_")==0)
this.expand(e.id.substr(e.id.lastIndexOf("_") + 1));
}
break;
case "A" :
if(e.id) this.focusClientNode(e.id.substr(e.id.lastIndexOf("_") + 1));
break;
case "SPAN" :
if(e.className=="pm")
this.expand(e.id.substr(e.id.lastIndexOf("_") + 1));
break;
default :
if(this.navigator=="netscape") e = e.parentNode;
if(e.tagName=="SPAN" && e.className=="pm")
this.expand(e.id.substr(e.id.lastIndexOf("_") + 1));
break;
}
};
//MzTreeView 雙擊事件的處理函數(shù)
MzTreeView.prototype.dblClickHandle = function(e)
{
e = window.event || e; e = e.srcElement || e.target;
if((e.tagName=="A" || e.tagName=="IMG")&& e.id)
{
var id = e.id.substr(e.id.lastIndexOf("_") + 1);
if(this.node[id].hasChild) this.expand(id);
}
};
//回到樹當(dāng)前節(jié)點(diǎn)的父層節(jié)點(diǎn)
MzTreeView.prototype.upperNode = function()
{
if(!this.currentNode) return;
if(this.currentNode.id=="0" || this.currentNode.parentId=="0") return;
if (this.currentNode.hasChild && this.currentNode.isExpand)
this.expand(this.currentNode.id, false);
else this.focusClientNode(this.currentNode.parentId);
};
//展開當(dāng)前節(jié)點(diǎn)并
MzTreeView.prototype.lowerNode = function()
{
if (!this.currentNode) this.currentNode = this.node["0"];
if (this.currentNode.hasChild)
{
if (this.currentNode.isExpand)
this.focusClientNode(this.currentNode.childNodes[0].id);
else this.expand(this.currentNode.id, true);
}
}
//聚集到樹當(dāng)前節(jié)點(diǎn)的上一節(jié)點(diǎn)
MzTreeView.prototype.pervNode = function()
{
if(!this.currentNode) return; var e = this.currentNode;
if(e.id=="0") return; var a = this.node[e.parentId].childNodes;
for(var i=0; i0){e=a[i-1];
while(e.hasChild){this.expand(e.id, true);
e = e.childNodes[e.childNodes.length - 1];}
this.focusClientNode(e.id); return;} else {
this.focusClientNode(e.parentId); return;}}}
};
//聚集到樹當(dāng)前節(jié)點(diǎn)的下一節(jié)點(diǎn)
MzTreeView.prototype.nextNode = function()
{
var e = this.currentNode; if(!e) e = this.node["0"];
if (e.hasChild){this.expand(e.id, true);
this.focusClientNode(e.childNodes[0].id); return;}
while(typeof(e.parentId)!="undefined"){
var a = this.node[e.parentId].childNodes;
for(var i=0; iif(ielse e = this.node[e.parentId];}}}
};
//展開樹的所有節(jié)點(diǎn)
MzTreeView.prototype.expandAll = function()
{
if(this.totalNode>500) if(
confirm("您是否要停止展開全部節(jié)點(diǎn)?rnrn節(jié)點(diǎn)過多!展開很耗時(shí)")) return;
if(this.node["0"].childNodes.length==0) return;
var e = this.node["0"].childNodes[0];
var isdo = t = false;
while(e.id != "0")
{
var p = this.node[e.parentId].childNodes, pn = p.length;
if(p[pn-1].id==e.id && (isdo || !e.hasChild)){e=this.node[e.parentId]; isdo = true;}
else
{
if(e.hasChild && !isdo)
{
this.expand(e.id, true), t = false;
for(var i=0; i
{
if(e.childNodes[i].hasChild){e = e.childNodes[i]; t = true; break;}
}
if(!t) isdo = true;
}
else
{
isdo = false;
for(var i=0; i
{
if(p[i].id==e.id) {e = p[i+1]; break;}
}
}
}
}
};
//本樹將要用動(dòng)的圖片的字義及預(yù)載函數(shù)
//path 圖片存放的路徑名
MzTreeView.prototype.setIconPath = function(path)
{
var k = 0, d = new Date().getTime();
for(var i in this.icons)
{
var tmp = this.icons[i];
this.icons[i] = new Image();
this.icons[i].src = path + tmp;
if(k==9 && (new Date().getTime()-d)>20)
this.wordLine = true; k++;
}
for(var i in this.iconsExpand)
{
var tmp = this.iconsExpand[i];
this.iconsExpand[i]=new Image();
this.iconsExpand[i].src = path + tmp;
}
};
//設(shè)置樹的默認(rèn)鏈接
//url 默認(rèn)鏈接 若不設(shè)置, 其初始值為 #
MzTreeView.prototype.setURL = function(url){this.url = url;};
//設(shè)置樹的默認(rèn)的目標(biāo)框架名 target
//target 目標(biāo)框架名 若不設(shè)置, 其初始值為 _self
MzTreeView.prototype.setTarget = function(target){this.target = target;};
// -->
一個(gè)簡單的示例: src="http://www.meizz.com/Web/Plugs/MzTreeView10.js">