如何将JSON动态插入到手风琴菜单中?

时间:2018-08-03 13:44:19

标签: javascript jquery html json menu

我需要使用JSON创建多级手风琴动态菜单。我下载了一个模板,然后尝试在此菜单中调整JSON文件,但是在创建子菜单时,它仅返回未定义的值。

$.getJSON("menu.json", function(data) {
  createHtml(data.menu);
});

function createHtml(menuJson) {
  var html = '';


  $.each(menuJson, function(i, item) {
    if (item.sub) {

      html += '<li class="has-children">'+
                '<input type="checkbox" checked/>'+
                '<label><span class="'+item.icon+'"></span>  '+
                item.name+'</label><ul>'
      html += createHtml(item.sub);
      html += '</ul></li>';
    } else {
      html += '<li><a href="'+item.link+'"><i class="'+item.icon
            + 'mmenu-icon"></i>&nbsp; '+item.name+'</a></li>';
    }
    return html;
  })
  $(".cd-accordion-menu").html(html);

}

HTML:

    <ul class="cd-accordion-menu animated">
    <li class="has-children">
        <input type="checkbox" name ="group-1" id="group-1" checked>
        <label for="group-1">Group 1</label>

        <ul>
            <li class="has-children">
                <input type="checkbox" name ="sub-group-1" id="sub-group-1">
                <label for="sub-group-1">Sub Group 1</label>
                <ul>
                    <li><a href="#0">Image</a></li>
                    <li><a href="#0">Image</a></li>
                    <li><a href="#0">Image</a></li>
                </ul>
            </li>
            <li class="has-children">
                <input type="checkbox" name ="sub-group-2" id="sub-group-2">
                <label for="sub-group-2">Sub Group 2</label>
                <ul>
                    <li class="has-children">
                        <input type="checkbox" name ="sub-group-level-3" id="sub-group-level-3">
                        <label for="sub-group-level-3">Sub Group Level 3</label>
                        <ul>
                            <li><a href="#0">Image</a></li>
                            <li><a href="#0">Image</a></li>
                        </ul>

如何修改功能以更好地适应模板?

1 个答案:

答案 0 :(得分:1)

此菜单的逻辑有缺陷。您正在返回一个forEach内部,这没有任何意义,并且您正在设置菜单的html,以便主菜单和递归调用。这也是错误的。

返回必须在forEach之外,并且菜单调用的设置需要在其他位置进行。

$.getJSON("menu.json", function(data) {
  var html = createHtml(data.menu);
  $(".cd-accordion-menu").html(html); //set html here
});

function createHtml(menuJson) {
  var html = '';
  $.each(menuJson, function(i, item) {
    if (item.sub) {
      html += '<li class="has-children">' +
        '<input type="checkbox" checked/>' +
        '<label><span class="' + item.icon + '"></span>  ' +
        item.name + '</label><ul>'
      html += createHtml(item.sub);
      html += '</ul></li>';
    } else {
      html += '<li><a href="' + item.link + '"><i class="' + item.icon +
        'mmenu-icon"></i>&nbsp; ' + item.name + '</a></li>';
    }
  })
  return html; //return html outside of the loop
}