Страницы: 1
Его пример можно найти здесь:
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
Но это только первая ошибка из которой все остальное вытекает...
Отредактировано Azathoth (12-08-2007 17:00:52)
...она старалась, чтобы я больше времени проводил в разных пионерлагерях и группах продлённого дня - кстати сказать, удивительную красоту последнего словосочетания я вижу только сейчас. (c) Виктор Пелевин
Отсутствует
Я ведь не кодер на 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.
Отредактировано Azathoth (12-08-2007 18:55:18)
...она старалась, чтобы я больше времени проводил в разных пионерлагерях и группах продлённого дня - кстати сказать, удивительную красоту последнего словосочетания я вижу только сейчас. (c) Виктор Пелевин
Отсутствует
Ясно, а что скажете насчет этого скрипта, этот работает везде вроде как:
http://jscook.yuanheng.org/JSCookMenu/tutorial.html
Это все конечно хорошо, W3, стандарты DOM, но я ищу готовое решение, иначе мне придется нанимать профессионального программиста.
Отредактировано MacOS (12-08-2007 19:40:54)
Отсутствует
На что заменить document.all?
document.getElementById(id) ?
«I actually hate programming, but I love solving problems» © Rasmus Lerdorf, PHP's Creator
Отсутствует
MacOS
Может на вскидку что-то скажете. Как быстро заставить его открыватся.
Быстро не получится. Тут нужно все переписывать.
Могу в помочь, но мне нужен полный исходник.
...она старалась, чтобы я больше времени проводил в разных пионерлагерях и группах продлённого дня - кстати сказать, удивительную красоту последнего словосочетания я вижу только сейчас. (c) Виктор Пелевин
Отсутствует
Вот полный текст, его лучше сюда скопировать, поскольку на ресурсе где исходник он вообще не правильно представлен, его пришлось из рабочего примера выдирать.
Т.е., он вот, и я его никак не изменял, в 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));}
и в дальнейшем обращаться уже к ней:
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>
- или в обработчиках событий оформить отдельной функцией, типа
И в 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 (13-08-2007 15:18:07)
Отсутствует
MacOS
но в IE меню дребезжит, т.е. когда ведешь мышь очень быстро открывается и закрывается
А причина такого поведения не заметна?
...она старалась, чтобы я больше времени проводил в разных пионерлагерях и группах продлённого дня - кстати сказать, удивительную красоту последнего словосочетания я вижу только сейчас. (c) Виктор Пелевин
Отсутствует
Azathoth
А причина такого поведения не заметна?
Та уже неважно. Просто написал разные обработчики в зависимости от типа броузера.
$menu="onmousemove"; $agent=getenv("HTTP_USER_AGENT"); if(strlen($agent)>2&&!strstr($agent,'IE')) {$menu="onmouseover";}
Отсутствует
Страницы: 1