Вот что у меня получилось
<ul class=" ul-tree ul-drop" id="multi-derevo">
<li>
<p><a href="/ru/">Домой</a></p>
<ul>
<li>
<p><a href="/ru/d1/">д1</a></p>
<ul>
<li>
<p><a href="/ru/d1/d2/"><span>д2</span></a></p>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p><a href="/ru/page/">page</a></p>
<ul>
<li>
<p><a href="/ru/page/p1/">p1</a></p>
<ul>
<li>
<p><a href="/ru/page/p1/p2/">p2</a></p>
<ul>
<li>
<p><a href="/ru/page/p1/p2/p3/"><span>p3</span></a></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p><a href="/ru/new/">new</a></p>
<ul>
<li>
<p><a href="/ru/new/n1/">n1</a></p>
<ul>
<li>
<p><a href="/ru/new/n1/n2/">n2</a></p>
<ul>
<li>
<p><a href="/ru/new/n1/n2/n3/">n3</a></p>
<ul>
<li>
<p><a href="/ru/new/n1/n2/n3/n4/">n4</a></p>
<ul>
<li>
<p><a href="/ru/new/n1/n2/n3/n4/n5/"><span>n5</span></a></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
ul.ul-tree {
padding-left: 2em;
padding-bottom: 12px;
}
ul.ul-tree li {
position: relative;
list-style: none outside none;
border-left: 1px solid rgba(0,0,0,.5);
margin: 0;
line-height: 24px;
}
ul.ul-tree li {
position: relative;
list-style: none outside none;
border-left: 1px solid rgba(0,0,0,.5);
margin: 0;
line-height: 24px;
}
ul.ul-tree p {
position: relative;
top: 12px;
margin: 0 0 0 2.5em;
padding: 0 0;
}
ul.ul-tree ul {
margin: 0;
padding-left: 17px;
}
ul.ul-drop div.drop {
width: 11px;
height: 11px;
position: absolute;
z-index: 10;
top: 19px;
left: 12px;
background-image: url('/media/menu/plus.png');
background-position: -11px 0;
background-repeat: no-repeat;
cursor: pointer;
}
ul.ul-tree p:before {
content: '';
display: block;
border-bottom: 1px solid rgba(0,0,0,.5);
position: absolute;
width: 2.5em;
height: 24px;
left: -2.5em;
top: -12px;
}
ul.ul-tree.ul-drop li ul{
display: none;
}
ul.ul-tree li:last-child{border-left:0 none}
ul.ul-tree li:last-child > p:before{border-left:solid 1px rgba(0,0,0,.5)}
/* Дерево многоуровневое
-------------------------------- */
#multi-derevo {
width: 220px; /* блок под дерево */
border: solid; /* границы блока */
border-color: silver gray gray silver;
border-width: 2px;
padding: 0 0 1em 0; /* нижний отступ */
font-size: 1.3em;
}
ul, li {
list-style-image:none;
list-style-position:outside;
list-style-type:none;
margin:0;
padding:0;
}
ul li {
line-height: 1.2em;
}
ul li ul {
display: none; /* узлы свернуты */
}
ul li ul li {
margin: 0 0 0 1.2em;
border-left: 1px solid silver; /* цвет вертикальной линии между узлами */
}
li.last {/* последний узел, соединительную линию к след. узлу убираем */
border: none;
}
.marker { /* маркер раскрытия списка в закрытом состоянии */
background-color: #fff;
border-color: transparent transparent transparent #666;
border-style: solid;
border-width: .25em 0 .25em .5em;
display: block;
heigth: 0;
margin: .35em .25em 0 0;
float: left;
width: 0;
height: 0;
line-height: 0;
}
.marker.open {/* маркер раскрытия списка в открытом состоянии */
border-color: #999 transparent transparent transparent;
border-width: .6em .25em 0 .25em;
}
p.current {
color: black;
font-weight: bold;
background-color: #f4f4f4;
}
$(document).ready(function(){
var root = $('#multi-derevo');
$('li', root).each(function(index){
this.id = 'n' + index;
});
var current_id = $.cookie('current_node');
if(current_id) $('#'+current_id).find('p:first').toggleClass('current')
$(root).find("li:has(ul)").prepend('<div class="drop"></div>');
$("div.drop", root).click(function() {
$('p.current', root).removeClass('current');
var a = $('p:first', this.parentNode);
a.toggleClass('current');
var current_id = a.parent('li').attr('id');
setCookie('current_node', current_id || null);
toggleNode(this);
});
$(".ul-drop").find("ul").parents("li").children("div.drop").css({'background-position':"0 0"});
openNodes();
});
//---------------------------------------------------------------------------------
// Выделил функцию разворачивания дерева в отдельную
function toggleNode(two) {// node= li
if ($(two).nextAll("ul").css('display')=='none') {
$(two).nextAll("ul").slideDown(400);
$(two).css({'background-position':"-11px 0"});
$(two).toggleClass('open');
saveTreeState();
} else {
$(two).nextAll("ul").slideUp(400);
$(two).css({'background-position':"0 0"});
saveTreeState();
}
}
function toggleNode1(two) {// node= li
var ul=$(two);// Находим поддерево
if (("ul:first", ul).length) {
$("ul:first", ul).slideDown(400);
$(ul).children("div.drop").css({'background-position':"-11px 0"});
/*$(ul).toggleClass('open');*/
saveTreeState();
} else {
/* $("ul:first").slideUp(400);
$(ul).css({'background-position':"-11px 0"});*/
saveTreeState();
}
}
// подготовка информации о сосотояниях узлов
function GetOpenedNodes(items){ // li:has('ul')
var str = [];
$(items).each(function() {
var res = $(this).attr('id');
var state = $('div:first',this).hasClass('open') ? 1 : '';
if(res && state){
str.push(res);
}
});
return str.join(',');
}
// сохранить полный список открытых узлов
function saveTreeState(){
var open_id = GetOpenedNodes($('#multi-derevo li:has("ul")')) || null;
setCookie("open_nodes", open_id);
return false;
}
// раскрытие узлов по указанному списку
function openNodes(){
// читаем куки и открываем узлы
var open_nodes = $.cookie("open_nodes");
if(open_nodes) {
var nodes = open_nodes.split(',');
if(nodes[0]){
for(var node in nodes){
nodes[node] = '#' + nodes[node];
}
var ids = nodes.join(',');
$(ids).each(function() {
toggleNode1($(this));
});
}
}
return false;
}
// настройки хранить в Cookies 1 день
function setCookie(name, value){
var DAY = 24 * 60 * 60 * 1000;
var date = new Date();
date.setTime(date.getTime() + (1 * DAY)); // 1 день
$.cookie(name, value, {expires: date});
// alert("Cookie set: "+name+"="+value);
}
я готов ответить на вопросы как все работает если что не понятно, в общем проблема здесь такая, почемуто элементы которые хранятся в куках сбрасываются после второй перезагрузки или когда развернуто много частей дерева, чтото напаратачил не могу понять что.