我的JS TreeView树(一)

/**
 * @author: 熊水林(Email: xionglb@163.com
 * @lastModified  2004-8-30
 * @descript: TreeView   JS基础实现
 */
  folders = new Array;
  seqFolders = new Array;  //按层次顺序
  count = 0;   //node CountNum
 
  var imagePath = "";
  var barImg, spacerImg, rootImg;
  var teeImg, teePlusImg,teeMinusImg;
  var cornerImg, cornerPlusImg, cornerMinusImg;
  var folderImg, folderOpenImg, leafImg;

  frameTarget = "top.contentFrame.rightFrame";  //打开链接的窗口
  imgAlign = ' align="absMiddle"';  //图片文字对其方式
  preNodeCode = 0;

//---------------------------------------PUBLIC----------------------------------------------------
/**
 * 构造函数,新建一个树节点
 */
function Folder(nodecode,description,layer,parentId,hreference,isLeaf) {
   this.code = nodecode;
   this.desc=description;
   this.hrefer = hreference ;
   this.layer = layer;
   this.parentId = parentId;
   this.isLeaf = isLeaf;  
   this.isOpen = false;
}

/**
 * 增加一个节点
 */
function addFolder(folder){
   folders[count++] = folder;
   return folder;
}

//图片位置
function setImagePath(){
   barImg = imagePath+"images/menu_bar.gif";
   teeImg = imagePath+"images/menu_tee.gif";
   cornerImg = imagePath+"images/menu_corner.gif";
   spacerImg = imagePath+"images/menu_spacer.gif";
   rootImg = imagePath+"images/menu_root.gif";
   teePlusImg = imagePath+"images/menu_tee_plus.gif";
   teeMinusImg = imagePath+"images/menu_tee_minus.gif";
   cornerPlusImg = imagePath+"images/menu_corner_plus.gif";
   cornerMinusImg = imagePath+"images/menu_corner_minus.gif";
   folderImg = imagePath+"images/folder.gif";
   folderOpenImg = imagePath+"images/folder_open.gif";
   leafImg = imagePath+"images/file.gif";
}
//根节点
function drawRootNode(nodeName){
   var content = '<div><img id="fldImgRoot" align="absMiddle" src="'+rootImg+'">';
   content += nodeName+"</div>";
   document.write(content);
}
function drawTree(){
   var n = 0;
   var topFolders = getLayerFolders(getMinLayer());
   for (var i=0;i<topFolders.length;i++){
      seqFolders[n++] = topFolders[i];
      var grandSon = getGrandSon(topFolders[i]);
      for (var j=0;j<grandSon.length;j++){
         seqFolders[n++] = grandSon[j];
      }
   }

   for (var k=0; k<count; k++){
      drawFolder(seqFolders[k]);
   }
   for (i=0;i<topFolders.length;i++){
      document.getElementById("fld"+topFolders[i].code).style.display = "block";
   }
}

/**
 * 初始化打开一个节点
 */
function expandFolder(nodeCode){
   var folder = getFolderByCode(nodeCode);
   if (folder == null)   return;
   var grandFather = getGrandFather(folder);
   for (var i=0;i<grandFather.length;i++){
       showFolder(grandFather[i]);
   }
   showFolder(folder);
}
//-----------------------------------PROTECTED-----------------------------------------------------
/* 在子类实现
function drawFolder(folder){
}
*/
/**
 * 默认实现
 */
function clickNode(nodeCode){
   var folder = getFolderByCode(nodeCode);
   if (folder.isOpen){  //已经是打开状态
      hiddenFolder(folder);
   }else{
      showFolder(folder);
   }
   if (folder.hrefer!=null && folder.hrefer!='null' && folder.hrefer!=''){
      eval(frameTarget).location = folder.hrefer;
   }
   setColor(nodeCode);
   preNodeCode = nodeCode;
}
function selectNode(nodeCode){  //click the checkbox
   var folder = getFolderByCode(nodeCode);
   showFolder(folder);
   var obj = document.getElementById("fld_chkbox"+folder.code);
   var array = getGrandSon(folder);
   for (i=0;i<array.length;i++){
      document.getElementById("fld_chkbox"+array[i].code).checked = obj.checked;
   }
   var array1 = getGrandFather(folder);
   if (obj.checked){
      for (i=0;i<array1.length;i++){
         document.getElementById("fld_chkbox"+array1[i].code).checked = true;
      }
   }
}
function setColor(nodeCode){
   document.getElementById("text"+nodeCode).style.color = "red";
   if (document.all["text"+preNodeCode] && nodeCode!=preNodeCode){
      document.getElementById("text"+preNodeCode).style.color = "#221133";  //menuColor
   }
   preNodeCode = nodeCode;
}

//--------------------------------------PRIVATE----------------------------------------------------
function winStatus(msg){
   window.status = msg;
   return true;
}

