【问题标题】:Creating a Menu from JSON从 JSON 创建菜单
【发布时间】:2013-09-25 11:08:45
【问题描述】:

我正在尝试使用 jQuery UI 创建一个动态菜单。

我将从 JSON 文件中获取条目并创建我的菜单项。我决定先做一个小演示,然后再进行更大规模的尝试。这是我的小提琴,它按照我希望的方式工作。现在我无法让它与 JSON 文件一起使用。

WORKING FIDDLE

这是 JSON

var JSON = 
    {
       menu: 
          [
             {name: 'Croatia', link: '0', sub: null},
             {name: 'England', link: '1', sub: 
                [
                   {name: 'Arsenal',link: '0-0', sub: null},
                   {name: 'Liverpool',link: '0-1', sub: null},
                   {name: 'Manchester United',link: '0-2', sub: null}
                ]
             },
             {name: 'Spain', link: '2', sub: 
                [
                   {name: 'Barcelona',link: '2-0', sub: null},
                   {name: 'Real Madrid',link: '2-1', sub: null}
                ]
              },        
              {name: 'Germany', link: '3',sub: 
                [
                   {name: 'Bayern Munich',link: '3-1', sub: null},
                   {name: 'Borrusia Dortmund',link: '3-2', sub: null}
                ]
              }
          ]
    }

如何使用 JSON 中的值设计我的整个菜单,其中 Li 的值如下所示。

<li><a href="#3-2">Borrusia Dortmund</a>
</li>

编辑:这个问题听起来好像我什么都没试过,但我有。它只是我无法理解的 JSON 部分,Jsfiddle 没有正确读取它。我想知道我的 JSON 格式是否不正确。任何帮助将不胜感激

【问题讨论】:

  • 我没用过动态——你在用小胡子吗?
  • 对于 json 验证尝试 jsonlint.com
  • 这是一个 JS 对象,不是 JSON,FWIW。
  • 你没有 JSON,你有一个对象,如前所述。请发布无法按预期工作的代码并解释什么不起作用。

标签: javascript jquery json jquery-ui


【解决方案1】:

只需迭代您的 JSON.menu 数组并从中生成菜单(重命名为 JSON -> 数据 ...):

$(function () {
    var getMenuItem = function (itemData) {
        var item = $("<li>")
            .append(
        $("<a>", {
            href: '#' + itemData.link,
            html: itemData.name
        }));
        if (itemData.sub) {
            var subList = $("<ul>");
            $.each(itemData.sub, function () {
                subList.append(getMenuItem(this));
            });
            item.append(subList);
        }
        return item;
    };

    var $menu = $("#menu");
    $.each(data.menu, function () {
        $menu.append(
            getMenuItem(this)
        );
    });
    $menu.menu();
});

http://jsfiddle.net/9uhc3/5/

【讨论】:

    【解决方案2】:

    像这样(递归函数):

    function parseMenu(ul, menu) {
        for (var i=0;i<menu.length;i++) {
            var li=$(ul).append('<li><a href="'+menu[i].link+'">'+menu[i].name+'</a></li>');
            if (menu[i].sub!=null) {
                var subul=$('<ul id="submenu'+menu[i].link+'"></ul>');
                $(li).append(subul);
                parseMenu($(subul), menu[i].sub);
            }
        }
    }
    
    var menu=$('#menu');
    parseMenu(menu, JSON.menu);
    

    http://jsfiddle.net/uDTk4/ - 包括上面的 JSON(对象)。

    产生的输出/菜单:

    <ul id="menu">
        <li><a href="0">Croatia</a></li>
        <li><a href="1">England</a></li>
        <ul id="submenu1">
            <li><a href="0-0">Arsenal</a></li>
            <li><a href="0-1">Liverpool</a></li>
            <li><a href="0-2">Manchester United</a></li>
        </ul>
        <li><a href="2">Spain</a></li>
        <ul id="submenu2">
            <li><a href="2-0">Barcelona</a></li>
            <li><a href="2-1">Real Madrid</a></li>
        </ul>
        <li><a href="3">Germany</a></li>
        <ul id="submenu3">
            <li><a href="3-1">Bayern Munich</a></li>
            <li><a href="3-2">Borrusia Dortmund</a></li>
        </ul>
    </ul>
    

    【讨论】:

    • 这很好,但是它没有使用 Jquery UI。
    • 好的。我不知道插入ui-state-disabled 的规则 :) 刚刚做了对象解析器-> ul / li 结构
    【解决方案3】:

    您的 json 无效。正确的json如下。

    {"menu":[
        {"name": "Croatia", "link": "0", "sub": null
        },
        {"name": "England", "link": "1", "sub": [
            {"name": "Arsenal","link": "0-0", "sub": null},
            {"name": "Liverpool","link": "0-1", "sub": null},
            {"name": "Manchester United","link": "0-2", "sub": null}
            ]},
        {"name": "Spain", "link": "2", "sub": [
            {"name": "Barcelona","link": "2-0", "sub": null},
            {"name": "Real Madrid","link": "2-1", "sub": null}
        ]},        
        {"name": "Germany", "link": "3","sub": [
            {"name": "Bayern Munich","link": "3-1", "sub": null},
            {"name": "Borrusia Dortmund","link": "3-2", "sub": null}
            ]}
    ]}
    

    【讨论】:

    • 谢谢。这是非常好的。我现在将尝试将其作为菜单实现
    • @MarsOne:你是怎么得到这个 json 的?
    • 目前我直接将它粘贴到我的 JS 中。最终它将由一个通过 web 服务调用的 oracle DB 构建......
    • 为什么他的json无效?
    猜你喜欢
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多