11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour, voici une fonction récursive qui cache les éléments ul contenus au sein du li passé en paramètre.

function closeSubMenu(li)
{
	for(var i = 0; i < li.childNodes.length; i++)
	{
		if(li.childNodes[ i].nodeType == 1 && li.childNodes[ i].nodeName.toLowerCase() == 'ul')
		{
			for(var j = 0; j < li.childNodes[ i].childNodes.length; j++)
			{
				if(li.childNodes[ i].childNodes[j].nodeType == 1 && li.childNodes[ i].childNodes[j].nodeName.toLowerCase() == 'li')
				{
					if(closeSubMenu(li.childNodes[ i].childNodes[j])) continue;
				}
			}
			li.childNodes[ i].style.display = 'none';
		}
	}
	return true;
}


En gros dans une boucle sur les childNodes d'un ul j'ai if(closeSubMenu(menu.childNodes[ i])) continue; et un petit peu plus bas j'ai un menu.childNodes[ i].childNodes[j].style.display = 'block' (<-ul)

Mon problème c'est que le script ignore "continue" et donc ça ferme le bloc qui s'ouvre (<-ul).

C'est toujours difficile d'être clair. Mais ma question se résume surtout à : comment faire pour que le code "attende" l'exécution complète d'une fonction récursive. Apparement avec if(COND) continue; ça ne l'empêche pas de traiter la suite du code ce qui est "chronologiquement" ennuyeux.
ATTENTION : Je n'ai pas prêté grande attention à ton code faute de temps. aussi je ne te dirai pas ce que tu dois faire dans ce cas précis.

En revanche, je peux répondre à ta question :

"comment faire pour que le code attende l'exécution d'une fonction récursive"

En oblitérant tous les abus de langage de cette formule...

Et bien il suffit de setter une variable globale quand tu entres dans la fonction de la resetter quand tu en sorts.
Puis, dans le corps de l'appelant de boucler en test sur la valeur de cette variable globale.
tu peux raffiner en faisant un tableau de variables globales indicées sur une variable d'incrément de boucle ou toute autre chose. Ce n'est pas mal parfois pour tracer d'éventuels problèmes d'overflow auxquels les fonctions réentrantes conduisent parfois.
Bonjour,

Tout comme aCOSwt, je n'ai pas vraiment le temps de me plonger dans ton code, que je ne comprends pas vraiment. Cependant :

- Tester que "nodeType" est à 1 est inutile, puisque nodeName sera de toute façon "#text" pour un noeud texte (et en plus, ça ne marche pas avec IE 5).
- Au lieu d'écrire "li.childNodes[ i].childNodes[j]" dans ta boucle imbriquée, tu gagnerais à stocker "li.childNodes[ i]" dans une variable.
- Pourquoi écris-tu "if(closeSubMenu(li.childNodes[ i].childNodes[j]))" alors que closeSubMenu retourne toujours "true" ?
- Est-ce que tu as bien compris la fonction du mot-clé "continue" ? Je ne pense pas, puisque tel que tu l'as utilisé, il ne sert strictement à rien. Il permet de passer à l'itération suivante de la première boucle l'englobant.
Modifié par Eldebaran (12 Dec 2006 - 10:41)
Ben j'imaginais que tant que la fonction ne retournait pas true ça continuais pas la boucle. Et comme, j'ai des if(true) continue dans cette même fonction j'imaginais que ça n'allait pas continuer mon code tant que la récurrence n'était pas achevée.