Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Bootstrap меню с подгрузкой dropdown-menu в col-sm. Меню строится из json (https://javascript.ru/forum/dom-window/70983-bootstrap-menyu-s-podgruzkojj-dropdown-menu-v-col-sm-menyu-stroitsya-iz-json.html)

omegarekrut 16.10.2017 20:56

Bootstrap меню с подгрузкой dropdown-menu в col-sm. Меню строится из json
 
Bootstrap меню с подгрузкой dropdown-menu в col-sm. Меню строится из json
Здравствуйте господа. Возникла огромная проблема с динамическим формированием меню. К сожалению, я немного понимаю в JS.
Задача: имеется json файл из которого необходимо строить меню. ID "0010" и "0020" являются главными parent-ами. У меня получается вытащить все дочерние ветки, если пройтись циклом по json, и если ввести ключевые parentid. Но проблема в том, что дальше зайти, в дочерние ветки сформированных списков я никак не могу, потому что не понимаю как правильно это сделать по событию click в только что сформированном меню.

Вдобавок, jsfiddle не формирует даже меню в первом col-sm level-1 :
Ссылка

Я правда надеюсь, что не слишком много прошу по данному поводу, но задача для меня оказалась сложной

рони 18.10.2017 00:01

меню из json
 
omegarekrut,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  #test a + ul {
     display: none;
  }
  #test a.open + ul {
     display:  block;
  }
  #test a{
    cursor: pointer;
    display: inline-block;
  }
  #test a.dd:after{
     content: "+";
     margin-left: 4px;
  }
  #test a.dd.open:after{
     content: "-";
  }
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
$.getJSON('https://api.myjson.com/bins/zlxnt', function(data) {
data.forEach(function(el, i) {
   var parentId = el.PARENT;
   var parent = document.querySelector("#_"+parentId);
   if(!parent) {
     parent = document.querySelector("#test");
      }
    else $(parent).prev().addClass("dd");
    var li = $("<li>").appendTo(parent);
    $("<a>", {text : el.NAME}).appendTo(li);
    $("<ul>", {id : "_"+parentId}).appendTo(li);
})
})
$("#test").on("click", "a", function(event) {
  event.preventDefault();
  this.classList.toggle("open")
})

});
  </script>
</head>

<body>
<ul id="test"></ul>

</body>
</html>

Dilettante_Pro 18.10.2017 11:59

рони,
Что-то меню не совсем соответствует структуре JSON
Код:

[{"CID":"0001","PARENT":"0000","LINK":"0001","NAME":"Системное меню"},{"CID":"0010","PARENT":"0001","LINK":"0010","NAME":"Система"},{"CID":"0020","PARENT":"0001","LINK":"0020","NAME":"Разделы учета"},....
т.е. вроде как-то так
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  #_0000 a + ul {
     display: none;
  }
  #_0000 a.open + ul {
     display:  block;
  }
  #_0000 a{
    cursor: pointer;
    display: inline-block;
  }
  #_0000 a.dd:after{
     content: "+";
     margin-left: 4px;
  }
  #_0000 a.dd.open:after{
     content: "-";
  }
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
$.getJSON('https://api.myjson.com/bins/zlxnt', function(data) {
console.log(JSON.stringify(data));
data.forEach(function(el, i) {
   var parentId = el.PARENT;
   var parent = document.querySelector("#_"+parentId);
   $(parent).prev().addClass("dd");
    var li = $("<li>").appendTo(parent);
    $("<a>", {text : el.NAME}).appendTo(li);
    $("<ul>", {id : "_"+el.CID}).appendTo(li);
})
})
$("#_0000").on("click", "a", function(event) {
  event.preventDefault();
  this.classList.toggle("open")
})

});
  </script>
</head>

<body>
<ul id="_0000"></ul>

</body>
</html>

рони 18.10.2017 13:47

Dilettante_Pro,
:thanks: тогда строка 36
parent = document.querySelector("#_0000"); ???

Dilettante_Pro 18.10.2017 14:04

рони,
Да, недоправил. Удалил все лишнее из примера пост#3

рони 18.10.2017 14:14

может так ???
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  #_0000 a + ul {
     display: none;
  }
  #_0000 a.open + ul {
     display:  block;
  }
  #_0000 a{
    cursor: pointer;
    display: inline-block;
  }
  #_0000 a.dd:after{
     content: "+";
     margin-left: 4px;
  }
  #_0000 a.dd.open:after{
     content: "-";
  }
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
$.getJSON('https://api.myjson.com/bins/zlxnt', function(data) {
console.log(JSON.stringify(data));
data.forEach(function(el, i) {
   var parentId = el.PARENT;
   var parent = document.querySelector("#_"+parentId);
   if(!parent) {
     parent = $("<ul>", {id : "_"+parentId}).appendTo("#_0000");
      }
    else $(parent).prev().addClass("dd");
    var li = $("<li>").appendTo(parent);
    $("<a>", {text : el.NAME}).appendTo(li);
    $("<ul>", {id : "_"+el.CID}).appendTo(li);
})
})
$("#_0000").on("click", "a", function(event) {
  event.preventDefault();
  this.classList.toggle("open")
})

});
  </script>
</head>

<body>
<ul id="_0000"></ul>

</body>
</html>

рони 18.10.2017 14:16

Dilettante_Pro,
нехватает некоторых пунктов без if(!parent)

рони 18.10.2017 14:21

:( ??? что-то не так снова

рони 18.10.2017 14:30

:write: надо посмотреть :)
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  #_0000 a + ul {
     display: none;
  }
  #_0000 a.open + ul {
     display:  block;
  }
  #_0000 a{
    cursor: pointer;
    display: inline-block;
  }
  #_0000 a.dd:after{
     content: "+";
     margin-left: 4px;
  }
  #_0000 a.dd.open:after{
     content: "-";
  }
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
$.getJSON('https://api.myjson.com/bins/zlxnt', function(data) {
console.log(JSON.stringify(data));
data.forEach(function(el, i) {
   var parentId = el.PARENT;
   var parent = document.querySelector("#_"+parentId);
   var li;
   if(!parent) {
   li =  $("<li>", {id : "_"+parentId}).appendTo("#_0000");
      }
    else {
    $(parent).prev("a").addClass("dd");
    li = $("<li>").appendTo(parent);
    };
    $("<a>", {text : el.NAME}).appendTo(li);
    $("<ul>", {id : "_"+el.CID}).appendTo(li);
})
})
$("#_0000").on("click", "a", function(event) {
  event.preventDefault();
  this.classList.toggle("open")
})

});
  </script>
</head>

<body>
<ul id="_0000"></ul>

</body>
</html>

Dilettante_Pro 18.10.2017 14:55

Этот элемент
{"CID":"02FX","PARENT":"0301","LINK":"02FX","NAME" :"Группы активов"}
должен входить в
{"CID":"0301","PARENT":"0300","LINK":"0301","NAME" :"Справочники"}
Но не входит, потому что они идут в JSON в обратном порядке.
М.Б. предварительно сортировать данные?


Часовой пояс GMT +3, время: 09:31.