БлогNot. Javascript: как проще всего вывести дерево со сворачиванием и разворачиванием уз...

Javascript: как проще всего вывести дерево со сворачиванием и разворачиванием узлов?

Можно, конечно, как-то вот так изощряться с фреймворками, как я некогда сделал. А можно подумать, что DOM - уже само по себе дерево, и задать иерархию проще всего любыми нравящимися нам вложенными тегами HTML. Потом написать на яваскрипте метод, задающий вложениями блочных тегов нужное поддерево документа, например, такое:

<ul id="doc" style="display: none;">
 <li>First
 <li>Second
  <ul>
   <li>2.1
   <li>2.2
   <li>2.3
 </ul>
 <li>Third
</ul>

По id="doc" мы будем находиться нужную часть документа, а чтобы не было показа тегов до их разворачивания, отключаем показ этой части документа через стиль.

Теперь в заголовочной (или другой) секции HTML-документа напишем код для разворачивания и сворачивания узлов нашего дерева:

<script type="application/javascript">
function makeTree(element, parent) {
 var t = createItem("div", "tree", parent);
 var tog = createItem("span", "toggle", t);
 var h = createItem("span", "tag", t);
 if (element.tagName === undefined) {
  var txt = element.textContent;
  if (txt.length > 0 && txt.match(/\S/)) {
   //h = createItem("div", "txt", t);
   h.textContent = txt;
  }
  return t;
 }
 tog.textContent = "-";
 tog.onclick = function () { clicked(tog); }
 h.textContent = element.nodeName;
 var children = element.childNodes;
 for (var i = 0; i != children.length; i++) makeTree(children[i], t);
 return t;
}
 
function clicked(element) {
 var is_on = element.textContent == "-";
 element.textContent = is_on ? "+" : "-";
 element.parentNode.className = is_on ? "tree-hide" : "tree";
}

function createItem(tag, className, parentNode) {
 var e = document.createElement(tag);
 e.className = className;
 if (parentNode) parentNode.appendChild(e);
 return e;
}

function getTd (id) { return document.getElementById(id); }

function getTree (id) {
 getTd('tree').textContent = "";
 getTd('tree').appendChild(makeTree(getTd(id), null));
}
</script>
<noscript>
 <div align="center">Для работы приложения нужен включённый в браузере Javascript!</div>
</noscript>

Он будет искать нужное место в документе, где строится дерево тегов, по id="tree".

Подберём подходящий стиль:

<style>
 #tree { white-space: pre; font-family: monospace; border: 1px solid }
 .tree > .tree-hide, .tree > .tree
  { margin-left: 2em; border-left: 1px dotted rgba(0,0,0,.4)}
 .tree-hide > .tree, .tree-hide > .tree-hide 
  { display: none }
 .tag { color: navy; }
 .tree-hide > .tag { color: maroon; }
 .toggle { display: inline-block; width: 2em; text-align: center }
</style>

И вызовем всё это:

<div id="tree"><a href="javascript:getTree('doc')">Разверни меня</a></div>

Вот что вышло, с ветками можно обращаться как обычно - разворачивать щелчком по "+" и сворачивать по "-":

Для работы приложения нужен включённый в браузере Javascript!

Должно работать в любом современном браузере. А недостатки подхода будут такими:

  • "дерево ссылок" не сделать, ведь <A> - такой же тег и тоже будет развёрнут - но мы задачи сделать меню здесь не ставили, да и громоздкий JQuery не понадобился :)
  • наш код показывает в качестве наименований узлов дерева наименования соответствующих тегов из HTML-кода - но это, при желании, можно поправить :)

26.06.2016, 14:46 [6490 просмотров]


теги: javascript html список

К этой статье пока нет комментариев, Ваш будет первым