11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour !

J'ai un problème avec un menu javascript qui a été posté sur votre forum dans la section des scripts utiles.

Le code en question est le suivant :


<script type="text/javascript" >
var drawerMenu = {
	inc : 5,
	elements : new Array,
	timers : new Array,
	construct : function()
	{
		var dls = document.getElementsByTagName('dl');
		var n = 0;
		for(var i = 0; i < dls.length; i++)
		{
			if(dls[ i].className == 'menu')
			{
				n++;
				drawerMenu.timers[n] = 0;
				dls[ i].onmouseover = drawerMenu.triggerShow;
				dls[ i].onmouseout = drawerMenu.triggerHide;
				dls[ i].targetElement = n;
				for(var j = 0; j < dls[ i].childNodes.length; j++)
				{
					if(dls[ i].childNodes[j].nodeType == 1)
					{
						if(dls[ i].childNodes[j].tagName == 'DD')
						{
							dls[ i].childNodes[j].style.position = 'relative';
							dls[ i].childNodes[j].style.overflow = 'hidden';
							dls[ i].childNodes[j].style.height = '0px';
							for(var k = 0; k < dls[ i].childNodes[j].childNodes.length; k++)
							{
								if(dls[ i].childNodes[j].childNodes[k].nodeType == 1)
								{
									if(dls[ i].childNodes[j].childNodes[k].tagName == 'UL')
									{
										drawerMenu.elements[n] = dls[ i].childNodes[j].childNodes[k];
										dls[ i].childNodes[j].childNodes[k].style.position = 'absolute';
										dls[ i].childNodes[j].childNodes[k].style.top = '-'+dls[ i].childNodes[j].childNodes[k].offsetHeight+'px';
									}
								}
							}
						}
					}
				}
			}
		}
	},
	triggerShow : function()
	{
		if(drawerMenu.timers[this.targetElement]) clearInterval(drawerMenu.timers[this.targetElement]);
		drawerMenu.timers[this.targetElement] = setInterval('drawerMenu.show('+this.targetElement+')', 30);
	},
	triggerHide : function()
	{
		if(drawerMenu.timers[this.targetElement]) clearInterval(drawerMenu.timers[this.targetElement]);
		drawerMenu.timers[this.targetElement] = setInterval('drawerMenu.hide('+this.targetElement+')', 40);
	},
	show : function(i)
	{
		var ul = drawerMenu.elements[ i];
		var t = parseInt(ul.style.top);
		var inx = Math.ceil(-t/drawerMenu.inc);
		if(t+inx < 0)
		{
			ul.style.top = (t+inx) +'px';
			ul.parentNode.style.height = (ul.offsetHeight+t+inx) + 'px';
		}
		else if(t < 0)
		{
			ul.style.top = '0px';
			ul.parentNode.style.height = ul.offsetHeight + 'px';
		}
		else
		{
			clearInterval(drawerMenu.timers[ i]);
			drawerMenu.timers[ i] = 0;
		}
	},
	hide : function(i)
	{
		var ul = drawerMenu.elements[ i];
		var t = parseInt(ul.style.top);
		var inx = Math.ceil(t/drawerMenu.inc);
		if(inx == 0) inx = -1;
		if(t+inx > -ul.offsetHeight)
		{
			ul.style.top = (t+inx) +'px';
			ul.parentNode.style.height = (ul.offsetHeight+t+inx) + 'px';
		}
		else if(t > -ul.offsetHeight)
		{
			ul.style.top = -ul.offsetHeight + 'px';
			ul.parentNode.style.height = '0px';
		}
		else
		{
			clearInterval(drawerMenu.timers[ i]);
			drawerMenu.timers[ i] = 0;
		}
	}
}

window.onload = drawerMenu.construct;


