Bonjour,

Mon site actuel XHTML et CSS + un peu de javascript pour la sélection de la langue et pour le menu déroulant est réalisé avec des frames.

Le menu est basé sur votre tutoriel

et mentionné dans la page d'accueil de mon site.

Je suis en train de le refaire en abandonnant la structure en cadres et en utilisant PHP et des 'include'.
Le problème est que, à chaque chargement d'une page, le menu se referme du fait du rechargement de la page.

Je viens de découvrir le tutoriel "Créer un menu "accordéon" avec jQuery :

permettant, notamment, de garder un sous-menu ouvert; c'est la réponse à mon problème.

Problème:
Avec l'un ou l'autre des ficiers javascript désactivé, le menu apparait complètement déroulé, c'est normal.
Lorsque les fichiers javascript sont actifs, le menu est fermé, mais impossible à ouvrir. En effet, il n'y a pas de lien sur l'élément de liste (Pyrénées 2004) contenant le sous-menu.

Où se situe le problème ? Je peux supposer que cela a un rapport avec li.open et li.toogleSubMenu mais je ne sais comment agir avec ces éléments (trop débutant).

Voici le fichier "index.php"

<?php
//Ouverture session
session_start();
if ( empty( $_SESSION['langue']))
$_SESSION['langue'] = 'fr';
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
   <title>Randonnées</title>
   <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
   <link rel="stylesheet" type="text/css" media="screen" href="style.css" />
   <link rel="stylesheet" type="text/css" media="screen" href="menu.css" />
   <script type="text/javascript" src="jquery-1.2.1.js"></script>
   <script type="text/javascript" src="menu.js"></script>
</head>
<body>
<div id="gauche">
  <div id="langue">
    <form method="post" action="index.php">
      <p>Langue - lengua : <br />
        <input type="radio" name="langue" value="fr" id="fr" /><label for="fr"> Français</label><br />
        <input type="radio" name="langue" value="es" id="es" /><label for="es"> Espagnol</label><br />   
        <input type="submit" name="submit" /></p>     
    </form>
   </div>
   <div id="menu">
     <?php
       if ( isset($_POST['submit'] ))
          { $_SESSION['langue'] = $_POST['langue']; }
         if ( $_SESSION['langue'] == 'fr' ) 
               include ("pages/menus/menu_fr.php");
     elseif ( $_SESSION['langue'] == 'es' ) 
               include ("pages/menus/menu_es.php");
     ?> 
  </div>		
</div>	    
    <!-- Appel des pages -->	
<div id="corps">
  <?php
    $page = $_GET['page'];
      if (file_exists("pages/$page.htm") == TRUE)
        {include("pages/$page.htm");}
    else {include("pages/intros/accueil.htm");}
  ?>
</div>
</body>
</html>


Voici "menu.js" (intégralement repris de votre tutoriel):

$(document).ready( function () {
    // On cache les sous-menus
    // sauf celui qui porte la classe "open_at_load" :
    $(".navigation ul.subMenu:not('.open_at_load')").hide();
    // On sélectionne tous les items de liste portant la classe "toggleSubMenu"
    // et on remplace l'élément span qu'ils contiennent par un lien :
    $(".navigation li.toggleSubMenu span").each( function () {
        // On stocke le contenu du span :
        var TexteSpan = $(this).text();
        $(this).replaceWith('<a href="" title="Afficher le sous-menu">' + TexteSpan + '<\/a>') ;
    } ) ;
    // On modifie l'évènement "click" sur les liens dans les items de liste
    // qui portent la classe "toggleSubMenu" :
    $(".navigation li.toggleSubMenu > a").click( function () {
        // Si le sous-menu était déjà ouvert, on le referme :
        if ($(this).next("ul.subMenu:visible").length != 0) {
            $(this).next("ul.subMenu").slideUp("normal", function () { $(this).parent().removeClass("open") } );
        }
        // Si le sous-menu est caché, on ferme les autres et on l'affiche :
        else {
            $(".navigation ul.submenu").slideUp("normal", function () { $(this).parent().removeClass("open") });
            $(this).next("ul.subMenu").slideDown("normal", function () { $(this).parent().addClass("open") } );
        }
        // On empêche le navigateur de suivre le lien :
        return false;
    });
} ) ;


Voici une partie de "menu.php", correspondant à 'Pyrénées 2004', et structuré comme suggéré dans l'article avec la classe "toogleSubMenu". Je n'utilise aucune image.


<ul class="navigation">
  <li><a href="index.php?page=intros/accueil">Page d'accueil</a></li>
  <li class="toogleSubMenu"><span>Pyrénées 2004</span>
    <ul class="subMenu">
      <li><a href="index.php?page=cg2004/cg_fr/p1c_fr">Canigou</a></li>
      <li><a href="index.php?page=cg2004/cg_fr/p2c_fr">Canigou</a></li>
      <li><a href="index.php?page=cg2004/cg_fr/p3c_fr">Suite</a></li>
      <li><a href="index.php?page=cg2004/cg_fr/p4c_fr">Suite</a></li>
      <li><a href="index.php?page=cg2004/cg_fr/p5c_fr">Brèche de Roland</a></li>
      <li><a href="index.php?page=cg2004/cg_fr/p6c_fr">Suite</a></li>
   </ul>
  </li>
  <li><a href="index.php?page=liens">Quelques liens</a></li>
</ul>


Merci d'avance pour votre aide.

Zénobe
Salut,

Je ne sais pas si tu as fait un copier/coller de ton code, mais dans ton menu, il y a :
<li class="[b]toogleSubMenu[/b]"><span>...
ça devrait mieux marcher avec "toggleSubMenu" Smiley cligne
Salut,
Tu as raison, mea culpa, erreur d'écriture. Maintenant ça fonctionne mais ce n'est pas tout-à-fait le résultat que je souhaite. Je ne sais pas si on peut y parvenir.

