я бы сделал как-то так:
<style>
p { margin: 0px }
body { font-size: 11px; font-family: verdana; line-height: 17px }
.sub { padding-left: 20px; display: block }
.menu { cursor: pointer; display: block }
a { text-decoration: none; color: #000000 }
</style>
<script language=JavaScript>
function show( node ) {
if( arguments.callee.prv )
arguments.callee.prv.style.display = 'none';
do {
node = node.nextSibling;
} while (! node.tagName);
arguments.callee.prv = node;
node.style.display = 'block';
}
</script>
<span class="menu" onclick="show(this)">+ Статьи</span>
<span class="sub" id="sub1" style="display: none">
<p><a href='http://'>Интернет</a></p>
<p><a href='http://'>JavaScript</a></p>
</span>
<span class="menu" onclick="show(this)">+ Рейтинг</span>
<span class="sub" id="sub2" style="display: none">
<p><a href='http://'>Главная</a></p>
<p><a href='http://'>Регистрация</a></p>
<p><a href='http://'>Статистика</a></p>
</span>
<span class="menu" onclick="show(this)">+ Форум</span>
<span class="sub" id="sub3" style="display: none; border: 3px">
<p><a href='http://www.webobzor.net'>Регистрация</a></p>
<p><a href='http://www.webobzor.net'>Cообщения</a></p>
<p><a href='http://www.webobzor.net'>Поиск</a></p>
</span>
1) нету глобальной переменной, 2) не нужно задавать id для всех подменю и привязывать обработчики к своим подменю - функция show сама все находит |
Вот блин! Потребовалось сделать компактное дерево с неограниченным количеством уровней
<style>
p { margin: 0px }
body { font-size: 11px; font-family: verdana; line-height: 17px }
.sub { padding-left: 20px; display: block }
.menu { cursor: pointer; display: block }
a { text-decoration: none; color: #000000 }
</style>
<script language=JavaScript>
function show(obj) {
if (document.getElementById(obj).style.display == 'none')
{
if (typeof old != "undefined")
{
document.getElementById(old).style.display = 'none';
}
document.getElementById(obj).style.display = 'block';
old=obj;
return (old);
}
else document.getElementById(obj).style.display = 'none';
}
</script>
<span class="menu" onclick="show('sub1')">+ Статьи</span>
<span class="sub" id="sub1" style="display: none">
<p><a href='http://'>Интернет</a></p>
<p><a href='http://'>JavaScript</a></p>
</span>
<span class="menu" onclick="show('sub2')">+ Рейтинг</span>
<span class="sub" id="sub2" style="display: none">
<p><a href='http://'>Главная</a></p>
<p><a href='http://'>Регистрация</a></p>
<p><a href='http://'>Статистика</a></p>
</span>
<span class="menu" onclick="show('sub3')">+ Форум</span>
<span class="sub" id="sub3" style="display: none; border: 3px">
<a href='http://'>Регистрация</a></p>
<span class="menu" onclick="show('sub4')">+ Cообщения</span>
<span class="sub" id="sub4" style="display: none">
<p><a href='http://'>Главная</a></p>
<p><a href='http://'>Регистрация</a></p>
<p><a href='http://'>Статистика</a></p>
</span>
<p><a href='http://'>Поиск</a></p>
</span>
И чего то я застрял, возникла идея вызывать функцию show, в которой будет указан еще и уровень вложения, например:
... onclick="show('sub4','2')" ....
а как это применить не соображу :help: |
зачем тебе уровень передавать? Оно и так должно работать. Просто есть разные варианты реализации... чем тебя твой не устраивает? Ну или вообще, как ты представляешь работу многоуровневого меню?
|
Цитата:
<style>
p { margin: 0px }
body { font-size: 11px; font-family: verdana; line-height: 17px }
.sub { padding-left: 20px; display: block }
.menu { cursor: pointer; display: block }
a { text-decoration: none; color: #000000 }
</style>
<script language=JavaScript>
old = new Array(10);
function show(obj,level) {
if (document.getElementById(obj).style.display == 'none')
{
if ((typeof last != "undefined")&&(lastlevel != "undefined"))
{
if (level<lastlevel)
{
for (var n=level; n<=lastlevel; n++) {
document.getElementById(old[n]).style.display = 'none';
}
}
if (lastlevel==level)
{
document.getElementById(last).style.display = 'none';
}
}
document.getElementById(obj).style.display = 'block';
last=obj;
old[level]=obj;
lastlevel=level;
return (last,lastlevel,old);
}
else document.getElementById(obj).style.display = 'none';
}
</script>
<span class="menu" onclick="show('sub1','1')">+ 1</span>
<span class="sub" id="sub1" style="display: none">
<p><a href='http://'>1.1</a></p>
<p><a href='http://'>1.2</a></p>
</span>
<span class="menu" onclick="show('sub2','1')">+ 2</span>
<span class="sub" id="sub2" style="display: none">
<p><a href='http://'>2.1</a></p>
<p><a href='http://'>2.2</a></p>
<p><a href='http://'>2.3</a></p>
</span>
<span class="menu" onclick="show('sub3','1')">+ 3</span>
<span class="sub" id="sub3" style="display: none; border: 3px">
<a href='http://'>3.1</a></p>
<span class="menu" onclick="show('sub4','2')">+ 3.2</span>
<span class="sub" id="sub4" style="display: none">
<p><a href='http://'>3.2.1</a></p>
<span class="menu" onclick="show('sub6','3')">+ 3.2.2</span>
<span class="sub" id="sub6" style="display: none">
<p><a href='http://'>3.2.2.1</a></p>
<p><a href='http://'>3.2.2.2</a></p>
<p><a href='http://'>3.2.2.3</a></p>
</span>
<p><a href='http://'>3.2.3</a></p>
<p><a href='http://'>3.2.4</a></p>
</span>
<span class="menu" onclick="show('sub5','2')">+ 3.3</span>
<span class="sub" id="sub5" style="display: none">
<p><a href='http://'>3.3.1</a></p>
<p><a href='http://'>3.3.2</a></p>
<p><a href='http://'>3.3.3</a></p>
</span>
<p><a href='http://'>3.4</a></p>
</span>
Сделал, только остался вопрос. Почему не желательно использовать глобальные переменные? |
потому что это может приводить к неожиданным багам, которые может быть нелегко найти. Потому что разные части кода могут непреднаеренно использовать одну и ту же переменную, и если это происходит одновременно...
Крайний случай: ключевое слово var всячески игнорируется - т.е. все переменные глобальные p.s. и чем больше скриптов на странице (учитывая внешние библиотеки, если такие есть) - тем это актуальнее |
Цитата:
1) имена переменных придумывать позакавырестее 2) или cкрывать все элемены меню, с помощью функции getElementByClass, искать все родительские ветки и делать им style.display = 'block' ? |
проблемы возникнут в том, что у вас переменная может называться content и в каком-то скрипте может существовать такая-же переменная. и результаты того, что участки кода, использующие эти переменные, могут выполняться одновременно - вы можете представить сами.
пойдем от обратного. Цитата:
Цитата:
пример.
a=5;
for (i=0;i<5;i++)
{alert (a);}
пять раз выведется 5
a=5;
for (i=0;i<5;i++)
{var a=4; alert (a);}
alert(a);
пять раз выведется 4, а потом выведется 5. понятно? |
С глобальными переменными все ясно!
Спасибо всем за помощь! |
AzriMan, неудачный пример, 6 раз выведется 4. Лучше что-то типа
function a() {
for( i=0; i<2; i++ )
b();
}
function b() {
for( i=0; i<2; i++ )
alert('b');
}
a();
|
x-yuri, хм, да, действительно. а почему?
|
| Часовой пояс GMT +3, время: 18:11. |