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


Posted in Javascript onFebruary 21, 2014

本例子使用json数据,拼接ul和li来实现的
效果图:

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

1.准备json数据:

var menuData = [
            {id:0,pid:-1,name:"订购产品",url:"",children:[
                {id:1,pid:0,name:"电脑配件",url:"https://3water.com",children:[
                    {id:20,pid:1,name:"cpu",url:"https://3water.com",children:[
                        {id:30,pid:20,name:"Intel",url:"https://3water.com",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://3water.com",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://3water.com"},
                    {id:22,pid:1,name:"硬盘",url:"https://3water.com"},
                    {id:23,pid:1,name:"主板",url:"https://3water.com"},
                    {id:24,pid:1,name:"显卡",url:"https://3water.com"},
                    {id:25,pid:1,name:"显示器",url:"https://3water.com"},
                    {id:26,pid:1,name:"主机箱",url:"https://3water.com"},
                    {id:27,pid:1,name:"主机箱电源",url:"https://3water.com"},
                    {id:28,pid:1,name:"键鼠(有线)",url:"https://3water.com"},
                    {id:29,pid:1,name:"键鼠(无线)",url:"https://3water.com"}
                ],url:"https://3water.com"},
                {id:101,pid:0,name:"监控器材",children:[
                    {id:102,pid:101,name:"摄像头",url:"https://3water.com"},
                    {id:103,pid:101,name:"摄像头",url:"https://3water.com"},
                    {id:104,pid:101,name:"摄像头",url:"https://3water.com"},
                    {id:112,pid:101,name:"摄像头",url:"https://3water.com"},
                    {id:113,pid:101,name:"摄像头",url:"https://3water.com"},
                    {id:114,pid:101,name:"摄像头",url:"https://3water.com"},
                    {id:115,pid:101,name:"摄像头",url:"https://3water.com"},
                    {id:116,pid:101,name:"摄像头",url:"https://3water.com"},
                    {id:117,pid:101,name:"摄像头",url:"https://3water.com"}
                ],url:"https://3water.com"},
                {id:201,pid:0,name:"数码产品",children:[
                    {id:202,pid:201,name:"摄像头",url:"https://3water.com"}
                ],url:"https://3water.com"},
                {id:301,pid:0,name:"网络产品",children:[
                    {id:302,pid:301,name:"摄像头",url:"https://3water.com"}
                ],url:"https://3water.com"},
                {id:401,pid:0,name:"打印耗材",children:[
                    {id:402,pid:401,name:"打印机",url:"https://3water.com"},
                    {id:403,pid:401,name:"油墨",url:"https://3water.com"},
                    {id:404,pid:401,name:"纸张",url:"https://3water.com"},
                    {id:405,pid:401,name:"摄像头",url:"https://3water.com"},
                    {id:406,pid:401,name:"摄像头",url:"https://3water.com"},
                    {id:407,pid:401,name:"摄像头",url:"https://3water.com"},
                    {id:408,pid:401,name:"摄像头",url:"https://3water.com"}
                ],url:"https://3water.com"}
            ]},
            {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代码:
<div id="menu"><ul id="baseMenu"></ul></div>

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 = $("<li id='"+options.data[i].id+"' name='"+options.data[i].pid+"'></li>");
                var _a = $("<a>"+options.data[i].name+"</a>");
                _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 = $("<ul name='"+data.id+"' style='display:none;'></ul>");    $.each(data.children,function(i,v){
        var _li = $("<li id='"+data.children[i].id+"' name='"+data.children[i].pid+"'></li>");
        var _a = $("<a>"+data.children[i].name+"</a>");
        _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;}
Javascript 相关文章推荐
你必须知道的JavaScript 变量命名规则详解
May 07 Javascript
原生JS实现加入收藏夹的代码
Oct 24 Javascript
JQuery中上下文选择器实现方法
May 18 Javascript
jquery表单对象属性过滤选择器实例分析
May 18 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
May 31 Javascript
jQuery 3.0 的 setter和getter 模式详解
Jul 11 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
Aug 17 Javascript
jquery对Json的各种遍历方法总结(必看篇)
Sep 29 Javascript
仿淘宝JSsearch搜索下拉深度用法
Jan 15 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
Aug 12 Javascript
详解vue父子组件状态同步的最佳方式
Sep 10 Javascript
JS使用setInterval计时器实现挑战10秒
Nov 08 Javascript
jQuery 无限级菜单的简单实例
Feb 21 #Javascript
js控制table合并具体实现
Feb 20 #Javascript
js文件Cookie存取值示例代码
Feb 20 #Javascript
js中array的sort()方法使用介绍
Feb 20 #Javascript
javascript生成随机大小写字母的方法
Feb 20 #Javascript
将json对象转换为字符串的方法
Feb 20 #Javascript
javascript实现json页面分页实例代码
Feb 20 #Javascript
You might like
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
2011/05/24 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
10个基于Jquery的幻灯片插件教程
2010/10/29 Javascript
JavaScript instanceof 的使用方法示例介绍
2013/10/23 Javascript
js获取select标签选中值的两种方式
2014/01/09 Javascript
网站内容禁止复制和粘贴、另存为的js代码
2014/02/26 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
JavaScript设计模式之单件模式介绍
2014/12/28 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
基于jQuery倒计时插件实现团购秒杀效果
2016/05/13 Javascript
JS实现自动阅读单词(有道单词本添加功能)
2016/11/14 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
python中的一些类型转换函数小结
2013/02/10 Python
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
Python列表append和+的区别浅析
2015/02/02 Python
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
Python简单定义与使用字典dict的方法示例
2017/07/25 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
Exoticca英国:以最优惠的价格提供豪华异国情调旅行
2018/10/18 全球购物
实习教师自我鉴定
2013/09/27 职场文书
计算机应用专业推荐信
2013/11/13 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
妈妈再爱我一次观后感
2015/06/08 职场文书
工资证明范本
2015/06/12 职场文书
Python基础之字符串格式化详解
2021/04/21 Python
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android
JavaScript 反射学习技巧
2021/10/16 Javascript
Python OpenCV实现图形检测示例详解
2022/04/08 Python
vue里使用create, mounted调用方法
2022/04/26 Vue.js
python神经网络学习 使用Keras进行回归运算
2022/05/04 Python