Его пример можно найти здесь:
http://www.dynamic-design.com.ua/develop/script/ex_8.htm

Текст следующий:

<style>
<!--.folding{cursor:hand;font-weight:bold}//-->
</style>
<script language="JavaScript1.2">
<!--
var head="display:''"
img1=new Image()
img1.src="plus.gif"
img2=new Image()
img2.src="minus.gif"
function change(){
if(!document.all)
return
if (event.srcElement.className=="folding"){
var x=event.srcElement.parentElement
if (x.all[2].style.display=="none"){
x.all[0].src="minus.gif"
x.all[2].style.display=''
}
else{
x.all[0].src="plus.gif"
x.all[2].style.display="none"
}
}}
document.onclick=change
</script>

Само меню:

<div><img src="plus.gif"><span class="folding">Заголовок</span>
<div style="list-style-image:url(list.gif);display:<?echo $mon;?>" style=&{head};>
<A HREF="index.php?page=adam"><? if ($page=="adam"):?> <font color=006699><?endif;?> Ссылка 1</A><BR>
<A HREF="index.php?page=adam"><? if ($page=="adam"):?> <font color=006699><?endif;?> Ссылка 2</A><BR>

Может проблема где-то в неправильном написании обработчика document.onclick=change

Буду очень благодарен за помощь в решении этой проблемы, т.к. альтернативы этого меню не найду. (например JSCookTree слишком сложный и ресурсоемкий).

Хотелось бы сделать именно этот вариант, в IE и Opere работает, а в Firefox не знаю что делать...

=>разработка

MacOS
Ошибка тут:
if(!document.all)
return

Но это только первая ошибка из которой все остальное вытекает...

Я ведь не кодер на JavaScript, поэтому так и не понял, что в if(!document.all) return необходимо исправить...

Вроде ж все правильно..

В Firefox проблема в том что при наведении на меню, стрелка даже не сменяется на hand, броузер не видит даже ссылку на обработчик :)

<!--.folding{cursor:hand;font-weight:bold}//-->

MacOS

В Firefox проблема в том что при наведении на меню, стрелка даже не сменяется на hand

Это от того, что не существует у стиля cursor значения hand. Но есть значение pointer, которое однако не поддерживается в IE, по крайней мере до шестой версии.

Свойство all тоже IE специфично. И отсутствует в стандартах DOM. В общем Вас жестоко обманули в той литературе, которую Вы прочли... ;)
Советую ознакомиться с такими методами элементов DOM как: getElementById, getElementsByTagName, а так же свойствами: parentNode, childNodes, firstChild, lastChild, previousSibling, nextSibling.

Ясно, а что скажете насчет этого скрипта, этот работает везде вроде как:

http://jscook.yuanheng.org/JSCookMenu/tutorial.html

Это все конечно хорошо, W3, стандарты DOM, но я ищу готовое решение, иначе мне придется нанимать профессионального программиста.

Ухх... Запарился я.:whiteflag: :sick: :zzz:

Может на вскидку что-то скажете. Как быстро заставить его открыватся.

На что заменить document.all? :cry:

На что заменить document.all?

document.getElementById(id) ?

MacOS

Может на вскидку что-то скажете. Как быстро заставить его открыватся.

Быстро не получится. Тут нужно все переписывать.

Могу в помочь, но мне нужен полный исходник.

Вот полный текст, его лучше сюда скопировать, поскольку на ресурсе где исходник он вообще не правильно представлен, его пришлось из рабочего примера выдирать.

Т.е., он вот, и я его никак не изменял, в 2 броузерах это работает:

<style>
<!--.folding{cursor:pointer; font-weight:bold}//-->
</style>
<script language="JavaScript1.2">
<!--
var head="display:''"
img1=new Image()
img1.src="plus.gif"
img2=new Image()
img2.src="minus.gif"
function change(){
if(!document.all)
return
if (event.srcElement.className=="folding"){
var x=event.srcElement.parentElement
if (x.all[2].style.display=="none"){
x.all[0].src="minus.gif"
x.all[2].style.display=''
}
else{
x.all[0].src="plus.gif"
x.all[2].style.display="none"
}
}}
document.onclick=change//-->
</script>

