javascript - 来自数组的动态 HTML 导航栏

标签 javascript jquery html

我将以下数组输出到等效的 JavaScript JSON 变量,并尝试创建一个基于动态的导航栏。

$navArray = array(
    array('id'=>1,'parent'=>0,'text'=>'1A','href'=>'1a'),
    array('id'=>2,'parent'=>1,'text'=>'2B','href'=>'2b'),
    array('id'=>3,'parent'=>1,'text'=>'3C','href'=>'3c'),
    array('id'=>4,'parent'=>2,'text'=>'4D','href'=>'4d'),
    array('id'=>5,'parent'=>2,'text'=>'5E','href'=>'5e'),
    array('id'=>6,'parent'=>5,'text'=>'6F','href'=>'6f'),
    array('id'=>7,'parent'=>5,'text'=>'7G','href'=>'7g'),
    array('id'=>8,'parent'=>3,'text'=>'8H','href'=>'8h'),
);

脚本 (JavaScript/jQuery) 应获取数组并根据父“id” 返回 HTML,如下所示:

<ul>
    <li>
        <a href="1a">1A</a>
        <ul>
            <li>
                <a href="2b">2B</a>
                <ul>
                    <li>
                        <a href="4d">4D</a>
                    </li>
                    <li>
                        <a href="/סוכרת">5E</a>
                        <ul>
                            <li>
                                <a href="6f">6F</a>
                            </li>
                            <li>
                                <a href="7g">7G</a>
                            </li>
                        </ul>
                    </li>
                </ul>
            </li>
            <li>
                <a href="3c">3C</a>
                <ul>
                    <li>
                        <a href="8h">8H</a>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
<ul>

HTML 屏幕结果应如下所示:

enter image description here

我尝试做一些事情...但没有成功。

$('li.dropdown').hover(
    function(){
        $(this).find('ul').slideDown();
    },
    function(){
        $(this).find('ul').slideUp();
    });

如何按照描述动态创建多维级别 HTML 导航栏?

最佳答案

听起来像是递归的经典案例,您可以更改数组对象以包含它们自己的子对象吗?

$navArray = array(
    array('id'=>1,'text'=>'1A','href'=>'1a', 'children' => array(
      array('id'=>2,'text'=>'2B','href'=>'2b', 'children' => array(
        array('id'=>4,'text'=>'4D','href'=>'4d'),
        array('id'=>5,'text'=>'5E','href'=>'5e', 'children' => array(
          array('id'=>6,'text'=>'6F','href'=>'6f'),
          array('id'=>7,'text'=>'7G','href'=>'7g'),
        )),
      )),
      array('id'=>3,'text'=>'3C','href'=>'3c', 'children' => array(
        array('id'=>8,'text'=>'8H','href'=>'8h')
      )),
    )),
);

然后,如果您将数组输出到 JS ( let arr = <?=json_encode($navArray)?> ),您可以将其输入到您的函数中,该函数将在子级中递归运行,与此类似的操作应该可以工作:

function createMenuItems(arr) {
  let output = '<ul>'
  for (let item of arr) {
    output += `<li><a id="${item.id}" href="${item.href}">${item.text}</a></li>`
    if (item.children && item.children.length) {
      output += createMenuItems(item.children);
    }
  }
  output += '</ul>'
  return output
}

关于javascript - 来自数组的动态 HTML 导航栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45037753/

相关文章:

javascript - 使用 javascript 设置每个项目的属性

javascript - AngularJS 在单击 ng-click ng-repeat 时替换列表

javascript - 为什么警告框会阻止 chrome 中的所有选项卡

javascript - 如何使用类方法作为回调在类中添加事件处理程序?

javascript - 在组件外部使用 refs

javascript - 传入url时如何获取对象?

javascript - jquery 获取元素

php - 网站上的 HTML CSS JavaScript 字体,不使用图像

javascript - 使用 Bootstrap 的响应式 3 列布局

javascript - 在 JavaScript 函数运行时加载图像