⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sys_tree.js

📁 点餐系统 非常好的 jsp mysql 我也是别人那里下载来的
💻 JS
字号:
//***************************************************************************************
//	7WX API set 1.0 for Action Orient Programming (Leebai 200212) 
//  Copyright 2002 DEEPSOFT Corp.  libq@deepsoft.com.cn
//	本程序可以在任何自由软件或商业软件中使用,但在源代码中必须保留上面的版权说明,否则视为侵权。
//***************************************************************************************

//			7WX Public Function
//============================================
//=======3.树api==============================

//==============================================================
var imgPath = systemPath.path+"/js/treeimg/";
//init function
//Only expandCallback,defRootIcon,defNodeIcon may be null.
function XinitTree(xtree,array,rootID,callback,expandCallback,expandLevel,selectable,defRootIcon,defNodeIcon,selectedIds){
	//para checking......
	xtree.rootID = rootID+"";
	xtree.callback = callback;
	xtree.expandCallback = expandCallback;
	xtree.expandLevel = expandLevel;
	xtree.selectable = selectable;
	xtree.defRootIcon = defRootIcon==null?(imgPath+"root.gif"):defRootIcon;
	xtree.defNodeIcon = defNodeIcon==null?(imgPath+"node.gif"):defNodeIcon;
	
	xtree.nodeMap = new Array();
	xtree.selectedNodes = new Array();
	xtree.currentNode=null;
	
	//public method
	xtree.addNode=XaddNode;
	xtree.addNodes=XaddNodes;
	xtree.nodeToSubTree=XnodeToSubTree;
	xtree.delNode=XdelNode;
	xtree.refreshNode=XrefreshNode;
	xtree.renameNode=XrenameNode;
	xtree.updateNode=XupdateNode;
//	xtree.delSelectedNodes=XdelSelectedNodes;
	xtree.getSelectedNodes=XgetSelectedNodes;
	xtree.getSubNodeIDs=XgetSubNodeIDs;
	xtree.getSubNodeIDsAuto=XgetSubNodeIDsAuto;

	xtree.setCurrentNode=XsetCurrentNode;
	xtree.cancelCurrentNode=XcancelCurrentNode;// for avoid ie4 bug

	xtree.getNodeByID=XgetNodeByID;
	
	//private method
	xtree._parseArray=_XparseArray;
	xtree._drowTree=_XdrowTree;
	xtree._drawNode=_XdrawNode;
	xtree._drawSubs=_XdrawSubs;
	xtree._expandClick=_XexpandClick;
	xtree._isSubNode=_XisSubNode;//for jump focus when:collapse father when current focus at sub
	xtree._nodeClick=_XnodeClick;
	xtree._saveNodeSelectInfo=_XsaveNodeSelectInfo;
	xtree._initSelectedIds=_XinitSelectedIds;

	//display tree
	xtree.style.paddingTop=3;
	xtree.style.paddingLeft=3;
	xtree.style.textAlign="left";
	xtree.style.verticalAlign ="top";
//	var tt1,tt0=new Date();	tt0=tt0.getTime();
	if(xtree._parseArray(array)){
		if(typeof(selectedIds)!='undefined' && selectedIds!=null)
			xtree._initSelectedIds(selectedIds);
//		tt1=new Date();	tt1=tt1.getTime();
		xtree._drowTree();
	}
//	var tt2=new Date();	tt2=tt2.getTime();
//	alert("use Time(ms):" + (tt1-tt0) + "-" + (tt2-tt1));// + "-" + (tt3-tt2));
}

//==============================================================
//public method implement
function XaddNode(array,fid,img){//add sub node to current node
	var arrays = new Array();
	arrays[0] = array;
	this.addNodes(arrays,fid,img);
}
function XaddNodes(array,fid,img){//add sub nodes to current node
	if(array.length<=0)return;
	if(typeof(fid)=="undefined"||fid==null){
		if(this.currentNode==null){alert("请选择要插入子节点的父节点。");return;}
		fid = this.currentNode[1];
	}
	var fNode = eval("xn"+fid);
	var fNodeData=this.nodeMap["x"+fid];
	var fNodeDiv = eval("xd"+fid);
	
	if(fNodeData["subs"].length>0)
		fNodeData["subs"][fNodeData["subs"].length-1]["isBottom"]=false;
	for(var i=0;i<array.length;i++){
		var tmpNodeData = new Array();
		tmpNodeData[0] = fid;
		for(var j=0;j<array[i].length;j++)
			tmpNodeData[j+1]=array[i][j];
		if(typeof(img)!="undefined" && img!=null)
			tmpNodeData[3]=img;
		tmpNodeData["expand"]=false;
		tmpNodeData["subs"]=new Array();
		tmpNodeData["isBottom"] = (i==array.length-1);
		fNodeData["subs"][fNodeData["subs"].length] = tmpNodeData;
		this.nodeMap["x"+tmpNodeData[1]] = tmpNodeData;
	}
	fNodeData["expand"]=true;
	fNodeDiv.outerHTML="";
//	document.body.style.cursor="wait";	
	fNode.outerHTML = this._drawNode(fNodeData);
//	document.body.style.cursor="default";	
	this.setCurrentNode(fNodeData[1]);
}

