[Javascript] Petit problème de fonction

Petit problème de fonction [Javascript] - HTML/CSS - Programmation

Marsh Posté le 13-07-2005 à 20:24:33    

J'ai un joli code ci-dessous
 
bon le but de ce code est de faire un menu basé sur des listes à puces et des sous-listes.
Le JS est intrusif, donc du coup un visiteur sans javascript verrai le menu. Pour le moment c'est juste un truc pour ma yeule, juste pour voir comment ca marche tout ce joli monde.
 
Les sous-listes doivent s'afficher lors d'un clic de souris (Me dites pas que JS c'est pas bien ca je le sais)
 
Mon problème se situe à cette ligne là :

Code :
  1. li[i].getElementsByTagName('A')[0].onclick = function() {
  2.     ShowHideMenu("sousmenu" + i);
  3.   }


 
dans ce code je veux que le onclick de mon lien (qui correspond à un noeud du menu, contienne la fonction :  
ShowHideMenu("sousmenu" + i);
 
Je pensais que lors de la génération du code j'aurai mon onclick égal à :  

Code :
  1. ShowHideMenu("sousmenu5" )


 
ce qui signifie par là qu'il y aurait eu concaténation de I avec la string "sousmenu".
 
Mais il en est tout autrement, la fonction onclick comporte le code :  

Code :
  1. ShowHideMenu("sousmenu" + i);


 
J'ai essayé avec un eval et tout le tralala, et ca ne marche pas.
bien évidement, il était plus simple de faire :  

Code :
  1. monlienA.href="javascript:ShowHideMenu('sousmenu'" + i + " );";


 
Mais moi j'aime pas, et si on veut un autre évènement que le click, ca ne passe pas, par exemple :onmouseover
 
Donc si quelqu'un a une idée je suis ouvert (des oreilles pas ailleur les gars).
 
 
Voici le code, je sais ya pas de doctype, mais là le but du jeu, c'est juste faire du JS propre.

Code :
  1. <html>
  2. <head>
  3. <title></title>
  4. <style>
  5. #menu{/*Le menu global*/
  6.  margin:0;/*j'enlève les marges externe du Menu (sous IE)*/
  7.  padding:0; /*j'enlève les marges internes du menu sous les autres navigateurs*/
  8. }
  9. #menu li{/*Les blocs LI sont stylés, cette syntaxe comprend tous les blocs LI, même les sous menus*/
  10.  background-color:silver;
  11.  float:left;
  12.  list-style: none; /*on supprime les puces*/
  13. }
  14. #menu li a{/*On style tous les liens du menu, y compris les sous-menus*/
  15.  display: block;/*on met les liens en bloc afin de les traiter pour la largeur*/
  16.  color:black;
  17.  text-decoration: none;/*pas de souligné*/
  18.  text-align:center;/*texte centré*/
  19.  width:100px;
  20. }
  21. #menu li A:hover{/*on traite les liens lors du survol. Donc pour cela il faut que le A prenne toute la largeur du LI*/
  22.  background-color:gray;
  23.  color:white;
  24. }
  25. /*Les sous Menus*/
  26. #menu li ul{/*les blocs de sous menu*/
  27.  margin:0;
  28.  padding:0;
  29.  border:1px solid black;
  30. }
  31. #menu li ul li{/*les blocs lu de sous menu*/
  32.  float:none; /*on retire le flottement pour les sousbloc LI*/
  33. }
  34. #menu li ul li a{/*on traite les liens cette fois-ci*/
  35.  background-color: White;/*on met une couleur blanche en fond*/
  36.  width:98px;
  37. }
  38. #menu li ul li a:hover{
  39.  background-color: silver;/*on met une couleur argent au survol*/
  40. }
  41. </style>
  42. <script>
  43. function DynamMenu(){
  44.  if(!document.getElementsByTagName) //On teste si on a le droit de faire mumuse avec le DOM sur les TAGNAME
  45.   return;
  46.  var Menu = document.getElementById('menu'); //On récupère le menu
  47.  var li = Menu.getElementsByTagName('LI'); //On récupère tous les LI du menu
  48.       for(var i=0; i<li.length-1; ++i) { //On scanne tous les LI
  49.    var sousUL = li[i].getElementsByTagName('UL'); //Pour chaque LI on recupère le UL dessous
  50.    if (sousUL[0]) { //On vérifié qu'il y a un UL dans le LI
  51.     sousUL[0].id = 'sousmenu' + i; //On met un ID à ce UL
  52.     sousUL[0].style.display = "none";//On cache le sous menu
  53.     //var FonctionOver = "function() {\n";
  54.     var FonctionOver = "";
  55.     li[i].getElementsByTagName('A')[0].onclick = function() {
  56.      ShowHideMenu("sousmenu" + i);
  57.     }
  58.    } 
  59.   }
  60. }
  61. window.onload = DynamMenu;
  62. function ShowHideMenu(MenuId){
  63.  var SousMenu = document.getElementById(MenuId);
  64.  if (SousMenu.style.display=='block' || SousMenu.style.display == null) {
  65.   SousMenu.style.display = 'none'; //ON cache le sous menu
  66.  }
  67.  else{
  68.   SousMenu.style.display = 'block'; //On affiche le sous menu
  69.  }
  70. }
  71. </script>
  72. </head>
  73. <body>
  74. <ul id="menu">
  75. <li><a href="#">Truc a cliquer</a>
  76.  <ul id="test">
  77.   <li><a href="#">lien</a></li>
  78.   <li><a href="#">infos 12</a></li>
  79.  </ul>
  80. <li><a href="#">lien</a>
  81.  <ul id="test">
  82.   <li><a href="#">lien</a></li>
  83.   <li><a href="#">infos 12</a></li>
  84.  </ul>
  85. </li>
  86. <li><a href="#">clic là aussi</a>
  87.  <ul>
  88.   <li><a href="#">lien</a></li>
  89.   <li><a href="#">lien</a></li>
  90.   <li><a href="#">lien</a></li>
  91.  </ul>
  92. </li>
  93. </ul>
  94. </body>
  95. </html>

