【问题标题】:Dynamic menu with jQuery json data带有 jQ​​uery json 数据的动态菜单
【发布时间】:2020-08-11 03:16:05
【问题描述】:

我已经尝试过了,但它不起作用。我正在尝试从 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>

【问题讨论】:

    标签: javascript html jquery web


    【解决方案1】:

    您没有按预期使用$.each 函数。您将 this 作为 args 传递给您的函数。 thisundefined在函数getMenuItem

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

    此外,在您的cd-secondary-dropdown 中,您只需一次添加ul,而不是在$.each 中。

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

    在下面运行 sn-p 以查看它的工作情况。

    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>

    【讨论】:

    • 嗨,我提到的关于切面输出的返回 li 怎么样。
    • 还有一个问题,如果我想计算高度。例如,$('.has-children') height = 240px /(有多少个主要类别项)
    • @Kelvin 您需要将/ 除以总类别的.length。如果我帮助并解决了您的问题,您介意accepting the answer 吗?
    • @Kelvin 您可以尝试使用.length,例如:$('.has-children') height() / $('.main-categories').length - 这只是粗略的示例。但本周你可以做到这一点!理想情况下,我建议您是否可以发布另一个问题添加添加main-categories html - 所以有人可以帮助准确
    • 其实是一样的,只计算有多少
    • ,根据上面的代码,女装男装为主。
    【解决方案2】:

    这是你想要做的吗?如果是,这是一种不使用 jQuery 的方法

    let 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
                }]
            }]};
    
    const MENU_COMPONENT  = document.querySelector('#Menu');
    
    for (const field in data.menu) {
    
    
    const LI= document.createElement('li');
    LI.setAttribute('class', 'has-children');
    MENU_COMPONENT.appendChild(LI);
    const LINK = document.createElement('a');
    LINK.setAttribute('href', data.menu[field].link);
    LINK.innerText = data.menu[field].name;
    LI.appendChild(LINK);
    
    const UL = document.createElement('ul');
    UL.setAttribute('class', 'cd-secondary-dropdown is-hidden');
    LI.appendChild(UL);
    
    let SUBLEVEL_DATA = data.menu[field].sub;
    
      for (const sub in SUBLEVEL_DATA) {
        const SECOND_LEVEL_LI = document.createElement('li');
        SECOND_LEVEL_LI.setAttribute('class', 'has-icon');
        UL.appendChild(SECOND_LEVEL_LI);
        const SECOND_LEVEL_LINK = document.createElement('a');
        SECOND_LEVEL_LINK.setAttribute('href', SUBLEVEL_DATA[sub].link);
        SECOND_LEVEL_LINK.className = 'submenu';
             SECOND_LEVEL_LINK.innerText = SUBLEVEL_DATA[sub].name;
         SECOND_LEVEL_LI.appendChild(SECOND_LEVEL_LINK);
      }
      
    }
    &lt;ul id="Menu"&gt;&lt;/ul&gt;

    【讨论】:

    • 我在切面输出中提到的返回 li 怎么样。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签