function XnodeToSubTree(node,subsArray){//add decendence subs data to node(XaddNodes算法改为同此?)
	if(subsArray.length==0) return;
	this._parseArray(subsArray);
	if(node["subs"].length!=0)node["subs"][node["subs"].length-1]["isBottom"]=false;
	for(var i=0; i<subsArray.length; i++)
		if(subsArray[i][0]==node[1])
			node["subs"][node["subs"].length] = subsArray[i];
	if(node["subs"].length!=0)node["subs"][node["subs"].length-1]["isBottom"]=true;
	this.refreshNode(node[1]);
}

function XrefreshNode(nodeID){//redraw specify node
	var isCurrent = false;
	if(typeof(nodeID)=="undefined"||nodeID==null){
		if(this.currentNode==null){alert("请选择或指定要删除的节点。");return;}
		nodeID=this.currentNode[1];isCurrent = true;
	}else
		if(this.currentNode!=null&&this.currentNode[1]==nodeID)isCurrent = true;

//	document.body.style.cursor="wait";	
	eval("xn"+nodeID).outerHTML =this._drawNode(this.nodeMap["x"+nodeID],true);
//	document.body.style.cursor="default";	
	if(isCurrent){this.setCurrentNode(nodeID)};
}

function XrenameNode(nodeID,newName){//rename specify node
	var node = this.nodeMap["x"+nodeID];
	if(typeof(node)=="undefined")alert("找不到要改名的节点。id为"+nodeID);
	node[2] = newName;
	//平仔添加,修改无法将树名子改过来问题
	//var temp = eval("xn"+nodeID);
	//temp.all(temp.all.length-1).innerText = newName;
}
//平仔添加,修改树的数据
function XupdateNode(nodeID,index,value){//update specify node
	var node = this.nodeMap["x"+nodeID];
	if(typeof(node)=="undefined")alert("找不到要改数据的节点。id为"+nodeID);
	node[index] = value;
}

function XdelNode(nodeID){//delete specify node
	var isCurrent = false;
	if(typeof(nodeID)=="undefined"||nodeID==null){
		if(this.currentNode==null){alert("请选择或指定要删除的节点。");return;}
		nodeID=this.currentNode[1];isCurrent = true;
	}else
		if(this.currentNode!=null&&this.currentNode[1]==nodeID)isCurrent = true;
	if(nodeID==this.rootID)return;

	var fNodeData = this.nodeMap["x"+this.nodeMap["x"+nodeID][0]];
	var fNode = eval("xn"+fNodeData[1]);
	var fNodeDiv = eval("xd"+fNodeData[1]);
	var oldSub = fNodeData["subs"];
	var newSub = new Array();
	for(var i=0;i<oldSub.length;i++)
		if(oldSub[i][1]!=nodeID)newSub[newSub.length]=oldSub[i];
		else if(i==oldSub.length-1)if(i>0)newSub[i-1]["isBottom"]=true;
	fNodeData["subs"] = newSub;

	fNodeDiv.outerHTML="";
//	document.body.style.cursor="wait";	
	fNode.outerHTML =this._drawNode(fNodeData);
//	document.body.style.cursor="default";	
	if(isCurrent){this.setCurrentNode(fNodeData[1])};
}
function XdelSelectedNodes(){//delete selected node
	var ids = this.getSelectedNodes();
	for(var i=0;i<ids.length;i++)
		this.delNode(ids[i]);
}
function XgetSelectedNodes(){//get selected node
	var ids = new Array();
	for(var i=0;i<this.selectedNodes.length;i++)
		if(this.selectedNodes[i][1]==true)
			ids[ids.length]=this.selectedNodes[i][0];
	return ids;	
}

