2010-10-29 5 views
0

J'ai un menu de navigation qui contient des sous-menus. En vol stationnaire, je veux que les sous-menus s'affichent après un second délai. Les éléments de menu marqués d'une classe de "plus" contiennent des sous-menus.Pourquoi firebug dit que mon appel de fonction est "indéfini"

Le problème est que l'une de mes fonctions appelée hoverCheck() revient indéfinie lorsqu'elle est appelée. Mais je ne peux pas comprendre pourquoi.

Voici mon code:

$(document).ready(function() { 
navigation(); 
}); 

function navigation() { 
var moreMenu = $('.nav li.more'); 
var hovering; 

function hoverCheck() { 
    hovering = 'hover'; 
    openMenu(); 
} 

function openMenu() { 
    if(hovering == 'hover') { 
    $(this).children('ul').slideDown('fast'); 
    } 
} 

moreMenu.mouseenter(function() { 
    setTimeout("hoverCheck()",1000); 
}); 
moreMenu.mouseleave(function() { 
    hovering = null; 
    $(this).children('ul').slideUp('fast'); 
}); 

} 

Répondre

4

Vous obtenez une erreur, car cette fonction ne définit pas la portée globale, au lieu que vous devriez faire ceci:

setTimeout(hoverCheck, 1000); 

En règle générale , essayez de toujours éviter de passer une chaîne à setTimeout(), donnez-lui directement une référence de fonction - sinon vous risquez de rencontrer des problèmes de portée, comme ceci :)

+0

Cela a fonctionné (au moins pour faire fonctionner la fonction hoverCheck.) J'ai d'autres problèmes, car le menu ne glisse pas, mais j'ai confirmé avec une alerte() qu'elle entre dans la fonction hoverCheck. ne jamais dire quand appeler une fonction avec les parenthèses et quand ne pas le faire .. Quel est le secret? – Ben

+0

@Ben - d'abord, essayez de ne jamais arriver dans une situation où vous passez une chaîne, alors les règles sont simples: parenthèses si vous voulez pour appeler la fonction * à droite puis *, sans eux vous passez la fonction elle-même, plutôt que le * résultat * (qui l'appelle vous obtiendra) de la fonction –

+0

Un peu plus clair, mais très boueux dans mon esprit encore. vous connaissez une bonne ressource en ligne qui explique cela en détail? BTW, je l'ai eu fonctionne maintenant, le problème était que j'avais un $ (cela) qui n'avait aucun sens dans la fonction externe. J'ai dû ajouter une classe temporaire à l'élément de liste plané et la référencer de cette façon. – Ben

0

La fonction setTimeout prend une expression comme premier argument, pas le nom d'une fonction. Si vous remplacez

setTimeout("hoverCheck()",1000); 

avec

setTimeout(function() {hoverCheck();}, 1000); 

qui pourrait faire l'affaire.

+0

Il n'y a pas besoin d'une fonction anonyme ici, voir ma réponse pour une façon beaucoup plus concise (et plus efficace) de le faire. –

+0

Aw, trop lent. Je suppose que vous n'avez pas non plus besoin du wrapper "function". –

+0

Man. WAY trop lent! Comme je l'ai commenté @Nick m'a corrigé! –

Questions connexes