И сама реализация скрипта в виде 2 папок, в которых по 2 директории:
<div><img src="plus.gif"><span class="folding">Folder</span>
<div style="list-style-image:url(list.gif);display:none" style=&{head};>
<A HREF="index.php?page=">Text1</A><BR>
<A HREF="index.php?page=">Test2</a><BR>
</div></div>
<div><img src="plus.gif"><span class="folding">Folder</span>
<div style="list-style-image:url(list.gif);display:none" style=&{head};>
<A HREF="index.php?page=">Text1</A><BR>
<A HREF="index.php?page=">Test2</a><BR>
</div></div>

MacOS
Пожалуйста, не называйте JavaScript словом Java. Путаница получается.

У Вас скрипт, сделанный на проприетарных свойствах IE. Причем очень древний. Опера часть из них реализовывает, но полагаться на них не стоит, потому что большая часть их работает исключительно в IE.
Я бы посоветовал сделать две вещи:
1. Отказаться от использования document.all. Это можно сделать, перейдя на document.getElementById() - решение, подходящее для IE с 5 версии, либо даже расширить совместимость, написав функцию:

Выделить код

Код:

function gElId(eId)
{return ((document.getElementById)?document.getElementById(eId):((document.all)?document.all[eId]:null));}

и в дальнейшем обращаться уже к ней:

Выделить код

Код:

var obj1=gElId(obj1Id);

2. Лучший, на мой взгляд, способ написать ниспадающее или разворачивающееся меню - переключение классов.
Определяете классы:

Выделить код

Код:

<style type="text/css">
<!--
.menuShow .submenu { ... }
.menuHide .submenu {display: none;}
-->
</style>

в HTML что-то вроде

Выделить код

Код:

<div class="menuLine">
    <div class="menuHide" onmouseover="this.className=this.className.split('Hide').join('Show');" onmouseout="this.className=this.className.split('Show').join('Hide');">
        меню1
        <div class="submenu">
            подменю1
        </div>
    </div>
    <div class="menuHide" onmouseover="this.className=this.className.split('Hide').join('Show');" onmouseout="this.className=this.className.split('Show').join('Hide');">
        меню2
        <div class="submenu">
            подменю2
        </div>
    </div>
    <div class="menuHide" onmouseover="this.className=this.className.split('Hide').join('Show');" onmouseout="this.className=this.className.split('Show').join('Hide');">
        меню3
        <div class="submenu">
            подменю3
        </div>
    </div>
</div>

- или в обработчиках событий оформить отдельной функцией, типа

Выделить код

Код:

onmouseover="showThisMenu(this,true);" onmouseout="showThisMenu(this,false);"

И в JavaScript

Выделить код

Код:

<script type="text/javascript" language="javascript">
<!--
function showThisMenu(thisMenu,menuSwitch) {
    if(!thisMenu || !thisMenu.className) return false;
    if(menuSwitch)
        return thisMenu.className=thisMenu.className.split('Hide').join('Show');
    else
        return thisMenu.className=thisMenu.className.split('Show').join('Hide');
}
//-->
</script>

P.S. А почему MacOS, а пишете из-под Windows(R)?

Спасибо! Получается :) Приятно иметь дело с профессионалами.

P.S. А почему MacOS, а пишете из-под Windows(R)?

Это у меня в проекте, но их Safari так себе, особенно тот который вышел под PC, отображает все криво.

Столкнулся тут еще с такой проблемой.

Браузеры по разному понимаю события.

В Opere и Firefox нормально работает сочетание onmouseover \ onmouseout (но в IE меню дребезжит, т.е. когда ведешь мышь очень быстро открывается и закрывается)

В IE onmousemove \ onmouseout (однако в Опере такое же сразу закрывается).

А возможно ли повлиять на задержку этих обработчиков? Не удобно получается. Сделать примеру чтобы onmouseout начинал действовать когда пользователь отведет на достаточное расстояние

MacOS

но в IE меню дребезжит, т.е. когда ведешь мышь очень быстро открывается и закрывается

А причина такого поведения не заметна?

Azathoth

А причина такого поведения не заметна?

Та уже неважно. Просто написал разные обработчики в зависимости от типа броузера.

$menu="onmousemove"; $agent=getenv("HTTP_USER_AGENT"); if(strlen($agent)>2&&!strstr($agent,'IE')) {$menu="onmouseover";}