Reply

Marsh Posté le 13-07-2005 à 20:24:33   

Reply

Marsh Posté le 13-07-2005 à 20:25:49    

Pas d'interêt à mettre un id, suffit de récupérer le sub-ul à chaque fois, et de le planquer ou non

Reply

Marsh Posté le 13-07-2005 à 20:30:43    

heu, plutot récuperer l'élément suivant
 
car là dans l'arbre du DOM j'ai

Code :
  1. UL
  2. --LI
  3.    |-A
  4.    |-UL
  5.    |  |-LI

Reply

Marsh Posté le 13-07-2005 à 20:31:36    

Ouais voilà ;)

Reply

Marsh Posté le 13-07-2005 à 20:40:28    

Salaud à cause de toi j'ai simplifié encore plus mon code.
 
au passage le code précédent comportait des id sur les sous-menu parce que c'etait un code de test, merci de votre comprehension
 

Code :
  1. <html>
  2. <head>
  3. <title></title>
  4. <style>
  5. #menu{/*Le menu global*/
  6.  margin:0;/*j'enlève les marges externe du Menu (sous IE)*/
  7.  padding:0; /*j'enlève les marges internes du menu sous les autres navigateurs*/
  8. }
  9. #menu li{/*Les blocs LI sont stylés, cette syntaxe comprend tous les blocs LI, même les sous menus*/
  10.  background-color:silver;
  11.  float:left;
  12.  list-style: none; /*on supprime les puces*/
  13. }
  14. #menu li a{/*On style tous les liens du menu, y compris les sous-menus*/
  15.  display: block;/*on met les liens en bloc afin de les traiter pour la largeur*/
  16.  color:black;
  17.  text-decoration: none;/*pas de souligné*/
  18.  text-align:center;/*texte centré*/
  19.  width:100px;
  20. }
  21. #menu li A:hover{/*on traite les liens lors du survol. Donc pour cela il faut que le A prenne toute la largeur du LI*/
  22.  background-color:gray;
  23.  color:white;
  24. }
  25. /*Les sous Menus*/
  26. #menu li ul{/*les blocs de sous menu*/
  27.  margin:0;
  28.  padding:0;
  29.  border:1px solid black;
  30. }
  31. #menu li ul li{/*les blocs lu de sous menu*/
  32.  float:none; /*on retire le flottement pour les sousbloc LI*/
  33. }
  34. #menu li ul li a{/*on traite les liens cette fois-ci*/
  35.  background-color: White;/*on met une couleur blanche en fond*/
  36.  width:98px;
  37. }
  38. #menu li ul li a:hover{
  39.  background-color: silver;/*on met une couleur argent au survol*/
  40. }
  41. </style>
  42. <script>
  43. function DynamMenu(){
  44.  if(!document.getElementsByTagName) //On teste si on a le droit de faire mumuse avec le DOM sur les TAGNAME
  45.   return;
  46.  var Menu = document.getElementById('menu'); //On récupère le menu
  47.  var li = Menu.getElementsByTagName('LI'); //On récupère tous les LI du menu
  48.       for(var i=0; i<li.length-1; ++i) { //On scanne tous les LI
  49.    var sousUL = li[i].getElementsByTagName('UL'); //Pour chaque LI on recupère le UL dessous
  50.    if (sousUL[0]) { //On vérifié qu'il y a un UL dans le LI
  51.     sousUL[0].style.display = "none";//On cache le sous menu
  52.     li[i].getElementsByTagName('A')[0].onclick = function() {
  53.       var monUL = this.parentNode.getElementsByTagName('UL')[0];
  54.       if (monUL.style.display=='block' || monUL.style.display == null) {
  55.        monUL.style.display = 'none'; //ON cache le sous menu
  56.       }
  57.       else{
  58.        monUL.style.display = 'block'; //On affiche le sous menu
  59.       }
  60.     }
  61.    }
  62.   }
  63. }
  64. window.onload = DynamMenu;
  65. </script>
  66. </head>
  67. <body>
  68. <ul id="menu">
  69. <li><a href="#">Truc a cliquer</a>
  70.  <ul>
  71.   <li><a href="#">lien</a></li>
  72.   <li><a href="#">infos 12</a></li>
  73.  </ul>
  74. <li><a href="#">lien</a>
  75.  <ul>
  76.   <li><a href="#">lien</a></li>
  77.   <li><a href="#">infos 12</a></li>
  78.  </ul>
  79. </li>
  80. <li><a href="#">clic là aussi</a>
  81.  <ul>
  82.   <li><a href="#">lien</a></li>
  83.   <li><a href="#">lien</a></li>
  84.   <li><a href="#">lien</a></li>
  85.  </ul>
  86. </li>
  87. </ul>
  88. </body>
  89. </html>

