par
Snoops » 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> :
Merci d'avance
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]
<?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++;
}
?>[/php]
Le code de ma fonction javascript :
[code]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";
}
}[/code]
le code css correspondant à la balise <tr> :
[code]tr.masque
{
display: none;
}[/code]
Merci d'avance