首页 > 解决方案 > 带有 jQ​​uery json 数据的动态菜单

问题描述

我已经尝试过了,但它不起作用。我正在尝试从 jQuery json 数据制作动态菜单。我在下面插入预览。

我正在开发完全自定义的 UI,所以我打算不使用 jQuery.UI。

var data = {
        menu: [{
            name: 'Women Cloth',
            link: '0',
            sub: null
        },{
            name: 'Men Cloth',
            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
            }]
        }]};

    var getMenuItem = function (itemData) {
        var item = $("<li>", {
            class: 'has-children',
            id: itemData.id
        }).append(
        $("<a>", {
            href: itemData.link,
            html: itemData.name,
            id: itemData.id + '-links',
        }));
        if (itemData.sub) {
            var subMenuItem = $("<li>", {
            class: 'has-icon'
            }).append(
            $("<a>", {
                href: itemData.link,
                class: 'submenu-title',
            }));
            var subList = $("<ul>", {
                class: 'secondary-dropdown',
            });
            $.each(itemData.sub, function () {
                subList.append(subMenuItem(this));
            });
            item.append(subList);
        }
        return item;
    };
    var $menu = $("#Menu");
    $.each(data.menu, function () {
        $menu.append(
            getMenuItem(this)
        );
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul id="Menu"></ul>

下面是我需要的输出。

<li class="has-children" id="ID">
    <a id="ID-links" href="links">Women Clothing</a>
    <ul class="cd-secondary-dropdown is-hidden">
        <li class="go-back"><a>Back</a></li>
        <li class="has-icon"><a class="submenu">submenu 1</a></li>
        <li class="has-icon"><a class="submenu">submenu 2</a></li>
        <li class="has-icon"><a class="submenu">submenu 3</a></li>
        <li class="has-icon"><a class="submenu">submenu 4</a></li>
        <li class="has-icon"><a class="submenu">submenu 5</a></li>
    </ul>
</li>

<li class="has-children" id="ID">
    <a id="ID-links" href="links">Men Clothing</a>
    <ul class="cd-secondary-dropdown is-hidden">
        <li class="go-back"><a>Back</a></li>
        <li class="has-icon"><a class="submenu">submenu 1</a></li>
        <li class="has-icon"><a class="submenu">submenu 2</a></li>
        <li class="has-icon"><a class="submenu">submenu 3</a></li>
        <li class="has-icon"><a class="submenu">submenu 4</a></li>
        <li class="has-icon"><a class="submenu">submenu 5</a></li>
    </ul>
</li>

标签: javascripthtmljqueryweb

解决方案


您没有$.each按预期使用功能。您正在传递您thisargs功能。thisundefined在函数中getMenuItem

在您的 $.each 函数中,您需要将 args 作为索引和数据。Index返回每个人的数量&是你需要传递给你的函数key的数量。JSONdata

同样在你的你只cd-secondary-dropdown需要添加一次,而不是在.ul$.each

我已经修复了您的问题code,并且在上面的输出中完全按照您的要求工作。

运行下面的代码片段以查看它的工作原理。

var data = {
  menu: [{
    name: 'Women Cloth',
    link: '0',
    sub: null
  }, {
    name: 'Men Cloth',
    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
    }]
  }]
};

var getMenuItem = function(itemData) {

  var item = $("<li>", {
    class: 'has-children',
    id: itemData.id
  }).append(
    $("<a>", {
      href: itemData.link,
      html: itemData.name,
      id: itemData.id + '-links',
    }));


  if (itemData.sub) {
    //Add UL once only
    var subList = $("<ul>", {
      class: 'secondary-dropdown',
    }); 
    //Append go back
    var goBack = $("<li>", {}).append(
      $("<a>", {
        href: '',
        html: 'Go back',
        class: 'go-back',
      }));
    //Append go back
    subList.append(goBack);
    $.each(itemData.sub, function(index, data) {
      //Sub menu
      var subMenuItem = $("<li>", {
        class: 'has-icon'
      }).append(
        $("<a>", {
          href: data.link,
          html: data.name,
          class: 'submenu-title',
        }));

      subList.append(subMenuItem);
    });

    item.append(subList);
  }
  return item;
};


var $menu = $("#Menu");
$.each(data.menu, function(index, data) {
  $menu.append(getMenuItem(data));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul id="Menu"></ul>


推荐阅读