javascript - 将 JSON 数据渲染到 Bootstrap 嵌套 HTML - JQuery 插件

标签 javascript jquery html json twitter-bootstrap

我正在尝试创建一个接受 JSON 格式数据的插件。我希望输出如下所示:https://jsfiddle.net/ann7tctp/330/

我正在尝试设置一个递归函数,但无法理解它。嵌套列表深度未知。请参阅更新的 fiddle 以了解有关我想要实现的目标的更多信息。

非常感谢任何帮助!

<html>
<style>
.list-group.list-group-root {
    padding: 0;
    overflow: hidden;
}

.list-group.list-group-root .list-group {
    margin-bottom: 0;
}

.list-group.list-group-root .list-group-item {
    border-radius: 0;
    border-width: 1px 0 0 0;
}

.list-group.list-group-root > .list-group-item:first-child {
    border-top-width: 0;
}

.list-group.list-group-root > .list-group > .list-group-item {
    padding-left: 30px;
}

.list-group.list-group-root > .list-group > .list-group > .list-group-item {
    padding-left: 45px;
}

.list-group-item .glyphicon {
    margin-right: 5px;
}

</style>
<h1>Expected Output</h1>
<ul class="list-group list-group-root well">

  <li href="#item-1" class="list-group-item" data-toggle="collapse">
    <i class="glyphicon glyphicon-chevron-right"></i>Item 1
  </li>

  <ul class="list-group collapse" id="item-1">

    <li href="#item-1-1" class="list-group-item" data-toggle="collapse">
      <i class="glyphicon glyphicon-chevron-right"></i>Item 1.1
    </li>

    <ul class="list-group collapse" id="item-1-1">
      <li href="#" class="list-group-item">Item 1.1.1</li>
      <li href="#" class="list-group-item">Item 1.1.2</li>
      <li href="#" class="list-group-item">Item 1.1.3</li>
    </ul>

    <li href="#item-1-2" class="list-group-item" data-toggle="collapse">
      <i class="glyphicon glyphicon-chevron-right"></i>Item 1.2
    </li>

    <ul class="list-group collapse" id="item-1-2">
      <li href="#" class="list-group-item">Item 1.2.1</li>
      <li href="#" class="list-group-item">Item 1.2.2</li>
      <li href="#" class="list-group-item">Item 1.2.3</li>
    </ul>

    <li href="#item-1-3" class="list-group-item" data-toggle="collapse">
      <i class="glyphicon glyphicon-chevron-right"></i>Item 1.3
    </li>
    <ul class="list-group collapse" id="item-1-3">
      <li href="#" class="list-group-item">Item 1.3.1</li>
      <li href="#" class="list-group-item">Item 1.3.2</li>
      <li href="#" class="list-group-item">Item 1.3.3</li>
    </ul>

  </ul>

</ul>

<h1>JSON Data Output</h1>

<div id="nested-categories"></div>

<script>
$(function() {

var data = [
  {
    "id": 1,
    "name": "Uncategorized",
    "children": []
  },
  {
    "id": 3,
    "name": "Parent 1",
    "children": [
      {
        "id": 4,
        "name": "Child 1"
      },
      {
        "id": 5,
        "name": "Child 2"
      },
      {
        "id": 6,
        "name": "Child 3"
      }
    ]
  },
  {
    "id": 7,
    "name": "Parent 2",
    "children": [
      {
        "id": 8,
        "name": "Child 1"
      },
      {
        "id": 9,
        "name": "Child 2"
      },
      {
        "id": 10,
        "name": "Child 3"
      }
    ]
  }
];

var isInitTree = true;

    function buildTreeWithJSONArray(json,root) {

            if(isInitTree){
                isInitTree = false;
                //Create Initial element
                root.append('<ul class="list-group list-group-root in well"></ul>');
            }else{
                root.find("ul:first").append('<ul class="list-group"></ul>');
            }

            for (var i = 0; i < json.length; i++) {

                var $li = $("<li class='list-group-item' data-id='" + json[i].id + "'><span class='list-group-content'>" + json[i].name + "</span></li>");

                root.find("ul:first").append($li);

                if (typeof json[i].children !== 'undefined') {

                    //$li.data("toggle","collapse").prepend('<i class="fa fa-arrow-right"></i> ').attr('href','#list-'+json[i].id);

                    //root.find('ul.list-group:first').attr("id",'list-'+json[i].id).addClass('collapse');

                    buildTreeWithJSONArray(json[i].children, $li);
                }
            }
        }


        //Run the Recursive function..

   buildTreeWithJSONArray(data,$("#nested-categories"));




  $('.list-group-item').on('click', function() {
    $('.glyphicon', this)
      .toggleClass('glyphicon-chevron-right')
      .toggleClass('glyphicon-chevron-down');
  });

});
</script>
</html>

最佳答案

您的代码发生的情况是,当您调用递归函数时,您正在验证根是否是 init Tree,当然它不会像变量 isInitTree 那样已更新为 false,因此您的代码表示,它应该在根元素内找到 ul ,在您的情况下,是 li 元素您将作为参数发送。

它不会找到任何 ul 元素,因为您发送的 li 中没有任何元素,因此它不会执行任何操作。

尝试:

if(isInitTree){
    isInitTree = false;
    //Create Initial element
    root.append('<ul class="list-group list-group-root in well"></ul>');
 }else{
    root.append('<ul class="list-group"></ul>');
}

请查看您的updated fiddle ,这有望让您朝着正确的方向前进。

关于javascript - 将 JSON 数据渲染到 Bootstrap 嵌套 HTML - JQuery 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43665410/

相关文章:

javascript - 使用javascript移动Openlayer map 的中心

javascript - 使用参数 (JavaScript) 将变量直接传递到 getElementById

javascript - 找不到模块 : 'cldr' in . ..\globalize\dist\globalize

javascript - 使用 javascript 显示成功和错误消息

javascript - 当浏览器调整大小时,将元素保留在父 View 中

javascript - 根据类和元素类型选择元素

jquery - IE 中 jquery Accordion 的无效参数错误

javascript - 如何使用php和javascript在mysql中提交多行

javascript - 在 html Canvas 之间复制像素数据

jQuery Ajax 如何将responseText 作为变量传递给indexOf?