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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值