Mon site:
http://users.skynet.be/bk372295[/url]
contient (à présent) 6 sujets (randonnées) qui totalisent quelque 87 sous-menus.
Le menu est légèrement adapté de celui décrit ici:
http://css.alsacreations.com/Construction-de-menus-en-CSS/Un-menu-deroulant-en-CSS-et-XHTML-vertical-et-horizontal[/url]

Dans la nouvelle version que je prépare, le fait de faire un include du menu à chaque nouvelle page a pour effet de refermer le sous-menu ouvert.
Je voudrais obtenir le même fonctionnement du menu que sur le site actuel réalisé avec cadres, c'est-à-dire : pour chaque menu, que le sous-menu ouvert reste ouvert lorsque l'on sélectionne successivement les pages de ce sous-menu.
Est-ce possible ?
Merci.
Zénobe
Il y a également ce menu réalisé avec la librairie jQuery qui n'est pas mal du tout Smiley cligne

Tu pourras noter en section 5 un paragraphe pour améliorer l'ergonomie, avec, entre autre, un chapitre pour garder un sous-menu ouvert... Smiley cligne

Bon courage.
C'est bien ce menu réalisé avec la librairie jQuery qui est utilisé.

C'est exact que l'on peut garder un sous-menu ouvert. La classe "open_at_load" ne peut en pratique s'attacher que sur un seul sujet que l'on pourrait qualifier de préférentiel. On peut le mettre sur tous les sujets mais alors, tous les sous-menus sont déroulés en même temps et on ne peut plus alors parler de menu accordéon ou menu déroulant.

Mon souci est d'avoir le sous-menu actif, quel qu'il soit, déroulé en permanence tant que l'on navigue dans ce sous-menu, autrement dit que la classe "open_at_load" serait attribuée dynamiquement au seul menu en cours.

Zénobe.
Modérateur
Salut,

Si tu ne mets pas ton menu en include, c'est possible.

Code à mettre sur les pages Item 2.1, Item 2.2 et Item 2.3
<ul class="navigation">
    <li><a href="#" title="Aller à la page 1">Item 1</a></li>
    <li class="toggleSubMenu"><span>Item 2</span>
        <ul class="subMenu [#blue]open_at_load[/#]">
            <li><a href="#" title="Aller à la page 2.1">Item 2.1</a></li>
            <li><a href="#" title="Aller à la page 2.2">Item 2.2</a></li>
            <li><a href="#" title="Aller à la page 2.3">Item 2.3</a></li>
        </ul>
    </li>
    <li class="toggleSubMenu"><span>Item 3</span>
        <ul class="subMenu">
            <li><a href="#" title="Aller à la page 3.1">Item 3.1</a></li>
            <li><a href="#" title="Aller à la page 3.2">Item 3.2</a></li>
        </ul>
    </li>
    <li><a href="#" title="Aller à la page 4">Item 4</a></li>
</ul>

Code à mettre sur les pages Item 3.1 et Item 3.2
<ul class="navigation">
    <li><a href="#" title="Aller à la page 1">Item 1</a></li>
    <li class="toggleSubMenu"><span>Item 2</span>
        <ul class="subMenu">
            <li><a href="#" title="Aller à la page 2.1">Item 2.1</a></li>
            <li><a href="#" title="Aller à la page 2.2">Item 2.2</a></li>
            <li><a href="#" title="Aller à la page 2.3">Item 2.3</a></li>
        </ul>
    </li>
    <li class="toggleSubMenu"><span>Item 3</span>
        <ul class="subMenu [#blue]open_at_load[/#]">
            <li><a href="#" title="Aller à la page 3.1">Item 3.1</a></li>
            <li><a href="#" title="Aller à la page 3.2">Item 3.2</a></li>
        </ul>
    </li>
    <li><a href="#" title="Aller à la page 4">Item 4</a></li>
</ul>
Dès lors, le menu actif est toujours ouvert tant que tu cliques en son sein.

Ca, c'est le cas simple où on suppose que le sous-menu contenant la page active sera ouvert... mais si tu considères l'include comme indispensable ou que tu veux agir en fonction des actions "utilisateurs", je pense que ceci peut t'aider.

Seule chose à modifier :
Remplacer
a écrit :
- Le sous-menu n'a pas de classe "open_at_load" et un lien du sous-menu est enregistré dans le cookie
-> On ferme le menu avec slideUp(), c'est à dire que le sous-menu apparait ouvert au chargement de la page et se ferme progressivement.
par
a écrit :
- Le sous-menu n'a pas de classe "open_at_load" et un lien du sous-menu est enregistré dans le cookie
-> On attribue la classe "open_at_load" au sous-menu contenant le lien indiqué dans le cookie.

PS : Pourquoi passer par un menu déroulant ? Une page "plan" serait plus simple d'accès... donc plus ergonomique.
L'utilisateur se lassera vite de l'effet déroulant. Ce qui va compter, c'est de trouver l'information rapidement.
Selon la langue choisie, l'include me permet de charger le menu approprié (français ou espagnol actuellement, et éventuellement d'autres langues plus tard).

L'intérêt du menu déroulant est que toutes les pages des sous-menus constituent une suite chronologique au jour le jour, donc facile à suivre.

Je vais envisager une autre solution: scinder les menus en autant de menus par sujet. Ils seront appelés individuellement par le sujet choisi, donc ouverts en permanence. Cette façon me permettrait par la même occasion de m'affranchir du javascript que je ne maitrise pas du tout.

Merci à tous pour vos bons conseils.