热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

jquery无限级下拉菜单的简单实现代码

本篇文章主要是对jquery无限级下拉菜单的简单实现代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
本例子使用json数据,拼接ul和li来实现的
效果图:




1.准备json数据:
代码如下:

var menuData = [
            {id:0,pid:-1,name:"订购产品",url:"",children:[
                {id:1,pid:0,name:"电脑配件",url:"https://www.jb51.net",children:[
                    {id:20,pid:1,name:"cpu",url:"https://www.jb51.net",children:[
                        {id:30,pid:20,name:"Intel",url:"https://www.jb51.net",children:[
                            {id:3000,pid:30,name:"Intel 01",url:""},
                            {id:3001,pid:30,name:"Intel 02",url:""},
                            {id:3002,pid:30,name:"Intel 03",url:""},
                            {id:3003,pid:30,name:"Intel 04",url:""},
                            {id:3004,pid:30,name:"Intel 05",url:""},
                            {id:3005,pid:30,name:"Intel 06",url:""},
                            {id:3006,pid:30,name:"Intel 07",url:""},
                            {id:3007,pid:30,name:"Intel 08",url:""},
                            {id:3008,pid:30,name:"Intel 09",url:""}
                        ]},
                        {id:31,pid:20,name:"AMD",url:"https://www.jb51.net",children:[
                            {id:3100,pid:31,name:"AMD 01",url:""},
                            {id:3101,pid:31,name:"AMD 02",url:""},
                            {id:3102,pid:31,name:"AMD 03",url:""},
                            {id:3103,pid:31,name:"AMD 04",url:""},
                            {id:3104,pid:31,name:"AMD 05",url:""},
                            {id:3105,pid:31,name:"AMD 06",url:""},
                            {id:3106,pid:31,name:"AMD 07",url:""},
                            {id:3107,pid:31,name:"AMD 08",url:""},
                            {id:3108,pid:31,name:"AMD 09",url:""}
                        ]}
                    ]},
                    {id:21,pid:1,name:"内存",url:"https://www.jb51.net"},
                    {id:22,pid:1,name:"硬盘",url:"https://www.jb51.net"},
                    {id:23,pid:1,name:"主板",url:"https://www.jb51.net"},
                    {id:24,pid:1,name:"显卡",url:"https://www.jb51.net"},
                    {id:25,pid:1,name:"显示器",url:"https://www.jb51.net"},
                    {id:26,pid:1,name:"主机箱",url:"https://www.jb51.net"},
                    {id:27,pid:1,name:"主机箱电源",url:"https://www.jb51.net"},
                    {id:28,pid:1,name:"键鼠(有线)",url:"https://www.jb51.net"},
                    {id:29,pid:1,name:"键鼠(无线)",url:"https://www.jb51.net"}
                ],url:"https://www.jb51.net"},
                {id:101,pid:0,name:"监控器材",children:[
                    {id:102,pid:101,name:"摄像头",url:"https://www.jb51.net"},
                    {id:103,pid:101,name:"摄像头",url:"https://www.jb51.net"},
                    {id:104,pid:101,name:"摄像头",url:"https://www.jb51.net"},
                    {id:112,pid:101,name:"摄像头",url:"https://www.jb51.net"},
                    {id:113,pid:101,name:"摄像头",url:"https://www.jb51.net"},
                    {id:114,pid:101,name:"摄像头",url:"https://www.jb51.net"},
                    {id:115,pid:101,name:"摄像头",url:"https://www.jb51.net"},
                    {id:116,pid:101,name:"摄像头",url:"https://www.jb51.net"},
                    {id:117,pid:101,name:"摄像头",url:"https://www.jb51.net"}
                ],url:"https://www.jb51.net"},
                {id:201,pid:0,name:"数码产品",children:[
                    {id:202,pid:201,name:"摄像头",url:"https://www.jb51.net"}
                ],url:"https://www.jb51.net"},
                {id:301,pid:0,name:"网络产品",children:[
                    {id:302,pid:301,name:"摄像头",url:"https://www.jb51.net"}
                ],url:"https://www.jb51.net"},
                {id:401,pid:0,name:"打印耗材",children:[
                    {id:402,pid:401,name:"打印机",url:"https://www.jb51.net"},
                    {id:403,pid:401,name:"油墨",url:"https://www.jb51.net"},
                    {id:404,pid:401,name:"纸张",url:"https://www.jb51.net"},
                    {id:405,pid:401,name:"摄像头",url:"https://www.jb51.net"},
                    {id:406,pid:401,name:"摄像头",url:"https://www.jb51.net"},
                    {id:407,pid:401,name:"摄像头",url:"https://www.jb51.net"},
                    {id:408,pid:401,name:"摄像头",url:"https://www.jb51.net"}
                ],url:"https://www.jb51.net"}
            ]},
            {id:1000,pid:-1,name:"我的订单",url:"",children:[
                {id:1001,pid:1000,name:"已过期订单",url:""},
                {id:1001,pid:1000,name:"已付款订单",url:""}
            ]},
            {id:2000,pid:-1,name:"公司信息",url:"",children:[
                {id:2001,pid:2000,name:"最新新闻",url:""},
                {id:2002,pid:2000,name:"公司地址",url:""}
            ]}
        ];