A dire vrai, le problème ne vient pas vraiment du javascript en lui même (raison pour laquel j'ai hésité à poster dans la section XHTML).

Voilà mon problème :
J'utilise ce code pour un menu composé de rubriques et sous rubriques.
Cependant, certaines rubriques ne comportent parfois aucune sous rubrique.

Voilà le code de mise en page :


<?php
	//On récupère toutes les catégories et leur titre
	$datacat = mysql_query ('SELECT cat_id, cat_titre FROM site_categorie ORDER BY cat_ordre') or die (mysql_error());
	
	//On lance une boucle while qui affiche toutes les catégories
	while($requetecat = mysql_fetch_array($datacat))
	{
	?>
	<dl class="menu">
	<a href="index.php?cat=<?php echo $requetecat['cat_id'] ;?>"><dt><?php echo $requetecat['cat_titre'] ;?></dt></a>
	<?php
		//On récupère les rubriques appartenants au catégories respectives
		$nbrRub = mysql_result(mysql_query('SELECT COUNT(*) FROM site_rubrique WHERE rub_cat_id = "'.$requetecat['cat_id'].'"'), 0);
		$datarub = mysql_query('SELECT rub_titre, rub_id
		FROM site_categorie
		LEFT JOIN  site_rubrique ON site_categorie.cat_id = site_rubrique.rub_cat_id
		WHERE site_categorie.cat_id = "'.$requetecat['cat_id'].'"
		ORDER BY site_rubrique.rub_ordre') or die (mysql_error());
		if($nbrRub == 0)
		{
			$maxSize = "style=max-height:0px;";
		}		
		?>
		<dd>
			<ul <?php echo $maxSize;?>>
			<?php
			//On lance une boucle while qui affiches toutes les rubriques appartenant à la catégorie
			while($requeterub = mysql_fetch_array($datarub))
			{
			?>
			<li><a href="index.php?cat=<?php echo $requetecat['cat_id'] ;?>&rub=<?php echo $requeterub['rub_id'] ;?>"><?php echo $requeterub['rub_titre'] ;?></a></li>
			<?php
			}
			?>
			</ul>
		</dd>
	</dl>
	<?php
	}	
?>  


Pour les rubriques ne possèdant pas de sous rubriques, j'ai essayé de "tricher" afin que le contenu de la balise <dl> ne s'affiche pas (puisque vide) en ajoutant :

if($nbrRub == 0)
		{
			$maxSize = "style=max-height:0px;";
		}		
		?>
		<dd>
			<ul <?php echo $maxSize;?>>


Cette astuce marche parfaitement sous firefox mais pas sous internet explorer(étrange ? Smiley langue ).

J'avoue ne pas voir comment procéder autrement.

Ce pourquoi je solicite votre aide =)

Je vous remercie par avance pour votre aide !
Modifié par black (11 Nov 2008 - 17:05)
Problème réglé,
j'ai utilisé mootools.

Accordion + event avec un fireclick, ça marche parfaitement ^^


Le JS

<script type="text/javascript" src="../mootools.js"></script>
	
<script type="text/javascript" >
<!--
window.addEvent('domready', function() {		
	//create our Accordion instance
	var myAccordion = new Accordion($('accordion'), 'h1.toggler', 'div.element', {
		opacity: false,
		onActive: function(toggler, element){
			toggler.setStyle('color', '#41464D');
		},
		onBackground: function(toggler, element){
			toggler.setStyle('color', '#528CE0');
		}	
	});	
	//make it open on hover  
	$$('.toggler').addEvent('mouseenter', function() { this.fireEvent('click'); });  
});
	
//-->
</script>


Le php

<div id="accordion">
	<a href="index.php"><h1 class="toggler">Index</h1></a>
	<div class="element"></div>
<?php
	//On récupère toutes les catégories et leur titre
	$datacat = mysql_query ('SELECT cat_id, cat_titre FROM site_categorie ORDER BY cat_ordre') or die (mysql_error());
	
	//On lance une boucle while qui affiche toutes les catégories
	while($requetecat = mysql_fetch_array($datacat))
	{
	?>
	<a href="index.php?cat=<?php echo $requetecat['cat_id'] ;?>"><h1 class="toggler"><?php echo $requetecat['cat_titre'] ;?></h1></a>
	<?php
		//On récupère les rubriques appartenants au catégories respectives		
		$datarub = mysql_query('SELECT rub_titre, rub_id
		FROM site_categorie
		LEFT JOIN  site_rubrique ON site_categorie.cat_id = site_rubrique.rub_cat_id
		WHERE site_categorie.cat_id = "'.$requetecat['cat_id'].'"
		ORDER BY site_rubrique.rub_ordre') or die (mysql_error());
		$nbrRub = mysql_result(mysql_query('SELECT COUNT(*) FROM site_rubrique WHERE rub_cat_id = "'.$requetecat['cat_id'].'"'), 0);
		
		if($nbrRub != 0)
		{
		?>
		<div class="element">
		<?php
		//On lance une boucle while qui affiches toutes les rubriques appartenant à la catégorie
		while($requeterub = mysql_fetch_array($datarub))
		{
		?>
		<h2><a href="index.php?cat=<?php echo $requetecat['cat_id'] ;?>&rub=<?php echo $requeterub['rub_id'] ;?>"><?php echo $requeterub['rub_titre'] ;?></a></h2>				
		<?php
		}
		?>
		</div>
		<?php
		}
		else //Obligatoire sinon le script plante
		{
		?>
			<div class="element"></div>
		<?php
		}
	}	
?>
	</div>


PS : si vous avez qd même des idées pour améliorer le code n'hésitez pas à m'en faire part =)
Encore merci !
Modifié par black (11 Nov 2008 - 17:11)