function hiddenFolder(folder){
   folder.isOpen = false;
   var nodeCode = folder.code;
   if (isLeafNode(nodeCode)){
      return;
   }
   if (hasBrothers(folder)){
      document.getElementById("fldImg"+nodeCode).src = teePlusImg;
   }else{
      document.getElementById("fldImg"+nodeCode).src = cornerPlusImg;
   }
   if (document.getElementById("1_fldImg"+nodeCode)){
      document.getElementById("1_fldImg"+nodeCode).src = folderImg;
   }
   //change children
   var grandson = getDirectSon(nodeCode);
   for (var i=0; i<grandson.length; i++){
       document.getElementById("fld"+grandson[i].code).style.display = "none";
       grandson[i].isOpen = false;
       hiddenFolder(grandson[i]);
   }
}
function showFolder(folder){ 
   folder.isOpen = true;
   var nodeCode = folder.code;
   if (isLeafNode(nodeCode)){
      return;
   }
   if (hasBrothers(folder)){
      document.getElementById("fldImg"+nodeCode).src = teeMinusImg;
   }else{
      document.getElementById("fldImg"+nodeCode).src = cornerMinusImg;
   }
   if (document.getElementById("1_fldImg"+nodeCode)){
      document.getElementById("1_fldImg"+nodeCode).src = folderOpenImg;
   }
   //change children
   var grandson = getDirectSon(nodeCode);
   for (var i=0; i<grandson.length; i++){
       document.getElementById("fld"+grandson[i].code).style.display = "block";
       if (isLeafNode(grandson[i].code)){
          if (hasBrothers(grandson[i])){
             document.getElementById("fldImg"+grandson[i].code).src = teeImg;
          }else{
             document.getElementById("fldImg"+grandson[i].code).src = cornerImg;
          }
       }else{
          if (hasBrothers(grandson[i])){
             document.getElementById("fldImg"+grandson[i].code).src = teePlusImg;
          }else{
             document.getElementById("fldImg"+grandson[i].code).src = cornerPlusImg;
          }
       }
   }
}


//==============================================================================================//
function getLayerFolders(layer){
   var grade = new Array;
   var j=0;
   for (var i=0;i<count;i++){
      if (folders[i].layer == layer){
         grade[j++] = folders[i];
      }
   }
   return grade;
}
function getGrandSon(folder){
   var nodes = new Array;
   var maxlayer = getMaxLayer();
   var n = 0;
   for (var i=0;i<count;i++){
      if (folders[i].parentId == folder.code){
         nodes[n++] = folders[i];
         if (folder.layer < maxlayer-1){
            var sons = getGrandSon(folders[i]);
            for (var j=0;j<sons.length;j++){
               nodes[n++] = sons[j];
            }
         }
      }
   }
   return nodes;
}
function getDirectSon(nodeCode){
   var nodes = new Array;
   for (var i=0;i<count;i++){
       if (folders[i].parentId == nodeCode){
          nodes.push(folders[i]);
       }
   }
   return nodes;
}
function getGrandFather(folder){
   var nodes = new Array;
   var minLayer = getMinLayer();
   var n = 0;

   for (var i=0;i<count;i++){
      if (folders[i].code == folder.parentId){
         nodes[n++] = folders[i];
         if (folder.layer > minLayer+1){
            var fathers = getGrandFather(folders[i]);
            for (var j=0;j<fathers.length;j++){
               nodes[n++] = fathers[j];
            }
         }
      }
   }
   return nodes;
}
function getBrother(folder){
   var nodes = new Array;
   var n = 0;
   for (var i=0;i<count ;i++ ){
      if (folders[i].parentId==folder.parentId && folders[i].code!=folder.code){
         nodes[n++] = folders[i];
      }
   }
   return nodes;
}
function getFolderByCode(nodeCode){
   var obj = null;
   for (var i=0; i<count; i++){
       if (folders[i].code == nodeCode){
          return folders[i];
       }
   }
   return obj;
}

function getMaxLayer(){
  var maxlayer = 0;
  for (var i=0;i<count;i++){
     if (folders[i].layer > maxlayer){
        maxlayer = folders[i].layer;
     }
  }
  return maxlayer;
}
function getMinLayer(){
  var minLayer = 10;
  for (var i=0;i<count;i++){
     if (folders[i].layer < minLayer){
        minLayer = folders[i].layer;
     }
  }
  return minLayer;
}

function isLeafNode(nodeCode){
   for (var i=0;i<count;i++){
      if (folders[i].parentId == nodeCode){
         return false;
      }
   }
   return true;
}
function hasBrothers(folder){
   for (var i=0; i<count; i++ ){
       if (seqFolders[i].code == folder.code){
          for (var j=i+1; j<count; j++){
              if (seqFolders[j].parentId==folder.parentId){
                 return true;
              }
          }
      }
   }
   return false;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值