2009-09-22 8 views
2

Je travaille sur un menu déroulant jQuery qui apparaît lorsque vous passez la souris sur les éléments de niveau supérieur. Je veux le régler de telle sorte que lorsque vous déplacez la souris, le menu ne disparaît pas instantanément. J'ai ce code:Quitter le menu jQuery après un délai

$(document).ready(function(){ 
    $('ul#menu > li').hover(
    // mouseover 
    function(){ 
     $(this).find('>ul').fadeIn('fast'); 
    }, 
    // mouseout 
    function(){ 
     setTimeout(function(){ 
     alert('fadeout'); 
     $(this).find('>ul').fadeOut('fast') 
     }, 1000); 
    } 
); 
}); 

Après une seconde alerte se produit, mais le menu est pas estompé. Window.setTimeout(), donc cela fait référence à l'objet fenêtre.

+0

Je pensais juste, cela pourrait être parce que « ce » points à autre chose dans la fonction 'setTimeout'? – DisgruntledGoat

+0

Oui, c'est correct. Vous obtenez la fenêtre. – user120242

+0

Vous pouvez utiliser '.children ('ul')' au lieu de '.find ('> ul')' btw. –

Répondre

3

// mouseout 
function(){ 
    var el=this; 
    setTimeout(function(){ 
    alert('fadeout'); 
    $(el).find('>ul').fadeOut('fast') 
    }, 1000); 
} 
+0

Décidé d'aller avec une solution similaire à cela, merci! – DisgruntledGoat

3

Regardez hoverIntent. Il vous donnera un meilleur contrôle du comportement des mouseover/mouseout événements par configuration:

var config = {  
    sensitivity: 3, // number = sensitivity threshold (must be 1 or higher)  
    interval: 200, // number = milliseconds for onMouseOver polling interval  
    timeout: 500, // number = milliseconds delay before onMouseOut  
}; 

$(document).ready(function(){ 
    $('ul#menu > li').hoverIntent(
    // mouseover 
    function(){ 
     $(this).find('>ul').fadeIn('fast'); 
    }, 
    // mouseout 
    function(){ 
     $(this).find('>ul').fadeOut('fast'); 
    } 
); 
}); 
+0

Cela semble plutôt cool, merci! J'ai un problème cependant: je veux le délai d'attente quand je m'éloigne complètement du menu, mais si je passe d'un élément de menu à l'autre, je veux désactiver l'ancien menu instantanément - est-ce possible? – DisgruntledGoat

+1

Utilisez .stop (true, true): http://docs.jquery.com/Effects/stop – user120242

+0

Hmm, je ne sais pas si c'est ce dont j'ai besoin. Ce que je voulais dire, c'est que je veux supprimer le délai avant que chaque menu n'apparaisse, si le menu est déjà ouvert. Ainsi, le tout premier mouseover aurait un court délai (pour empêcher l'ouverture du menu lors du brossage). Mais si un menu est ouvert, le passage au menu suivant l'afficherait instantanément sans le délai. – DisgruntledGoat

Questions connexes