Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
<script type="text/javascript">
/*<![CDATA[*/
(function() {
var tree_init = function() {
this.clearWhitespace = function(element) {
var i, array = [];
for (i=0; i<element.childNodes.length; i++) {
if (element.childNodes[i].nodeType == 3) {
element.childNodes[i].nodeValue.match(/^[\s\r\n]+$/m) &&
array.push(element.childNodes[i]);
} else {
this.clearWhitespace(element.childNodes[i]);
}
}
for (i=0; i<array.length; i++) {
array[i].parentNode.removeChild(array[i]);
}
}
this.addMarker = function() {
var ul_item = this.tree.getElementsByTagName("ul");
for (var i=0; i<ul_item.length; i++) {
var li_item = ul_item[i].getElementsByTagName("li");
for (var j=0; j<li_item.length; j++) {
var child = li_item[j].getElementsByTagName("ul");
if (child.length > 0 && li_item[j].parentNode == ul_item[i]) {
var a_item = li_item[j].getElementsByTagName("a");
if (a_item.length > 0 && a_item[0].parentNode.parentNode == li_item[j]) {
a_item[0].innerHTML = '<em class="marker"></em>' + a_item[0].innerHTML;
}
}
}
}
}
this.addEvent = function() {
var span_item = this.tree.getElementsByTagName("span");
var thisCopy = this;
for (var i=0; i<span_item.length; i++) {
span_item[i].onclick = function() { thisCopy.click(this) };
}
}
this.setCurrent = function(a) {
if (this.current)
this.current.className =
this.current.className.replace("current", "");
this.current = a;
a.className += " current";
}
this.toggleClass = function(elem, classname) {
if (elem.className.indexOf(classname) != -1) {
elem.className = elem.className.replace(classname);
elem.className = elem.className.replace(" ", " ");
} else {
elem.className += " " + classname;
}
}
this.click = function(span) {
var subtree;
var a = span.firstChild;
var li = span.parentNode;
var ul = span.nextSibling;
var em = a.firstChild;
this.setCurrent(a);
if (li.nextSibling == null) {
li.hasChildNodes() && (subtree = li.childNodes[1]);
for (var i=0; i<subtree.childNodes.length; i++)
subtree.childNodes[i].className = "last";
}
if (ul && ul.nodeName.toLowerCase() == "ul")
ul.style.display = ul.offsetWidth > 0 ? "none" : "block";
if (em && em.nodeName.toLowerCase() == "em")
this.toggleClass(em, "open");
}
this.tree = document.getElementById('multi-derevo');
this.clearWhitespace(this.tree);
this.addMarker();
this.addEvent();
}
if (window.attachEvent) {
window.attachEvent("onload", tree_init);
} else {
window.addEventListener("load", tree_init, false);
}
})()
/*]]>*/
</script>
if (li.nextSibling == null) {
li.hasChildNodes() && (subtree = li.childNodes[1]);
for (var i=0; i<subtree.childNodes.length; i++)
subtree.childNodes[i].className = "last";
}
if (li.nextSibling == null && li.hasChildNodes() && (subtree = li.childNodes[1])) {
subtree.className = "last";
}
<div id="multi-derevo">заменяем на
<div id="multi-derevo" onclick="treeMenu(event)">
function treeMenu(event)
{
event = event || window.event;
var clickedElem = event.target || event.srcElement;
// достаем узел на который нажали
var node = jQuery(clickedElem.parentNode);
// у зла нет поддерев? (узел-лист)
if (!node.hasClass('marker'))
return;
// анимация
node.children('ul').slideToggle(200);
node.toggleClass('open');
}
Многоуровневое дерево с маркерами (HTML, CSS). Продолжение с jQuery