2009-10-28 3 views
0

Je rencontre des problèmes avec la méthode jQuery hover.

Voici le code JavaScript concerné:

$("#navigation > li > ul").hide(); 
$("#navigation > li").hover(
    function() { 
     $(this).children("ul").slideDown(125); 
    }, 
    function() { 
     $(this).children("ul").slideUp(125); 
    } 
); 

est ici le code HTML correspondant:

<ul id="navigation"> 
    <li><a href="#">Top Level Item #1</a></li> 
    <li> 
     <a href="#">Top Level Item #2</a> 
     <ul> 
      <li><a href="#">Sub-Menu Item #2-1</a></li> 
      <li><a href="#">Sub-Menu Item #2-2</a></li> 
      <li><a href="#">Sub-Menu Item #2-3</a></li> 
     </ul> 
    </li> 
</ul> 

Chaque fois que vous mouseover un élément de niveau supérieur, le sous-menu en elle (le cas échéant) chutera vers le bas avec un joli effet de glissade rapide. Le problème est lorsque vous faites glisser votre souris dans le menu rapidement et gardez votre souris où le menu serait mais ne l'a pas encore atteint: le menu atteindra alors la "fin" de l'animation mouseover et rebondira vers le caché état, et répétez jusqu'à ce que vous supprimiez la souris d'où le menu déroulant serait.

+0

Si je comprends bien le problème, il est parce que la deuxième fonction dans votre appel en vol stationnaire (celui qui est appelé lorsque le pointeur quitte l'élément correspondant) est appelé lorsque vous entrez dans le sous-menu. – inkedmn

+0

Existe-t-il un moyen d'empêcher cela? Je suis encore très nouveau le jQuery, puis-je le forcer à ne pas "mettre en file d'attente" la 2ème fonction de hover jusqu'à ce que le 1er ait fini? – Zack

Répondre

5

peut-être ajouter un contrôle dans la fonction mouseout pourrait aider:

if(!$(this).children("ul").is(":animated")){ 
    $(this).children("ul").slideUp(125); 
} 
+0

Vous da man! Cela a fonctionné, merci beaucoup! – Zack

+0

Je suis content d'avoir pu aider :) – Seb

0

Vous pouvez essayer d'utiliser hoventIntent, un plugin jQuery qui aide à détecter l'intention d'un utilisateur planant au-dessus des éléments.

http://cherne.net/brian/resources/jquery.hoverIntent.html

J'ai modifié votre exemple avec lui et il semble se comporter beaucoup plus agréable. J'ai ajouté:

<script type="text/javascript" language="JavaScript" src="jquery.hoverIntent.minified.js"></script> 

et modifié la seule ligne avec vol stationnaire() à:

$("#navigation > li").hoverIntent(

Je ne pouvais pas à rebondir, et il se sentait plus comme un menu popout avec le comportement hoverIntent appliqué .

Enfin, vous pouvez essayer d'utiliser l'un des plug-ins de menu jQuery pré-construit comme ils l'ont fait tout ce travail pour vous déjà :)

+0

Je devrai me pencher davantage sur les plug-ins une fois que j'aurai une bonne connaissance de jQuery, je suis encore en train de réinventer la roue pour comprendre le pourquoi et le comment d'un peu mieux . Merci pour la suggestion, je l'ai déjà marqué:> – Zack

+0

Bonne méthode d'apprentissage! – wojo