JS自定义树的实现



/**
 * 

* 方法1:addRootNodes ->增加根节点 * 方法2:addChild->>增加子节点 * 说明:该脚本主要为了页面请求动态创建树节点。 * 该树依赖于 css/tree.css, images图片 * * @author IUPRG */ /** * 构造 * @param treeID:树容器的div ID */ var myTree=function(treeID){ this.id = treeID; if (treeID) this.id = treeID; this.outerClassName = "treeUl"; this.node = null; this.container = document.getElementById(this.id); this.container.innerHTML = ""; //clear innerHTML this.outer = document.createElement("ul"); this.outer.className = this.outerClassName; this.container.appendChild(this.outer); this.arrClassName = "foldArr"; this.idTag = treeID + "TnA"; //节点 a标签 id 前缀 this.treeNodeIDTag = treeID + "Tn"; //节点 Node id 前缀 this.curNode = function(){ };//当前节点 }; var termNode = function(){ this.Id = null; //节点id this.dataId = null;//数据id this.element = null;//li元素 this.title = "";//标题 this.hasChild = 0; //是否包含子节点, 0:否 1:是 }; /** * 调试输出 */ myTree.prototype.out=function(){ alert(this.container.innerHTML); }; /** * 清除容器innerHTML */ myTree.prototype.clear=function(){ this.outer.innerHTML=""; //alert(this.outer.id + "--innerHTML:"); }; myTree.prototype.ajaxGet =function(action,data,callback){ $.ajax({type:'get',url:action,data:data,dataType:'json',cache:false,async: false,error:function(data){},success:callback}); }; /** * 清除节点 内容,以便增加新节点 * 注意:此时只清除 UL ,li下的其他内容不可删除 * @param node */ myTree.prototype.clearNode=function(node){ var ul= this.getUl(node.element); if (ul) { ul.innerHTML=""; }else{ //移除li的子元素 if (node.hasChildNodes){ var childs = node.childNodes; for(var i = childs.length - 1; i >= 0; i--) { if (childs[i].nodeName.toUpperCase() =='LI'&&childs[i].nodeType==1) { node.removeChild(childs[i]); } } } }; }; /** * 为指定的节点增加 “箭头” * @param node */ myTree.prototype.addArrow=function(node){ var ul= this.getUl(node.element); if (ul==null||ul==undefined) { var _ul=document.createElement("ul"); //node.appendChild(ul); node.element.appendChild(_ul); var ii=node.element.firstChild.firstChild; if (ii) ii.className="foldArr"; } }; /** * 删除指定节点的"箭头" * @param node */ myTree.prototype.delArrow=function(node){ var ul= this.getUl(node.element); if (ul) { node.element.removeChild(ul); var ii=node.element.firstChild.firstChild; if (ii) ii.className=""; } }; /** * 建立一个树的节点 * @param id-节点的id,作为节点id的关键值 * @param title-节点的标题 * @param hasChild-是否包含子节点,0:不包含,当前节点属于叶子 1:包含 * @param methodName-节点触发的js方法名,比如 "open(10)" * @returns dom元素 */ myTree.prototype.createNode=function(id,title,hasChild,methodName){ var li = document.createElement("li"); var a = document.createElement("a"); var iclassName=""; a.href = "javascript:;"; if (methodName){ a.href = "javascript:" + methodName + ";"; } if (hasChild) { iclassName="class='"+this.arrClassName+"'"; } if (!title) title="未知的标题或被移动的节点"; a.title=title; a.innerHTML="" + title +""; //加入id if (id) { a.id= this.idTag + id; li.id = this.treeNodeIDTag + id; li.setAttribute("hasChild", (hasChild?1:0)); } li.appendChild(a); //如果包含子节点,则添加ul元素 if (hasChild) { var ul =document.createElement("ul"); li.appendChild(ul); } this.outer.appendChild(li); var node =new termNode(); node.element = li; node.title = title; node.dataId = id; node.Id = this.treeNodeIDTag + id; node.hasChild = (hasChild?1:0); return node; }; /** * 增加根节点,根节点允许被增加多个,返回dom元素 * @param id-节点的id,作为节点id的关键值 * @param title-节点的标题 * @param methodName-节点触发的js方法名,比如 "open(10)" * @returns dom元素 */ myTree.prototype.addRootNode=function(id,title,hasChild,methodName){ var node = this.createNode(id,title,hasChild,methodName); return node;//返回这个 节点 }; /** * 增加子节点,返回dom元素. * @param id-节点的id,作为节点id的关键值 * @param title-节点的标题 * @param hasChild-是否包含子节点,0:不包含,当前节点属于叶子 1:包含 * @param methodName-节点触发的js方法名,比如 "open(10)" * @returns dom元素 */ myTree.prototype.addChild=function(pNode,id,title,hasChild,methodName){ // var node = this.createNode(id,title,hasChild,methodName); //如果li下包含ul,则ul添加子节点 var ul = this.getUl(pNode.element); if (ul) { ul.appendChild(node.element); }else{//否则,就直接添加到li,作为叶子节点 pNode.element.appendChild(node.element); } //返回这个 子节点 return node; }; /** * 根据id返回树节点 * @param id * @returns */ myTree.prototype.getNode = function(id){ this.curNode.Id= id; this.curNode.dataId= id.substr(this.treeNodeIDTag.length);//去掉开头的标记; this.curNode.element = document.getElementById(this.curNode.Id); this.curNode.title = this.curNode.element.textContent; this.curNode.hasChild = this.curNode.element.getAttribute("hasChild"); return this.curNode; }; /** * 根据dataId返回树节点(比如,根据外部指定的数据id,直接返回树节点) * @param dataId * @param isRefresh 是否刷新当前节点,true:从服务器获取最新数据,刷新当前节点 false:不刷新,只从document加载 * @returns */ myTree.prototype.getNodeByDataId = function(dataId,isRefresh){ var _this=this; this.curNode.Id = this.treeNodeIDTag + dataId; this.curNode.dataId = dataId; this.curNode.element = document.getElementById(this.curNode.Id);//$("#"+this.curNode.Id).get(0); this.curNode.title = this.curNode.element.innerHTML; this.curNode.hasChild = this.curNode.element.getAttribute("hasChild"); if (isRefresh&&isRefresh==true){ this.ajaxGet(dolphin.term.action.refreshNodeAction,{termId:dataId},function(json){ if (json&&json.result){ if (json.result==1&&json.data){ $(_this.curNode.element).find("a").title =json.data.termName; $(_this.curNode.element).find("a i").innerHTML=json.data.termName; $(_this.curNode.element).find("a span").attr("title",json.data.termName); $(_this.curNode.element).find("a span").html(json.data.termName); _this.curNode.hasChild = json.data.hasChild; _this.curNode.title = json.data.termName; } } }); } return this.curNode; }; /** * 获取node节点里的ul元素 * @param node * @returns */ myTree.prototype.getUl = function(node){ if (node.hasChildNodes){ var childs = node.childNodes; for(var i = childs.length - 1; i >= 0; i--) { if (childs[i].nodeName.toUpperCase() =='UL'&&childs[i].nodeType==1) { return childs[i]; } } } return null; };


你可能感兴趣的:(JavaScript,其它)