Reply

Marsh Posté le 14-07-2005 à 08:19:25    

C'est que ca marche bien en plus :)
 
Je vais m'y mettre peut-etre aussi finalement ^^


---------------
http://www.alsacreations.com , http://www.openweb.eu.org. Mon CV : http://cv.roane-irkana.net/. Exemple à ne surtout pas suivre : www.worldinternet.be
Reply

Marsh Posté le 19-07-2005 à 18:11:56    

PS : au passage, j'ai recréé un menu encore plus dynamique et plus souple sur certaines choses, avec la possibilité de styler certaines classes CSS pour donner une meilleure gueule au menu.
 
j'ai reussi a refaire une arborescence ressemblant à l'explorateur windows rien qu'en style, et avec le JS ca le rend plus fonctionnel. Bon on verra dans une semaine kan je serai revenu

Reply

Marsh Posté le 19-07-2005 à 18:33:55    

J'attends ça avec impatience :)


---------------
http://www.alsacreations.com , http://www.openweb.eu.org. Mon CV : http://cv.roane-irkana.net/. Exemple à ne surtout pas suivre : www.worldinternet.be
Reply

Marsh Posté le 19-07-2005 à 18:46:36    

ben oué faut attendre un peu.
 
en gros, le but du jeu, c'est qu'avec du JS on a un joli menu, et sans JS on a le menu totalement développé. et avec un peu de CSS on fait un joli menu, aussi bien horizontal que vertical

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed