【问题标题】:How to create sub child menu from a json如何从 json 创建子子菜单
【发布时间】:2013-03-03 20:00:42
【问题描述】:

我从一个 json 文件创建了一个水平菜单。但我无法创建孩子和子孩子。当我创建管理员的孩子时,它会转到家庭的孩子。我的 javascript 文件是

var data = [{
    "menu":[
        {
            "MenuId":1,
            "MenuName":"Home",
            "MenuLink":null,
            "Action":null,
            "Controller":null,
            "ParentID":null,
            "SortOrder":1,
            "ModuleId":null,
            "Menus":{
            }
        },
        {
            "MenuId":2,
            "MenuName":"New Transaction",
            "MenuLink":null,
            "Action":null,
            "Controller":null,
            "ParentID":null,
            "SortOrder":2,
            "ModuleId":null,
            "Menus":{
            }
        },
        {
            "MenuId":3,
            "MenuName":"Portfolio",
            "MenuLink":null,
            "Action":null,
            "Controller":null,
            "ParentID":null,
            "SortOrder":3,
            "ModuleId":null,
            "Menus":{
            }
        },
        {
            "MenuId":4,
            "MenuName":"Analytics",
            "MenuLink":null,
            "Action":null,
            "Controller":null,
            "ParentID":null,
            "SortOrder":4,
            "ModuleId":null,
            "Menus":{
            }
        },
        {
            "MenuId":5,
            "MenuName":"Instructions",
            "MenuLink":null,
            "Action":null,
            "Controller":null,
            "ParentID":null,
            "SortOrder":5,
            "ModuleId":null,
            "Menus":{
            }
        },
        {
            "MenuId":6,
            "MenuName":"Data Upload",
            "MenuLink":null,
            "Action":null,
            "Controller":null,
            "ParentID":null,
            "SortOrder":6,
            "ModuleId":null,
            "Menus":{
            }
        },
        {
            "MenuId":7,
            "MenuName":"Administration",
            "MenuLink":null,
            "Action":null,
            "Controller":null,
            "ParentID":null,
            "SortOrder":7,
            "ModuleId":null,
            "Menus":[
                {
                    "MenuId":8,
                    "MenuName":"Masters",
                    "MenuLink":null,
                    "Action":null,
                    "Controller":null,
                    "ParentID":7,
                    "SortOrder":1,
                    "ModuleId":null,
                    "Menus":[
                        {
                            "MenuId":10,
                            "MenuName":"Currency",
                            "MenuLink":"/Currencies/Index",
                            "Action":"Index",
                            "Controller":"Currencies",
                            "ParentID":8,
                            "SortOrder":1,
                            "ModuleId":null,
                            "Menus":{
                            }
                        },
                        {
                            "MenuId":11,
                            "MenuName":"Country",
                            "MenuLink":"/Countries/Index",
                            "Action":"Index",
                            "Controller":"Countries",
                            "ParentID":8,
                            "SortOrder":2,
                            "ModuleId":null,
                            "Menus":{
                            }
                        }
                    ]
                },
                {
                    "MenuId":9,
                    "MenuName":"User Management",
                    "MenuLink":null,
                    "Action":null,
                    "Controller":null,
                    "ParentID":7,
                    "SortOrder":2,
                    "ModuleId":null,
                    "Menus":{
                    }
                }
            ]
        }
    ]
}
];
$(function() {
for(var i = 0, j = data[0].menu.length; i<j; i++) {
    var root_menu = data[0].menu[i];
    if(root_menu.hasOwnProperty("MenuId")) {
        $("#menu").append('<li><a href="#" class="parent-menu">' + root_menu.MenuName + '</a>');
        if(root_menu.hasOwnProperty("Menus") && root_menu.Menus.length > 0) {
            $("#menu li").append("<ul class='child-list' id='menu_" + root_menu.MenuId + "'>");
            for(var n = 0, m = root_menu.Menus.length; n<m; n++) {
                var sub_menu = root_menu.Menus[n];
                if(sub_menu.hasOwnProperty("MenuId")) {
                    $("#menu_" + root_menu.MenuId).append("<li class='menu-child'><a href='#'>" + sub_menu.MenuName + "</a></li>");

                }
            }

        }
 $("#menu").append("</ul></li>");

    }
}
});

你可以从http://jsfiddle.net/JcU4G/9/查看我的代码这里的孩子也有一个子孩子。如何从 json 文件中排列子子节点?

【问题讨论】:

    标签: javascript jquery html json css


    【解决方案1】:

    由于您正在循环并将 li 元素添加到主菜单,您可以简单地使用 .last()

    $("#menu li").last().append("<ul class='child-list' id='menu_" + root_menu.MenuId + "'>");
    

    这会将子菜单附加到右侧的主菜单项 =)

    编辑: 要添加另一个子菜单,请添加以下内容:

    if(sub_menu.hasOwnProperty("Menus") && sub_menu.Menus.length > 0){
                        $("#menu_" + root_menu.MenuId + " li").last().append("<ul class='child-list' id='menu_" + sub_menu.MenuId + "'>");
                        for(var oo = 0, pp = sub_menu.Menus.length; oo<pp; oo++){
                            var subsub_menu = sub_menu.Menus[oo];
                            $("#menu_" + sub_menu.MenuId).append("<li></li>")
                        }
                        $("#menu_" + root_menu.MenuId + " li").last().append("</ul>");
                    }
    

    当然,您现在必须调整样式...以正确显示 subsub_menu 项。 这是一个小提琴,我将您的示例分叉并剥离了它的样式:jsfiddle.net/HPNkq

    考虑到您是编程新手,我不想重写您的整个代码,而只是按照您已经编码的方式添加了一点。但是,我会通过定义一个函数来解决这样的问题,该函数对菜单级别进行分类并在项目具有子菜单时再次递归调用自身。

    【讨论】:

    • 没问题,只要检查这个子元素是否像你在 root_menu 上所做的那样有 item Menus ......并且同样的逻辑再次适用于 last。
    • 当您在子菜单中时...检查它是否包含对象菜单...如果是则遍历其内容...我在答案中添加了一些代码...只是您必须将 CSS 添加到新元素中。
    • 如果您不介意,您只需将该代码放在小提琴中并将链接发送给我。我是编程领域的新手。
    • 这是一个可行的版本 - 我取消了样式,但更jsfiddle.net/HPNkq 但更灵活的版本将使用递归函数 - 这样你就不需要对每一层嵌套的循环进行硬编码
    • -你知道响应式设计吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 2013-12-24
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多