js实现导航菜单树形结构

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <ul id="menu">
        <li>胡歌
            <ul>
                <li>电影</li>
                <li>电视剧
                    <ul>
                        <li>琅琊榜</li>
                        <li>伪装者</li>
                        <li>猎场</li>
                        <li>仙剑奇侠传</li>
                    </ul>
                </li>
                <li>话剧</li>
                <li>音乐</li>
            </ul>
        </li>
        <li>朱一龙</li>
        <li>肖战</li>
        <li>毛不易</li>
    </ul>
    <button>按钮</button>
    <script>
        //第一种方法------------使用li添加侦听,会在内存中添加存储,消耗内存
        var lis=document.getElementsByTagName("li");
        for(var i=0;i<lis.length;i++){
            lis[i].addEventListener("click",clickHandler);
        }

        function clickHandler(e){
            if(!this.firstElementChild) return;//如果li没有子元素,就不执行
            e.stopPropagation();//li阻止冒泡事件,要不然会使父元素的li也会执行
            // console.log(Boolean(this.bool))
            //第一次点击bool是false,点击执行li子元素为none
            if(!this.bool) this.firstElementChild.style.display="none";
            // 第二次点击bool为true,执行下行代码,是li子元素设置为block
            else this.firstElementChild.style.display="block";

            this.bool=!this.bool;
        }



 		// 第二种方法-----------------事件委托
        //使用父元素添加侦听,可以减少事件侦听,可以减少内存存储
        var menu=document.querySelector("#menu");
        menu.addEventListener("click",clickHandler);

        function clickHandler(e){
            console.log(e)
            if(e.target.constructor!==HTMLLIElement)return;//如果不是li,就不执行
            if(!e.target.firstElementChild) return;//如果li没有子元素,就不执行
            e.stopPropagation();//li阻止冒泡事件,要不然会使父元素的li也会执行

            if(!e.target.bool) e.target.firstElementChild.style.display="none";
            else e.target.firstElementChild.style.display="block";
            e.target.bool=!e.target.bool;
        }

    </script>
</body>

</html> 

实现结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡萝卜大王驾到通通闪开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值