📄 dhtmlxtree.js
字号:
/*
Copyright Scand LLC http://www.scbr.com
To use this component please contact info@scbr.com to obtain license
*/
/*_TOPICS_
@0:Initialization
@1:Selection control
@2:Add/delete
@3:Private
@4:Node/level control
@5:Checkboxes/user data manipulation
@6:Appearence control
@7:Event Handlers
*/
/**
* @desc: tree constructor
* @param: htmlObject - parent html object or id of parent html object
* @param: width - tree width
* @param: height - tree height
* @param: rootId - id of virtual root node
* @type: public
* @topic: 0
*/
function dhtmlXTreeObject(htmlObject, width, height, rootId){
if (_isIE) try { document.execCommand("BackgroundImageCache", false, true); } catch (e){}
if (typeof(htmlObject)!="object")
this.parentObject=document.getElementById(htmlObject);
else
this.parentObject=htmlObject;
this._itim_dg=true;
this.dlmtr=",";
this.dropLower=false;
this.xmlstate=0;
this.mytype="tree";
this.smcheck=true; //smart checkboxes
this.width=width;
this.height=height;
this.rootId=rootId;
this.childCalc=null;
this.def_img_x="18px";
this.def_img_y="18px";
this._dragged=new Array();
this._selected=new Array();
this.style_pointer="pointer";
if (navigator.appName == 'Microsoft Internet Explorer') this.style_pointer="hand";
this._aimgs=true;
this.htmlcA=" [";
this.htmlcB="]";
this.lWin=window;
this.cMenu=0;
this.mlitems=0;
this.dadmode=0;
this.slowParse=false;
this.autoScroll=true;
this.hfMode=0;
this.nodeCut=new Array();
this.XMLsource=0;
this.XMLloadingWarning=0;
this._globalIdStorage=new Array();
this.globalNodeStorage=new Array();
this._globalIdStorageSize=0;
this.treeLinesOn=true;
this.checkFuncHandler=0;
this._spnFH=0;
this.dblclickFuncHandler=0;
this.tscheck=false;
this.timgen=true;
this.dpcpy=false;
this._ld_id=null;
this.imPath="treeGfx/";
this.checkArray=new Array("iconUnCheckAll.gif","iconCheckAll.gif","iconCheckGray.gif","iconUncheckDis.gif","iconCheckDis.gif","iconCheckDis.gif");
this.radioArray=new Array("radio_off.gif","radio_on.gif","radio_on.gif","radio_off.gif","radio_on.gif","radio_on.gif");
this.lineArray=new Array("line2.gif","line3.gif","line4.gif","blank.gif","blank.gif","line1.gif");
this.minusArray=new Array("minus2.gif","minus3.gif","minus4.gif","minus.gif","minus5.gif");
this.plusArray=new Array("plus2.gif","plus3.gif","plus4.gif","plus.gif","plus5.gif");
this.imageArray=new Array("leaf.gif","folderOpen.gif","folderClosed.gif");
this.cutImg= new Array(0,0,0);
this.cutImage="but_cut.gif";
this.dragger= new dhtmlDragAndDropObject();
//create root
this.htmlNode=new dhtmlXTreeItemObject(this.rootId,"",0,this);
this.htmlNode.htmlNode.childNodes[0].childNodes[0].style.display="none";
this.htmlNode.htmlNode.childNodes[0].childNodes[0].childNodes[0].className="hiddenRow";
//init tree structures
this.allTree=this._createSelf();
this.allTree.appendChild(this.htmlNode.htmlNode);
if(_isFF) this.allTree.childNodes[0].width="100%";
this.allTree.onselectstart=new Function("return false;");
this.XMLLoader=new dtmlXMLLoaderObject(this._parseXMLTree,this,true,this.no_cashe);
if (_isIE) this.preventIECashing(true);
var self=this;
if (window.addEventListener) window.addEventListener("unload",function(){try{ self.destructor(); } catch(e){}},false);
if (window.attachEvent) window.attachEvent("onunload",function(){ try{ self.destructor(); } catch(e){}});
return this;
};
dhtmlXTreeObject.prototype.destructor=function(){
for (var i=0; i<this._globalIdStorageSize; i++){
var z=this.globalNodeStorage[i];
z.parentObject=null;z.treeNod=null;z.childNodes=null;z.span=null;z.tr.nodem=null;z.tr=null;z.htmlNode.objBelong=null;z.htmlNode=null;
this.globalNodeStorage[i]=null;
}
this.allTree.innerHTML="";
this.XMLLoader.destructor();
for(var a in this){
this[a]=null;
}
}
function cObject(){
return this;
}
cObject.prototype= new Object;
cObject.prototype.clone = function () {
function _dummy(){};
_dummy.prototype=this;
return new _dummy();
}
/**
* @desc: tree node constructor
* @param: itemId - node id
* @param: itemText - node label
* @param: parentObject - parent item object
* @param: treeObject - tree object
* @param: actionHandler - onclick event handler(optional)
* @param: mode - do not show images
* @type: private
* @topic: 0
*/
function dhtmlXTreeItemObject(itemId,itemText,parentObject,treeObject,actionHandler,mode){
this.htmlNode="";
this.acolor="";
this.scolor="";
this.tr=0;
this.childsCount=0;
this.tempDOMM=0;
this.tempDOMU=0;
this.dragSpan=0;
this.dragMove=0;
this.span=0;
this.closeble=1;
this.childNodes=new Array();
this.userData=new cObject();
this.checkstate=0;
this.treeNod=treeObject;
this.label=itemText;
this.parentObject=parentObject;
this.actionHandler=actionHandler;
this.images=new Array(treeObject.imageArray[0],treeObject.imageArray[1],treeObject.imageArray[2]);
this.id=treeObject._globalIdStorageAdd(itemId,this);
if (this.treeNod.checkBoxOff ) this.htmlNode=this.treeNod._createItem(1,this,mode);
else this.htmlNode=this.treeNod._createItem(0,this,mode);
this.htmlNode.objBelong=this;
return this;
};
/**
* @desc: register node
* @type: private
* @param: itemId - node id
* @param: itemObject - node object
* @topic: 3
*/
dhtmlXTreeObject.prototype._globalIdStorageAdd=function(itemId,itemObject){
if (this._globalIdStorageFind(itemId,1,1)) { d=new Date(); itemId=d.valueOf()+"_"+itemId; return this._globalIdStorageAdd(itemId,itemObject); }
this._globalIdStorage[this._globalIdStorageSize]=itemId;
this.globalNodeStorage[this._globalIdStorageSize]=itemObject;
this._globalIdStorageSize++;
return itemId;
};
/**
* @desc: unregister node
* @type: private
* @param: itemId - node id
* @topic: 3
*/
dhtmlXTreeObject.prototype._globalIdStorageSub=function(itemId){
for (var i=0; i<this._globalIdStorageSize; i++)
if (this._globalIdStorage[i]==itemId)
{
this._globalIdStorage[i]=this._globalIdStorage[this._globalIdStorageSize-1];
this.globalNodeStorage[i]=this.globalNodeStorage[this._globalIdStorageSize-1];
this._globalIdStorageSize--;
this._globalIdStorage[this._globalIdStorageSize]=0;
this.globalNodeStorage[this._globalIdStorageSize]=0;
}
};
/**
* @desc: return node object
* @param: itemId - node id
* @type: private
* @topic: 3
*/
dhtmlXTreeObject.prototype._globalIdStorageFind=function(itemId,skipXMLSearch,skipParsing,isreparse){
// if (confirm(itemId)) { window.asdasd.asdasd(); }
for (var i=0; i<this._globalIdStorageSize; i++)
if (this._globalIdStorage[i]==itemId)
{
return this.globalNodeStorage[i];
}
return null;
};
/**
* @desc: escape string
* @param: itemId - item ID
* @type: private
* @topic: 3
*/
dhtmlXTreeObject.prototype._escape=function(str){
switch(this.utfesc){
case "none":
return str;
break;
case "utf8":
return encodeURI(str);
break;
default:
return escape(str);
break;
}
}
/**
* @desc: create and return new line in tree
* @type: private
* @param: htmlObject - parent Node object
* @param: node - item object
* @topic: 2
*/
dhtmlXTreeObject.prototype._drawNewTr=function(htmlObject,node)
{
var tr =document.createElement('tr');
var td1=document.createElement('td');
var td2=document.createElement('td');
td1.appendChild(document.createTextNode(" "));
td2.colSpan=3;
td2.appendChild(htmlObject);
tr.appendChild(td1); tr.appendChild(td2);
return tr;
};
/**
* @desc: load tree from xml string
* @type: public
* @param: xmlString - XML string
* @param: afterCall - function which will be called after xml loading
* @topic: 0
*/
dhtmlXTreeObject.prototype.loadXMLString=function(xmlString,afterCall){
var that=this;
if ((this.onXLS)&&(!this.parsCount)) that.onXLS(that,null);
this.xmlstate=1;
if (afterCall) this.XMLLoader.waitCall=afterCall;
this.XMLLoader.loadXMLString(xmlString); };
/**
* @desc: load tree from xml file
* @type: public
* @param: file - link to XML file
* @param: afterCall - function which will be called after xml loading
* @topic: 0
*/
dhtmlXTreeObject.prototype.loadXML=function(file,afterCall){
var that=this;
if ((this.onXLS)&&(!this.parsCount)) that.onXLS(that,this._ld_id);
this._ld_id=null;
this.xmlstate=1;
this.XMLLoader=new dtmlXMLLoaderObject(this._parseXMLTree,this,true,this.no_cashe);
if (afterCall) this.XMLLoader.waitCall=afterCall;
this.XMLLoader.loadXML(file); };
/**
* @desc: create new child node
* @type: private
* @param: parentObject - parent node object
* @param: itemId - new node id
* @param: itemText - new node text
* @param: itemActionHandler - function fired on node select event
* @param: image1 - image for node without childrens;
* @param: image2 - image for closed node;
* @param: image3 - image for opened node
* @param: optionStr - string of otions
* @param: childs - node childs flag (for dynamical trees) (optional)
* @param: beforeNode - node, after which new node will be inserted (optional)
* @topic: 2
*/
dhtmlXTreeObject.prototype._attachChildNode=function(parentObject,itemId,itemText,itemActionHandler,image1,image2,image3,optionStr,childs,beforeNode,afterNode){
if (beforeNode) parentObject=beforeNode.parentObject;
if (((parentObject.XMLload==0)&&(this.XMLsource))&&(!this.XMLloadingWarning))
{
parentObject.XMLload=1;
this._loadDynXML(parentObject.id);
}
var Count=parentObject.childsCount;
var Nodes=parentObject.childNodes;
if (afterNode){
if (afterNode.tr.previousSibling.previousSibling){
beforeNode=afterNode.tr.previousSibling.nodem;
}
else
optionStr=optionStr.replace("TOP","")+",TOP";
}
if (beforeNode)
{
var ik,jk;
for (ik=0; ik<Count; ik++)
if (Nodes[ik]==beforeNode)
{
for (jk=Count; jk!=ik; jk--)
Nodes[1+jk]=Nodes[jk];
break;
}
ik++;
Count=ik;
}
if ((!itemActionHandler)&&(this.aFunc)) itemActionHandler=this.aFunc;
if (optionStr) {
var tempStr=optionStr.split(",");
for (var i=0; i<tempStr.length; i++)
{
switch(tempStr[i])
{
case "TOP": if (parentObject.childsCount>0) { beforeNode=new Object; beforeNode.tr=parentObject.childNodes[0].tr.previousSibling; }
parentObject._has_top=true;
for (ik=Count; ik>0; ik--)
Nodes[ik]=Nodes[ik-1];
Count=0;
break;
}
};
};
Nodes[Count]=new dhtmlXTreeItemObject(itemId,itemText,parentObject,this,itemActionHandler,1);
itemId = Nodes[Count].id;
if(image1) Nodes[Count].images[0]=image1;
if(image2) Nodes[Count].images[1]=image2;
if(image3) Nodes[Count].images[2]=image3;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -