Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > show/hide дивов


Автор: Joes 7.1.2006, 22:06
задача стоит такая:

есть блоки с текстом. блоки имеют айди, начинающиеся с a, т.е. a130, a20, a300.
нужно, чтобы по нажатию на какой-либо из пп. меню открывался оный, а все остальные закрывались, т.е. style.display = 'none';
вот я и не знаю как сделать, чтобы по нажатию, например, на второй пункт меню, открытый прежде первый - закрывался.

Автор: ezhikov 7.1.2006, 22:58
Попробуйте разобрать этот код

Код

var oldID = null;

  function show(idCel) {
    
    if (oldID != null)
      eval('document.all.'+oldID +'.style.display ="none" ');
      eval('document.all.'+idCel+'.style.display ="" ');
    oldID = idCel;
   
  }


Автор: Illuminaty 7.1.2006, 23:14
ezhikov, а зачем так усложнять? eval использовать?
Код

<script type="text/javascript" language="javascript">
/* 
    id элемента, который отображается в данный момент
    инициируется в момент загрузки страницы
*/
var showedId = null;

function ShowAndHide(showId) {
/* 
    скрывает элемент с id = showedId и отображает элемент с id = showId
*/
    document.getElementById(showedId).style.display = "none"; // скрыли
    document.getElementById(showId).style.display = "block"; // показали
    showedId = showId; // запомнили id отображаемого элемента
}
</script>
Joes, а зачем здесь условие?
Цитата(Joes @ 7.1.2006, 23:06 Найти цитируемый пост)

блоки имеют айди, начинающиеся с a, т.е. a130, a20, a300.


Автор: ezhikov 8.1.2006, 01:02
Я не спец в скриптах. Данный вариант использовал на сайте. Что, где и как уже не помню - главное работало smile пример: http://vibm.narod.ru (правда он там немного усложнен)
сам набор скриптов http://vibm.narod.ru/jscript.js
на академичность не претендую smile

Автор: Joes 8.1.2006, 11:30
ezhikov
+1 спасибо, что-то я до eval'a вчера не додумался...

Автор: Sardar 9.1.2006, 15:50
ezhikov это самое глючное решение что я когда либо видел, мало того ещё и не по стандартам W3C, мозилла(и все продвинутые браузеры) будет материться smile

Пример от Illuminaty самый правильный.

Автор: ezhikov 9.1.2006, 20:41
А в чем собсно глючность данного решения. В 99% времени я работаю в FireFox и проблем не наблюдаю. Что здесь не работает или не должно работать? Правда я еще добавил в конец
Код

    eval('document.all.about.style.display ="none" ');
  }

где "about" - у меня был начальный открытый id

p.s. Что-то профиль данного форума у меня постоянно слетает. Может что настроить где надо?

Автор: Sardar 9.1.2006, 21:52
Цитата(ezhikov @ 9.1.2006, 19:41 Найти цитируемый пост)
А в чем собсно глючность данного решения.

В том что document.all поддерживался изначально IE и Оперой, затем мозилла таки сломилась и с версий 1.0.7 тоже стала поддерживать document.all (хотя и выдаёт предупреждения в консоль). По моему другие браузеры, Safari например document.all не поддерживает. Отсюда понимаем что не нужно юзать сию не стандартную фичу, document.getElementById делает то же самое (ну почти, элементы ищуться только по ID).
Второе замечание по самому eval, эта штука делает код не опрятным, мало эффективным с труднонаходимыми ошибками. Не знаю таких случаев что бы eval понадобился...
В итоге с твой код не эффективный и не везде будет работать.

Цитата(ezhikov @ 9.1.2006, 19:41 Найти цитируемый пост)
Правда я еще добавил в конец

Сам подумай, зачем там использовать eval, если ничего в коде ты не меняешь. Убери eval, строку что передавал поставь как код, понаблюдай за тем что функционально ничего не изменилось smile

Автор: ezhikov 10.1.2006, 00:01
ясно, спасибо..
будем листать справочники, чтож такое eval и getElementById smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)