2.html代码:
代码如下:



3.解析json数据(plugin-menu.js文件):刚学会写jquery插件,写的还比较乱,凑合着看吧
代码如下:

(function($){
    $.fn.extend({
        menu:function(options){
            var defaults = {
                data:[],
                ulId:"baseMenu"
            };
            var optiOns= $.extend(defaults, options);
            // 开始拼接ul,li
            $.each(options.data,function(i,v){
                var li = $("
  • ");
                    var _a = $(""+options.data[i].name+"");
                    _a.attr("href",options.data[i].url)
                        .appendTo(li);

                    _each(options.data[i],li);
                    li.appendTo($("#"+options.ulId));
                });
                // 给li添加事件
                $(this).find("li").hover(function(){
                    var id = $(this).attr("id");
                    $(this).find("ul[name='"+id+"']").show();
                },function(){
                    var id = $(this).attr("id");
                    $(this).find("ul[name='"+id+"']").hide();
                });
            }
        });
    })(jQuery);

    因为支持无限级,所以肯定会用到递归方法:
    代码如下:

    function _each(data,li){
        if(data==undefined||data.children==undefined){
            return false;
        }
        var ul = $("
      ");

          $.each(data.children,function(i,v){
              var _li = $("
    • ");
              var _a = $(""+data.children[i].name+"");
              _a.attr("href",data.children[i].url)
                  .attr("target","_blank")
                  .appendTo(_li);

              if(data.children[i].children!=undefined){
                  _each(data.children[i],_li);
              }
              _li.appendTo(ul);
          });
          ul.appendTo(li);
      }

      4.调用插件:
      代码如下:

      $(function() {
          $("#menu").menu({data:menuData,ulId:"baseMenu"});
      });

      最后,css样式:
      代码如下:

      ul,li{list-style:none;padding:0px;margin:0px;}
      #menu *{line-height:30px;}
      #menu a{text-decoration:none;}
      #menu ul{text-align:left;}
      #menu>ul>li{text-align:center;width:80px;float:left;}
      #menu>ul>li>a{color:#000;}
      #menu>ul>li:hover{background:#F0F0F0;}
      #menu>ul>li ul{display:none;width:150px;position:absolute;background:#c1cd94;box-shadow:2px 2px 2px #000;-webkit-box-shadow:2px 2px 2px #000;
        -moz-box-shadow:2px 2px 2px #123;}
      #menu>ul>li>ul li{padding-left:5px; position:relative;}
      #menu>ul>li>ul li>a{color:#000;}
      #menu>ul>li>ul li:hover{background:#d3dbb3;}
      #menu>ul>li>ul>li ul{left:150px; top:0px;}

      推荐阅读
      • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
      • 网站访问全流程解析
        本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
      • javascript分页类支持页码格式
        前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
      • Framework7:构建跨平台移动应用的高效框架
        Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
      • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
      • Web开发框架概览:Java与JavaScript技术及框架综述
        Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
      • .children() 方法用于获取选中元素的所有直接子元素。此方法仅遍历DOM树的一层,如需遍历多层子元素,请使用 .find() 方法。 ... [详细]
      • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
      • Cookie学习小结
        Cookie学习小结 ... [详细]
      • 深入解析Django CBV模型的源码运行机制
        本文详细探讨了Django CBV(Class-Based Views)模型的源码运行流程,通过具体的示例代码和详细的解释,帮助读者更好地理解和应用这一强大的功能。 ... [详细]
      • 网络爬虫的规范与限制
        本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
      • 本文最初发表在Thorben Janssen的Java EE博客上,每周都会分享最新的Java新闻和动态。 ... [详细]
      • 在本文中,我们将深入探讨 jQuery 中的 DOM 操作与事件处理技术,通过实现类似 Yahoo 邮箱登录框的提示效果来展示其强大功能。我们将详细介绍如何利用简洁的 jQuery 代码提升用户体验,并分享一些实用的示例。同时,我们还会解析这些示例中涉及的具体操作和事件处理方法。 ... [详细]
      • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
      • 近日,我在处理一个复杂的前端问题时遇到了极大困扰。具体来说,我之前开发了一个功能丰富的纯jQuery代码的前端GridView控件,实现了多种功能和视觉效果,并在多个项目中表现良好。然而,最近在尝试应用 `border-box` 布局模式时,却遇到了意想不到的兼容性和性能问题。这提醒我们在条件尚未完全成熟的情况下,应谨慎使用 `border-box` 布局模式,以免引入不必要的复杂性和潜在的bug。 ... [详细]
      author-avatar
      davychen
      这个家伙很懒,什么也没留下!
      PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
      Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有