function XsetCurrentNode(id){
	if(this.currentNode!=null){
		var span0=document.all["xn"+this.currentNode[1]];
		if(typeof(span0)!="undefined"){
			span0 = span0.children(span0.children.length-1);
			span0.style.backgroundColor=this.style.backgroundColor;
			span0.style.color=this.style.color;
		}
	}
	span=eval("xn"+id);
	span = span.children(span.children.length-1);
	span.style.backgroundColor=this.style.color;
	span.style.color=this.style.backgroundColor;

	this.currentNode = this.nodeMap["x"+id];
}
function XcancelCurrentNode(){ //for avoid ie4 bug when expand
	if(this.currentNode!=null){
		var span0=document.all["xn"+this.currentNode[1]];
		if(typeof(span0)!="undefined"){
			span0 = span0.children(span0.children.length-1);
			span0.style.backgroundColor=this.style.backgroundColor;
			span0.style.color=this.style.color;
		}
		this.currentNode=null;
	}
}

function XgetSubNodeIDs(node){
	var snIDs=",'"+node[1]+"'";
	for(var i=0;i<node["subs"].length;i++)
		snIDs += this.getSubNodeIDs(node["subs"][i]);
	
	return snIDs;
}

function XgetSubNodeIDsAuto(node){
	var ids= node['expand'] ? this.getSubNodeIDs(node).substring(1) : ("'"+node[1]+"'");
//	alert("selected:\n\n"+ ids);
	return ids;
}

function XgetNodeByID(nodeId){
	return this.nodeMap["x"+nodeId];
}

//==============================================================
//private method implement

function _XinitSelectedIds(selectedIds){//Init selected nodes
	for(var i=0;i<selectedIds.length;i++)
		this._saveNodeSelectInfo(selectedIds[i],true)
}
function _XparseArray(array){
	var subs = new Array();	
	for(var i=0;i<array.length;i++){
		if(array[i][0]==array[i][1])
			if(array[i][0]==this.rootID){array[i][0]="_x_";continue;}
			else{alert("第"+i+"条数据不符合要求:非根节点的父节点不能是是其自身。");return false;}
		var tfid = "s"+array[i][0];
		if(typeof(subs[tfid])=="undefined")subs[tfid]=new Array();
		subs[tfid][subs[tfid].length]=array[i];
	}
	for(var i=0; i<array.length;i++){
		this.nodeMap["x"+array[i][1]] = array[i];//*
		array[i]["subs"] = new Array();
		if(typeof(subs["s"+array[i][1]])!="undefined"){
			array[i]["subs"] = subs["s"+array[i][1]];//*
			for(var j=0;j<array[i]["subs"].length;j++)
				array[i]["subs"][j]["isBottom"] = (j == (array[i]["subs"].length-1));//*
		}
	}
	return true;
}
function _XdrowTree(){
	var rootData = this.nodeMap["x"+this.rootID];
	if(typeof(rootData)=="undefined"||rootData==null){
		alert("树节点数组数据错误,找不到指定的根节点:"+this.rootID);
		return;
	}
	rootData["level"]=0;
	rootData["tcode"]="x";
	rootData["expand"]=true;
	var htm = this._drawNode(rootData);
	this.expandLevel = -1;//*expandLevel only affect tree initial
	this.innerHTML = htm;
}

