Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2012, 10:55   #1
dimitar
Новичок
Джуниор
 
Регистрация: 20.03.2012
Сообщений: 10
Вопрос самозакрывающееся меню в виде списка о_О

Всем привет!
помогите пожалуйста в решении следующей проблемы.
на сайте есть меню в виде списка:
Код HTML:
<ul>
  <li><a href="../1/">1</a></li>
  <li><a href="#" onclick="ShowOrHide(this);">2</a>
    <ul>
      <li><a href="../2_1/">2_1</a></li>
      <li><a href="../2_2/">2_2</a></li>
    </ul>
  </li>
  <li><a href="#" onclick="ShowOrHide(this);">3</a>
    <ul>
      <li><a href="../3_1/">3_1</a></li>
  	  <li><a href="../3_2/">3_2</a></li>
  	  <li><a href="../3_3/">3_3</a></li>
    </ul>
  </li>
</ul>
подпункты списка изначально закрыты. при клике на главном пункте списка срабатывает функция ShowOrHide(this), которая открывает подпункты данного пункта списка. вот эта функция:
Код:
function ShowOrHide(obj) 
{
  var ul = obj.parentNode.getElementsByTagName('ul')[0];
  ul.style.display = (ul.style.display!='block')?('block'):('none');
}
подскажите, как сделать так, чтобы при открытии одного пункта, все остальные пункты меню закрывались. т.е. кликнули на пункт 3, он открылся. а при клике на 2, не просто открывается 2 пункт, но и закрывается 3.
dimitar вне форума Ответить с цитированием
Старый 20.03.2012, 11:39   #2
dimitar
Новичок
Джуниор
 
Регистрация: 20.03.2012
Сообщений: 10
По умолчанию

сам разобрался))

Код:
var visibleListElement = null;
function ShowOrHide(obj) {
  if ( visibleListElement ) visibleListElement.style.display = 'none';
  var ul = obj.parentNode.getElementsByTagName('ul')[0];
  ul.style.display = (ul.style.display!='block')?('block'):('none');
  visibleListElement = ul.style.display=='block' && ul || null;
  return false;
}
dimitar вне форума Ответить с цитированием
Старый 20.03.2012, 11:45   #3
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Код:
function(obj) {
  var uls = obj.parentNode.parentNode.getElementsByTagName('ul'),
       ul = obj.parentNode.getElementsByTagName('ul')[0];
  for (var i = uls.length;i--;) uls[i].style.display = 'none';
  ul.style.display = 'block';
}
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 20.03.2012, 12:17   #4
dimitar
Новичок
Джуниор
 
Регистрация: 20.03.2012
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Naive Посмотреть сообщение
Код:
function(obj) {
  var uls = obj.parentNode.parentNode.getElementsByTagName('ul'),
       ul = obj.parentNode.getElementsByTagName('ul')[0];
  for (var i = uls.length;i--;) uls[i].style.display = 'none';
  ul.style.display = 'block';
}
Огромное спасибо!!!
подскажите еще пожалуйста, если Вас не затруднит, как поменять фон у главного пугкта при открытии. раньше я делал это так:
Код:
if (ul.style.display == 'block') //--блок подменю открыт
  {
	obj.style.backgroundImage = 'url(../_img_main/_menu_btn/bttn_'+name+'_on.jpg)';
  }
  else //--блок подменю закрыт
  {
    obj.style.backgroundImage = 'url(../_img_main/_menu_btn/bttn_'+name+'_off.jpg)';
  }
dimitar вне форума Ответить с цитированием
Старый 20.03.2012, 12:53   #5
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Можно так попробовать:
Код:
function(obj) {
  var uls = obj.parentNode.parentNode.getElementsByTagName('ul'),
       ul = obj.parentNode.getElementsByTagName('ul')[0];
  for (var i = uls.length;i--;) {uls[i].style.display = 'none';uls[i].firstChild.style.backgroundImage='url(../_img_main/_menu_btn/bttn_'+name+'_on.jpg)'};
  ul.style.display = 'block';
  obj.style.backgroundImage = 'url(../_img_main/_menu_btn/bttn_'+name+'_off.jpg)';
}
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 20.03.2012, 13:11   #6
dimitar
Новичок
Джуниор
 
Регистрация: 20.03.2012
Сообщений: 10
По умолчанию

так не работает. я тут посмотрел... вот как выглядит мое меню:
Код:
<ul>
  <li><a href="../1/">1</a></li>
  <li><a href="#" onclick="ShowOrHide(this);">2</a>
    <ul>
      <li><a href="../2_1/">2_1</a></li>
      <li><a href="../2_2/">2_2</a></li>
    </ul>
  </li>
  <li><a href="#" onclick="ShowOrHide(this);">3</a>
    <ul>
      <li><a href="../3_1/">3_1</a></li>
  	  <li><a href="../3_2/">3_2</a></li>
  	  <li><a href="../3_3/">3_3</a></li>
    </ul>
  </li>
</ul>
функция ShowOrHide(this); вызывается по клику на ссылках главных пунктов. параметром она принимает указатель на ссылку.
раньше я менял фон таким образом:
Код:
if (ul.style.display == 'block') //--блок подменю открыт
  {
	obj.style.backgroundImage = 'url(../_img_main/_menu_btn/bttn_'+name+'_on.jpg)';
  }
  else //--блок подменю закрыт
  {
    obj.style.backgroundImage = 'url(../_img_main/_menu_btn/bttn_'+name+'_off.jpg)';
  }
т.е. менял не фон пункта списка, а фон ссылки...

помогите пожалуйста, а то я с ума схожу (((
dimitar вне форума Ответить с цитированием
Старый 20.03.2012, 14:02   #7
dimitar
Новичок
Джуниор
 
Регистрация: 20.03.2012
Сообщений: 10
По умолчанию

может проще было бы хранить указатель на предыдущую ссылку, которая открыла предыдущий пункт меню? и при выборе нового - менять ее...
dimitar вне форума Ответить с цитированием
Старый 20.03.2012, 14:26   #8
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Цитата:
Сообщение от dimitar Посмотреть сообщение
может проще было бы хранить указатель на предыдущую ссылку, которая открыла предыдущий пункт меню? и при выборе нового - менять ее...
Глобальные переменные — зло)

в моем коде нужно поменять .firstChild на
Код:
.parentNode.firstChild
чуток напутал с указателями, ага.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 20.03.2012, 14:50   #9
dimitar
Новичок
Джуниор
 
Регистрация: 20.03.2012
Сообщений: 10
По умолчанию

Огромнейшее Вам СПАСИБО! Выручили!
dimitar вне форума Ответить с цитированием
Старый 21.03.2012, 10:17   #10
dimitar
Новичок
Джуниор
 
Регистрация: 20.03.2012
Сообщений: 10
По умолчанию

а можно еще вопрос (не сочтите за наглость )?
есть ли возможность в этом механизме сделать открытие подпунктов списка плавно? если да, то как?
dimitar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
массив типа char в виде списка saidmir Общие вопросы C/C++ 9 20.08.2010 21:38
Очередь в виде двусвязного списка. dimorik Общие вопросы C/C++ 9 10.06.2010 02:24
Меню с Items в виде набора Bitmap (как меню редактирования в Word'е) chandrasecar Мультимедиа в Delphi 7 14.01.2009 09:20
Листбох в виде списка миниизображений CrazyProgramer Общие вопросы Delphi 1 14.07.2008 10:39
Меню в виде дерева pu4koff JavaScript, Ajax 7 16.10.2007 11:24