JS相关

练手demo之使用js遍历一棵树

2016-04-28  本文已影响1451人  escawn

实现截图


实现过程

<br />

HTML部分

这一部分主要涉及DOM模型,实现树的构造。childNode后的标号代表层级。

<div class="parentNode">
    <div class="childNode1">
      <div class="childNode2">
        <div class="childNode3"></div>
        <div class="childNode3"></div>
      </div>
      <div class="childNode2">
        <div class="childNode3"></div>
        <div class="childNode3"></div>
      </div>
    </div>
    <div class="childNode1">
      <div class="childNode2">
        <div class="childNode3"></div>
        <div class="childNode3"></div>
      </div>
      <div class="childNode2">
        <div class="childNode3"></div>
        <div class="childNode3"></div>
      </div>
    </div>
  </div>

<br />

CSS部分

使用了flex布局,使得下一级的div能够均匀地被包括在上一级的div内

.parentNode{
  display: flex;
  justify-content: space-around;
  align-items: center;
  width: 800px;
  height: 400px;
  border: 1px solid #000;
  margin: 20px auto;
}

<br />

JS部分
var preOrder = function(node){
    if (node !== null) {
    visitedList.push(node);
    preOrder(node.firstElementChild);
    preOrder(node.lastElementChild);
    }
}

//中序遍历
var inOrder = function(node){
   if (node !== null) {
   inOrder(node.firstElementChild);
   visitedList.push(node);
   inOrder(node.lastElementChild);
   }
}

//后序遍历
var postOrder = function(node){
   if (node !== null) {
   postOrder(node.firstElementChild);
   postOrder(node.lastElementChild);
   visitedList.push(node);
   }
}

<br />

//渲染函数,呈现视觉效果用
var render = function(){
  var int = setInterval(function(){
    clear();
    var currentNode;
    currentNode = visitedList.shift();
    if (currentNode !== undefined) {
      currentNode.style.backgroundColor = "red";

    }
    else {
      window.clearInterval(int);
    }
  },500);

}

<br />

//清空函数
var clear = function(){
  var div = document.getElementsByTagName("div");
  for(var index = 0;index < div.length;index++){
    div[index].style.backgroundColor = "#fff";
  }
}

<br />

var btn = document.getElementsByClassName('button')[0];
  btn.addEventListener("click",function(e){
    if (e.target&&e.target.className == "VLR") {
      visitedList = [];
      preOrder(parent);
      render();
    }
    if (e.target&&e.target.className == "LVR") {
      visitedList = [];
      inOrder(parent);
      render();
    }
    if (e.target&&e.target.className == "LRV") {
      visitedList = [];
      postOrder(parent);
      render();
    }
  },false);

<br />


总结

这个demo不论从逻辑还是实现上来说都比较简单。但我还是在涉及到DOM操作时,关于node的概念上出现了问题,基础还是要多补补。
<br />


demo地址

https://github.com/escawn/dailyDemo/tree/master/jsTreeVisit
<br />
<br />

上一篇下一篇

猜你喜欢

热点阅读