2012-02-17 1 views
0

Я пытаюсь создать вертикальное меню прокрутки в боковой панели страницы с JQuery со следующим кодом: HTML:JQuery: ошибка в MouseEnter() MouseLeave() анимация

<ul class="side-menu"> 
<li id="menu1" ><a href="#">Item-1</a> 
    <ul class="inner-side-menu" id="menu1_inner"> 
     <li><a href="#">Sub-item</a></li> 
     <li><a href="#">Sub-item</a></li> 
     <li><a href="#">Sub-item</a></li> 
    </ul> 
</li> 
<li id="menu2"><a href="#">Item-2</a> 
    <ul class="inner-side-menu" id="menu2_inner"> 
     <li><a href="#">Sub-item</a></li> 
     <li><a href="#">Sub-item</a></li> 
     <li><a href="#">Sub-item</a></li> 
    </ul> 
</li> 
<li id="menu3"><a href="#">Item-3</a> 
    <ul class="inner-side-menu" id="menu3_inner"> 
     <li><a href="#">Sub-item</a></li> 
     <li><a href="#">Sub-item</a></li> 
     <li><a href="#">Sub-item</a></li> 
    </ul> 
</li> 
<li id="menu4"><a href="#">Item-4</a> 
    <ul class="inner-side-menu" id="menu4_inner"> 
     <li><a href="#">Sub-item</a></li> 
     <li><a href="#">Sub-item</a></li> 
     <li><a href="#">Sub-item</a></li> 
    </ul> 
</li> 

JQuery:

<script type="text/javascript"> 
$('#menu1').mouseenter(function(){ 
    $('#menu1_inner').show('slow'); 
}).mouseleave(function(){ 
    $('#menu1_inner').hide('slow'); 
}); 
//Similar for #menu2, #menu3 and #menu4 
</script> 

Я получил очень weired ошибку, в нормальном состоянии код работает хорошо, но если я взять курсор #menu1/2/3/4 и оставляет сразу, чем соответствующий #menu_inner, анимирует два или три раза, кажется, что он мультипликационный с таким же эффектом несколько раз, без ввода или ухода мыши.

Что на самом деле происходит здесь? и какое решение? p.s .: Я тестировал это в firefox 10, IE9, Maxthon 3 и Opera 11 с той же ошибкой.

+0

http://api.jquery.com/stop/ – j08691

ответ

2

Это происходит потому, что анимации поставлены в очередь, и они продолжают работать, если вы не решительно остановите их. Используйте метод stop, чтобы остановить предыдущие анимации.

$('#menu1').mouseenter(function(){ 
    $('#menu1_inner').stop(true, true).show('slow'); 
}).mouseleave(function(){ 
    $('#menu1_inner').stop(true, true).hide('slow'); 
}); 

stop(clearQueue, jumpToEnd) - Остановка текущего запущенного анимации на соответствующих элементов.

+0

Ну это хорошо работает. но могу ли я установить время начала анимации с этим? Я имею в виду, что 'stop' whole' menu_inner' открывается внезапно, это не очень хорошо для длинных списков, можно ли установить время для 'mouseenter', чтобы функция ждала 1 или секунды перед вызовами' show() '? Спасибо – Asif

+1

@Asif - Добавление таймера не будет хорошей идеей, но если вы хотите, вы можете использовать jQuery '.delay (timeInMilliseconds)' перед вызовом 'stop()'. – ShankarSangoli

+0

_Добавление таймера не будет хорошей идеей .. почему так? – Asif

0

вместо mouseenter и mouseleave функция u cud использование hover функция более изящно.

$('#menu1').hover(function() 
{$(this).fadeOut(100);$(this).fadeIn(500);}); 

вот official documentation with example

+1

Это не решит проблему, описанную в вопросе. 'hover' является просто сокращением для' mouseenter'/'mouseleave'. –

+0

Спасибо @Vivek, но у меня есть особые причины для использования 'mouseenter' и' mouseleave', так как я могу легко установить различные анимационные и эффектные тайминги для двух разных функций события мыши. – Asif