pb lors de l'affichage d'un menu sous FF mais pas sous IE

Eléphant du PHP | 360 Messages

28 mars 2006, 11:19

Bonjour,

Pour améliorer l'esthétique d'un menu, je joue grâce à javascript (onmouseover) et css (display), pour faire s'afficher ou non les sous menus du menu survolé.
Jusque là aucun problème. Sous IE tout fonctionne niquel, mais sous FF, a chaque fois que je survole un menu, il m'affiche les sous menus, et dès que je vais sur un autre menu (il me ferme le premier comme demandé), il me rajoute une ligne vide (en fait le menu est dans un tableau et j'ai l'impression qu'il me rajoute une ligne avec une cellule à chaque fois).
Donc si je m'amuse à passer d'un menu à un autre plusieurs fois, il m'affiche bien à chaque fois les sous menus correspondants, mais il me rajoute énormément de ligne vide entre chaque menu ... Je me retrouve vite avec un menu qui fait 15m de haut.

Le code du menu dynamique qui doit s'afficher :
<?PHP
      $query = "SELECT m.id_menu, COUNT(am.sous_menu) AS nombre
			FROM affecter_menu am, menus m
			WHERE m.id_menu = am.menu
				AND (am.droit >= '".$Right."')
				AND (m.apparition_menu = 'G')
			GROUP BY m.id_menu, m.libelle_menu";
$result=odbc_do($connexion, $query);
$i = 0;
$chaine_pr_js = "'";
while (odbc_fetch_into($result, $ligne))
{
	$identifiant_menu[$i] = $ligne[0];
	$nombre_menu[$i] = $ligne[1];
	$chaine_pr_js .= $identifiant_menu[$i]."!".$nombre_menu[$i]."*";
	$i++;
}
$chaine_pr_js .= "'";

$cpt_menu = $i - 1;

$query="SELECT m.id_menu, m.libelle_menu, sm.libelle_sous_menu, sm.lien, sm.valeur_var, photo
		FROM menus m INNER JOIN
             affecter_menu am ON m.id_menu = am.menu INNER JOIN
             sous_menu sm ON am.sous_menu = sm.id_sous_menu
		WHERE (m.apparition_menu = 'G') AND (am.droit >= '".$Right."')
		ORDER BY m.ordre_menu, am.ordre_sous_menu;"; // Requete sortant toutes les pages dont l'accès est autorisé
$result=odbc_do($connexion, $query);
$menu="";

while (odbc_fetch_into($result, $ligne)) // Execution de la requête permettant d'afficher toutes les pages
{
	if ($menu=="" || $menu!==$ligne[0])
	{
		$cpt_max = "";
		$i = 0;
		$menu = $ligne[0];
		for ($j = 0; $j <= $cpt_menu; $j++)
		{
			if ($identifiant_menu[$j] == $menu)
				$cpt_max = $nombre_menu[$j];
		}
?>
<TR>
	<TD ALIGN="center"><HR ALIGN="center" WIDTH="140" COLOR="black">
	</TD>
</TR>
<TR>
	<TD ALIGN="center" CLASS="gray" ONMOUSEOVER="montrer_menu(<? echo $menu.",".$cpt_max.",".$chaine_pr_js.",".$cpt_menu; ?>)"><? echo $ligne[1]; ?></TD>	<!--	affichage des menus	-->
</TR>
<TR>
	<TD><HR ALIGN="center" WIDTH="110" COLOR="orange">
	</TD>
</TR>
<?
	}
?>
<TR CLASS="masque" ID="<? echo $menu."_".$i; ?>">
	<TD ALIGN="center" CLASS="menu"><A HREF="
<?
	echo rtrim($ligne[3]);
	if ($ligne[4] != "")
	{
		echo "?var=".$ligne[4];
	}
?>"
<?
if ($ligne[3] != "index.php" && $ligne[4] == "")
	echo " TARGET='_blank'";
?>>
<? echo $ligne[2]; ?></A>
</TD><!--	affichage des sous menus	-->
</TR>
<?
	$i++;
}
?>
Le code de ma fonction javascript :

Code : Tout sélectionner

function montrer_menu(menu, cpt_max, chaine, cpt_menu) { var id_menu; var nb_menu; var compteur; var i; var j; compteur = cpt_max; var tableau = chaine.split ("*"); i = 0; while (tableau[i] != "undefined" && tableau[i] != "") { var id = tableau[i].split ("!"); for (j = 0; j < id[1]; j++) { id_menu = id[0] + "_" + j; document.getElementById(id_menu).style.display = "none"; } i++; } for (i = 0; i < compteur; i++) { id_menu = menu + "_" + i; document.getElementById(id_menu).style.display = "block"; } }
le code css correspondant à la balise <tr> :

Code : Tout sélectionner

tr.masque { display: none; }
Merci d'avance