function _XdrawNode(nodeData,update){
	var tabCode = nodeData["tcode"];
	var htm = "\n<div nowrap id='xn"+nodeData[1]+"' style='height:18px'>";
	if(tabCode != "x"){
		//1.tab line
		htm += tabCode;
		//2.expand&collapse
		var mORb = nodeData["isBottom"] ? 'b' : 'm';
		var hasSubs = nodeData["subs"].length>0 ? '1' : '0';
		var eORc = hasSubs=='0' ? '' : (nodeData["expand"] ? '0' : '1');
		htm += "<img align=absmiddle src='" + imgPath + mORb + hasSubs + eORc + '.gif' + "' "; 
		if(hasSubs=="1")htm += "onclick=\""+this.id+"._expandClick(this,'"+nodeData[1]+"');\"";
		htm += ">";
	}
	//3.icon
	htm += _XimageTag((typeof(nodeData[3])=="undefined" || nodeData[3].length==0) ? 
		(tabCode == "x" ? this.defRootIcon : this.defNodeIcon) : (nodeData[3]=="-"?"":nodeData[3]) );//'-' for no icon
	//4.selecting
	if(this.selectable) htm += "<input align=absmiddle type=checkbox "+ (nodeData["selected"]?"checked":"")
		+" onclick=\""+	this.id+"._saveNodeSelectInfo('"+nodeData[1]+"',this.checked);"+"\" style='height:18px'>";
	//5.title
	htm += "<span style='cursor:hand;padding:2px;height;18px;font-weight:"+(nodeData["level"]<2?'bold':'normal')+"' onclick=\""+this.id+"._nodeClick('" +nodeData[1]+"');\" ondblclick=\""+this.id+"._expandClick(this,'"+nodeData[1]+"');\" title='"+nodeData[2]+"'><span style='position:relative;top:2px'>" + nodeData[2] + "</span></span></div>";
	
	if(typeof(update)=="undefined"||update!=true){
		//6.sub div
		var hasSub = nodeData["subs"].length>0;
		htm += "\n<div id='xd"+nodeData[1]+"' style='display:"+((nodeData["expand"]&&hasSub)?"":"none")+";'>";
		if(nodeData["expand"]&&hasSub){//drawONexpand
			tabCode = tabCode=="x" ? "" : (tabCode + (mORb=="m" ? _XimageTag(imgPath + 'iii.gif') : _XimageTag(imgPath + 'ooo.gif')));
			htm += this._drawSubs(nodeData,tabCode);
		}
		htm += "</div>";
	}
	return htm;
}
function _XdrawSubs(nodeData,tabCode){
	var htm = "";
	for(var i=0;i<nodeData["subs"].length;i++){
		var nd = nodeData["subs"][i];
		nd["level"]=nodeData["level"]+1;
		nd["tcode"] = tabCode;
		if(this.expandLevel!=-1) nd["expand"]=nd["level"]<this.expandLevel;
		htm += this._drawNode(nd);
	}
	return htm;
}
function _XisSubNode(nodeF,nodeS){//for _XexpandClick
	if(nodeF==null || nodeS ==null)
		return false;
	var node = this.nodeMap["x"+nodeS[0]];
	while(node!=null && node[1]!=nodeF[1]){
		node = this.nodeMap["x"+node[0]];
	}
	return (node!=null && node[1]==nodeF[1]);
}
function _XexpandClick(img,id){
	if(img.tagName!="IMG"){//when double click node title
		var brothers = img.parentElement.children;
		for(var i=0; i<brothers.length; i++)
			if(brothers[i].tagName=="IMG" && brothers[i].onclick!=null)
				break;
		if(i==brothers.length)return;//root node
		img = brothers[i];
	}

//	var tt0=new Date();	tt0=tt0.getTime();
	var nodeData = this.nodeMap["x"+id];
	var nodeDiv=eval("xd"+nodeData[1]);
	nodeData["expand"]=!nodeData["expand"];
//	var tt1=new Date();	tt1=tt1.getTime();

	var curNodeInSubs = this._isSubNode(nodeData,this.currentNode);
		
	if(curNodeInSubs)this.cancelCurrentNode();
	if(nodeDiv.innerHTML.length>0){
		nodeDiv.style.display=(nodeDiv.style.display=='none') ? '' : 'none';
		img.src=img.src.indexOf('0.gif')>0 ? img.src.replace('0.gif','1.gif') : img.src.replace('1.gif','0.gif');
	}else{
		nodeDiv.outerHTML="";
		eval("xn"+nodeData[1]).outerHTML =this._drawNode(nodeData);
	}
	if(curNodeInSubs)this._nodeClick(nodeData[1]);
//	var tt2=new Date();	tt2=tt2.getTime();
//	alert("use Time(ms):" + (tt1-tt0) + "-" + (tt2-tt1));// + "-" + (tt3-tt2));

	if(this.expandCallback!=null) this.expandCallback(nodeData);
}
function _XnodeClick(id){
	this.setCurrentNode(id);
	var nodeData = this.nodeMap["x"+id];
	this.callback(nodeData);
}

function _XsaveNodeSelectInfo(nodeID,onoff){
	var node = this.nodeMap["x"+nodeID];
	if(typeof(node)=='undefined'){
		alert("要对节点id为"+nodeID+"的节点设置选择状态时,发现该节点并不存在。");
		return;
	}
	
	node["selected"] = onoff;
	for(var i=0;i<this.selectedNodes.length;i++){
		if(this.selectedNodes[i][0]==nodeID){
			this.selectedNodes[i][1]=onoff;
			return;
		}
	}
	if(onoff==true)
		this.selectedNodes[this.selectedNodes.length]=[nodeID,true];

}
//==============================================================
//other function
function _XimageTag(img){ return img.length>0 ? "<img align=absmiddle src='" + img + "'>" : "";}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -