Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Инициируется событие onmouseout блока <li></li> тогда, когда мышь еще не уходит с блока <li></li>
 
 автор: SilentChild   (08.06.2011 в 16:36)   письмо автору
 
 

Здравствуйте, уважаемые программисты!


Есть следующий HTML-код для отображения меню и подменю:

стили

<style>
ul.menu {
    list-style:none;
}
ul.menu li {        
    position:relative;
    float:left;    
    border:1px solid;    
}
ul.menu ul {        
    position:absolute;
    top:19px;    
    left:0;    
    display:none;            
    list-style:none;
    margin:0px;
    padding:0px;    
}
ul.menu ul li {
    position:relative;
    clear:left;
    width:100px;    
}
ul.menu li a {
    padding:3px;
}
</style>


меню

<body> 

<ul id="menu" class="menu">
  <li><a href="#">menu 1</a></li>  
  <li><a href="#">menu 2 (drop)</a>
    <ul>      
      <li><a href="#">submenu 1</a></li>
      <li><a href="#">submenu 2</a></li>                   
    </ul>
  </li>
  <li><a href="#">menu 3</a></li>  
</ul> 

</body>


Есть два скрипта, которые должны выполнять одну и ту же задачу (открывать / закрывать подменю). Применить к HTML-документу можно один из этих скриптов. Скрипт №1 работает хорошо, а вот Скрипт №2 работает как-то не удовлетворительно.


скрипт №1

<script type="text/javascript">
function func(f) 
{
    var ul = document.getElementById('menu').getElementsByTagName('ul')[0];
    if (f) {        
        ul.style.display = 'block';                                                        
    } else {        
        ul.style.display = 'none';                              
    }    
}
var li = document.getElementById('menu').getElementsByTagName('ul')[0].parentNode;
li.onmouseover = new Function("func(true);");
li.onmouseout = new Function("func();");
</script>


скрипт №2

<script type="text/javascript">
var inVal;

function menu_open() 
{
    var ul = document.getElementById('menu').getElementsByTagName('ul')[0];
    ul.style.display = 'block';        
    clearInterval(inVal);
}

function menu_close() 
{
    var ul = document.getElementById('menu').getElementsByTagName('ul')[0];
    ul.style.display = 'none';    
    clearInterval(inVal);    
}

function func(f)
{       
    if (f) {        
        inVal = setInterval('menu_open()', 10);                                                            
    } else {        
        inVal = setInterval('menu_close()', 10);                              
    }        
}

var li = document.getElementById('menu').getElementsByTagName('ul')[0].parentNode;
li.onmouseover = new Function("func(true);");
li.onmouseout = new Function("func();");
</script>


С использованием второго скрипта возникает следующая проблема:
1. Наводим указатель мыши на Menu 2 (drop);
2. Появляется подменю;
3. Когда переводим указатель мыши на открывшееся подменю, то сценарий скрывает подменю, т.е. инициируется событие убирания указателя мыши с <li>menu 2 (drop)</li>.

Почему исчезает подменю?
Фактически, блок подменю находится в блоке <li>menu 2 (drop)</li> и получается, что указатель мыши не уходит с блока <li></li>, а следовательно, событие onmouseout применяемое к <li>menu 2 (drop)</li> инициироваться не должно. Почему оно инициируется во втором сценарии и не инициируется в первом?

  Ответить  
 
 автор: Ильдар   (08.06.2011 в 21:14)   письмо автору
 
   для: SilentChild   (08.06.2011 в 16:36)
 

я бы тебе посоватовал переходить на jquery, ато слишком много кода приходится писать.

  Ответить  
 
 автор: SilentChild   (22.06.2011 в 15:17)   письмо автору
 
   для: Ильдар   (08.06.2011 в 21:14)
 

Спасибо, обязательно перейду, но все таки хочется докопаться до сути. Почему же инициируется событие, когда оно не должно инициироваться. Что-то с setInterval()`ом связано, наверняка. Эта проблема не дает мне "спокойно спать" уже очень долгое время.

  Ответить  
 
 автор: AlexSol   (22.06.2011 в 15:57)   письмо автору
 
   для: SilentChild   (22.06.2011 в 15:17)
 

события надо перехватывать. внутри <li> есть тег <a>. когда наводите на ссылку, то уходите с <li> с срабатывает закрытие

  Ответить  
 
 автор: SilentChild   (22.06.2011 в 16:09)   письмо автору
 
   для: AlexSol   (22.06.2011 в 15:57)
 

Благодарю Вас, AlexSol! =)

  Ответить  
 
 автор: neokortex   (23.06.2011 в 01:03)   письмо автору
 
   для: SilentChild   (22.06.2011 в 16:09)
 

я тоже посоветую вам jquery - сам не так давно перешел. с ним гораздо удобнее писать скрипты

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования