JS递归树形菜单

简介: JS递归树形菜单

啥叫递归

聊递归之前先看一下什么叫递归。

递归,就是在运行的过程中调用自己。

构成递归需具备的条件:

1. 子问题须与原始问题为同样的事,且更为简单;
2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。

递归语言例子

我们用2个故事来阐述一下什么叫递归。

1,从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?‘从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……’”

2,大雄在房里,用时光电视看着从前的情况。电视画面中的那个时候,他正在房里,用时光电视,看着从前的情况。电视画面中的电视画面的那个时候,他正在房里,用时光电视,看着从前的情况……

接下来看一下代码吧

 

<script>
      //json数据传输
      let data;
      let xhr = new XMLHttpRequest();
      xhr.open('get', 'js/树形菜单.json');
      xhr.send();
      xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && xhr.status == 200) {
          let text = xhr.responseText;
          data = JSON.parse(text);
          show(data);//调用传参
          // console.log(data);
        }
      }
      //获取元素
      let box = document.getElementsByClassName('box')[0];
      //设置一个变量为空
      let str = '';
      // 设置变量默认为真
      let statuss = true;
      function show(data) {
        //判断如果是真
        if (statuss) {
          //拼接ul
          str += '<ul>';
          //否则让ul隐藏
        } else {
          str += '<ul style="display:none">';
        }
        //循环数据
        for (let i = 0; i < data.length; i++) {
          //拼接type里的内容
          str += '<li>' + data[i].type + '</li>';
          //判断是不是元素的子元素
          if (data[i].children) {
            //是的话变量为false
            statuss = false;
            //自调用函数
            show(data[i].children);
            //否则拼接ul标签
          } else {
            str += '<ul></ul>';
          }
          // str += '</li>';
        }
        //闭合标签
        str += '</ul>';
        //输出到页面中
        box.innerHTML = str;
        // console.log(str);
        //返回str的值
        return str;
      }
      // let box = document.getElementById("box");
      box.addEventListener("click", function(e) {
        let targets = e.target;
        console.log(targets);
        if (targets.nodeName === "LI") {
          let nexts = targets.nextElementSibling;
          if (nexts.nodeName === "UL") {
            if (nexts.style.display == "none") {
              nexts.style.display = "block";
            } else {
              nexts.style.display = "none";
            }
          }
        }
      })
    </script>

由于我是写的json假数据,所以没有结构和样式哦~,样式就是数组包对象,对象里面再包数组对象这样写,页面只需要一个空 div就可以哦家人们!


相关文章
|
1月前
|
前端开发 JavaScript
JavaScript递归菜单栏
JavaScript递归菜单栏
JavaScript递归菜单栏
|
2月前
|
JSON JavaScript 前端开发
JavaScript第五天(函数,this,严格模式,高阶函数,闭包,递归,正则,ES6)高级
JavaScript第五天(函数,this,严格模式,高阶函数,闭包,递归,正则,ES6)高级
|
3月前
|
缓存 JavaScript 前端开发
|
4月前
|
数据采集 缓存 JavaScript
JavaScript递归函数的设计与优化
JavaScript递归函数的设计与优化
|
5月前
|
JavaScript 前端开发 测试技术
了解JS递归
了解JS递归
34 1
|
5月前
|
JavaScript Serverless
JS实现递归功能
JS实现递归功能
|
4月前
|
数据采集 缓存 JavaScript
JavaScript递归函数的设计与优化
JavaScript递归函数的设计与优化
|
6月前
|
前端开发 JavaScript
前端 JS 经典:递归
前端 JS 经典:递归
38 0
|
6月前
|
JavaScript
node.js递归拼凑成树形结构
node.js递归拼凑成树形结构
34 0
|
6月前
|
JavaScript 前端开发
JavaScript递归的理解(最详细)
JavaScript递归的理解(最详细)