Почему бы вам просто не вложить первый уровень в один ul
и подменю внутри относительного li
..
<div class="MenuItems">
<ul>
<li><a href="">About</a></li>
<li><a href="">Hats</a>
<ul style="display:none">
<li><a href="">Big</a></li>
<li><a href="">Small</a></li>
</ul>
</li>
<li><a href="">Summer clothes</a></li>
</ul>
</div>
Ваш javascript для этого html должен быть
$('.MenuItems ul li').hover(
function() {
var $submenu = $(this).children('ul');
if ( $submenu.children('li').size() > 0) {
$submenu.show();
}
},
function() {
var $submenu = $(this).children('ul');
$submenu.hide();
}
);
// submenus handling moved outside of the menu handling to avoid repeated bounding of event
$('.MenuItems li > ul').hover(
function() {
$(this).show();
}, function() {
$(this).hide();
}
);
Вам также следует избегать связывания событий внутри других событий, потому что это приводит к (, если не тщательно контролируется ) повторной обработке событий.
Ваш код, например, будет привязывать метод к событию при наведении курсора каждый раз, когда выполняется подменю ul
. Если вы наводите / отменяете несколько раз, это связывает событие много раз и приводит к повторному вызову функции ( ухудшает производительность и повторяет код, который, скорее всего, должен быть запущен один раз при наведении .. )
пример на http://jsfiddle.net/gaby/4N2Gj/1/