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

📄 nodenormal.js

📁 html树型结构 html树型结构
💻 JS
字号:
(function() {
  if (!window.xyTree)
    window.xyTree = {};
})();

//xieye注:这个方法必须按照顺序加节点!!
//============================================
xyTree.NodeNormal = function(name) {
  this.name = name ;        //节点在树上的显示
  this.id;
    
  this.parent;       //节点的父节点
  this.previous;     //节点的前一个节点
  this.next;         //节点的下一个节点
  this.child = [];   //节点的子节点
  
  this.level = 0;	   //节点的级别,根节点为0
  this.tree;         //从节点获得树对象
  this.xuhao = 0;    //节点在树中的序号,根节点为0;
  this.displaychild = false; //子节点正在显示吗?
  this.zhankaiguo = false;  //表示历史记录,一旦变true,无法改变
  this.img;
}

//显示节点自身
xyTree.NodeNormal.prototype.toString = function() {
  var s = '[' + this.id + ']=[' + this.name + ']'
    + '[level=]' + this.level;
  return s;
};


/*
<div>
  <img src="images/Lplus.png"  align="absbottom"  />
  <img src="images/foldericon.png"  align="absbottom"  style="margin-left:-6px;"  />
  <a href="javascript:void(0);">玄武分局</a>
  <div><img/><img/><a/>某某派出所</div> 
</div>
*/
//xieye20070122:这里的逻辑是最复杂的。
xyTree.NodeNormal.prototype.innerhtml = function() {
  var div = document.createElement('div');
  var qj = this.tree.objectname; //得到全局对象的名称
  //var qjlength = qj.length;
  //alert(aaaa);
  //给节点的div添加id,=树名+序号;
  div.id = qj + this.xuhao; //做标记
  div.className = 'qiguai'; //做标记,奇怪
  var current = this;
  //alert(div.id);
  var oFragment = document.createDocumentFragment();
  
  //xieye:这里用for循环表示前面的空格或竖线
  //如:2级节点循环一次。3级节点,循环两次
  for (var i = this.level - 1; i > 0; i--) {
    //alert(this.level);
    var img = document.createElement('img');
    var qq = this.getparent(i);
    //alert(i+' = '+qq);
    img.src = this.getimgkongge(qq);
    //alert(img.src);
    img.align = "absbottom";
    oFragment.appendChild(img);
  }
  
  var img = document.createElement('img');
  img.src = this.getimgjiahao();
  img.align = "absbottom";
  
  img.onclick = function() { 
    //xieye:状态在全局变量节点中,
    //xieye:这里要判断,如果本节点无子节点
    var fu = this.parentNode;
    var childnodes = current.child;
  	
    if (childnodes.length == 0) {/*alert('无子节点');*/return;}
    var shimowei = current.next?false:true;
    if (!current.displaychild) { //如果节点的子节点未打开
      current.displaychild = true;
      //加变减,减变加,但要考虑是不是末节点
      this.src = current.getimgdianji(current.displaychild,shimowei);
      //alert(this.src);
      //现在已经知道序号,要求他的父节点添加子节点
      if (!current.img)
        this.nextSibling.src = xyTree.TreeConfigNormal.openFolderIcon;

      if (!current.zhankaiguo) {
        //这里新加行	
        //alert('新加行');
        current.zhankaiguo = true;
        //加变减,减变加,但要考虑是不是末节点
        var oFragmentChildDiv = document.createDocumentFragment();
        for (var i = 0; i < childnodes.length; i++)
          oFragmentChildDiv.appendChild(childnodes[i].innerhtml());
        fu.appendChild(oFragmentChildDiv);	
      } else {
        //这里不新加行	
        for (var i = fu.childNodes.length - 1; 
            fu.childNodes[i].className == 'qiguai' && i >= 0; i--)
          fu.childNodes[i].style.display = 'block';
      }

    } else {
      current.displaychild = false;
      this.src = current.getimgdianji(current.displaychild,shimowei);
      if (!current.img)
        this.nextSibling.src = xyTree.TreeConfigNormal.folderIcon;
      //while(fu.lastChild.className == 'qiguai')
      //fu.removeChild(fu.lastChild);
      //xieye:把这个节点下面所有的div设为隐藏显示
      for (var i = fu.childNodes.length - 1; 
          fu.childNodes[i].className == 'qiguai' && i >= 0; i--)
        fu.childNodes[i].style.display = 'none';
    }
  };
  oFragment.appendChild(img);
  
  img = document.createElement('img');
  img.id = qj + 'imgfold' + this.xuhao; //做标记2007/06/15

  img.src = this.getimgfold();
  if(this.img)
    img.className = 'treeyangshiImg';
  	  
  img.onclick = function() {
    this.previousSibling.onclick();	
  }
  
  img.align = "absbottom";
  oFragment.appendChild(img);
  
  var a = document.createElement('a');
  a.href = 'javascript:void(0)';
  //var xuhao = this.xuhao;
  a.onclick = function() {
    current.tree.divtree.clickNode(current);
  };
  a.onfocus = function() {this.blur();}

  a.appendChild(document.createTextNode(this.name));
  a.style.marginLeft = xyTree.TreeConfigNormal.jianju1;
  
  oFragment.appendChild(a);
  div.appendChild(oFragment);
  return div;
}

//通过全局节点得到文件夹img对象
xyTree.NodeNormal.prototype.getHtmlElementFoldImg = function() {
  var dd = this.tree.objectname + 'imgfold' + this.xuhao;
  return document.getElementById(dd); //这是获得行的div
}


//返回父节点(与下个方法连用)
xyTree.NodeNormal.prototype.getparent = function(int) {
  return this.getparentdigui(int,this);
}

//返回父节点(与上个方法连用)
xyTree.NodeNormal.prototype.getparentdigui = function(int,node) {
  var node = node.parent;
  int--;
  if (int == 0)
    return node;
  return this.getparentdigui(int,node);
}

//根据父节点返回竖线还是空格,是一行div中最前面的图片
xyTree.NodeNormal.prototype.getimgkongge = function(node) {
  //(1)父节点不是末尾
  //(2)父节点是末尾
  var s;
  if (node.next)   //(1)父节点不是末尾
    s = xyTree.TreeConfigNormal.iIcon;
  else                      //(2)父节点是末尾
    s = xyTree.TreeConfigNormal.blankIcon;
  return s;
}

//返回加号位置的图片,不过是点击后判断
xyTree.NodeNormal.prototype.getimgdianji = function(img1,mowei) {
  var s;
  if (mowei)                      //在末尾
    if (img1){                     //变为加
      s = xyTree.TreeConfigNormal.lMinusIcon;
    }
    else{                          //变为减    
      s = xyTree.TreeConfigNormal.lPlusIcon;  
    }
  else                            //不在末尾
    if (img1){                     //变为加
      s = xyTree.TreeConfigNormal.tMinusIcon;
    }
    else {                         //变为减    
      s = xyTree.TreeConfigNormal.tPlusIcon;
    }
  return s;
}


//返回文件夹图片
xyTree.NodeNormal.prototype.getimgfold = function() {
  //xieye:有3种,开文件夹,闭文件夹,一张纸
  if(this.img)
    return this.img;
  var s;
  if (this.child.length > 0) //有子节点
    if (this.displaychild)//子节点在显示
      s = xyTree.TreeConfigNormal.openFolderIcon;
    else                  //子节点不在显示 
      s = xyTree.TreeConfigNormal.folderIcon;
  else                       //无子节点
    s = xyTree.TreeConfigNormal.fileIcon;  
  return s;
}

//返回加号位置的图片
xyTree.NodeNormal.prototype.getimgjiahao = function() {
  //xieye:有4种,
  //(1)有子节点,不是末尾
  //(2)有子节点,是末尾
  //(3)无子节点,不是末尾
  //(4)无子节点,是末尾
  var s;
  if (this.child.length > 0){ //有子节点
    if(this.next)  //不是末尾
      s = xyTree.TreeConfigNormal.tPlusIcon;
    else           //是末尾   
      s = xyTree.TreeConfigNormal.lPlusIcon;
  }else{                      //无子节点
    if(this.next)  //不是末尾
      s = xyTree.TreeConfigNormal.tIcon;
    else           //是末尾   
      s = xyTree.TreeConfigNormal.lIcon;
    }
  return s;
}

//这是子节点的添加方法
xyTree.NodeNormal.prototype.add = function (node){
  //(1)设置自身的: child子节点,
  var chang = this.child.length;
  this.child[chang] = node;
  	
  //(2)要设置node的:parent,level,tree,不设置下一个节点,子节点
  node.parent = this;
  node.level = this.level + 1;
  node.tree = this.tree;
  	
  //(3)设置node的前一个节点的 :next,     node的previous,
  if(chang > 0){
    node.previous = this.child[chang - 1];
    node.previous.next = node;
  } 
  	
  //(4)设置树的treeArray[],     node的xuhao,
  chang =  node.tree.treeArray.length;
  node.tree.treeArray[chang] = node;
  node.xuhao = chang;
  	
  //(5)设置树的maxlevel;
  if(node.level > this.tree.maxlevel)
    this.tree.maxlevel = node.level;
};

	//这个节点的方法可以返回 所有子节点的个数,注:
xyTree.NodeNormal.prototype.getAllChildsNum = function (){
  var num = this.xuhao;
  var j = 0;
  var level = this.level;
  num++;
  while(num < this.tree.nodeArray.length){
    if (this.tree.treeArray[num++].level <= level)
      break;
    j++;
  }
  return j;
}
//这个方法显示树用,是被调用的方法
xyTree.NodeNormal.prototype.display = function (){
  for (var i = 0; i < this.level; i++)
    this.tree.tempString += ' ';
  this.tree.tempString += '[' + this.id + ']=[' + this.name + ']' + '\n';
  for (var i = 0; i < this.child.length; i++)
    this.child[i].display();
};


⌨️ 快捷键说明

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