Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/05/2011, 08:37
Avatar de abimaelrc
abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Listeners y Referencias

Saludos corillo,

Estoy creando un menú y desplegando otro menus usando "listeners". Lo que he hecho hasta ahora
Código Javascript:
Ver original
  1. <div id="menu">
  2.     <ul class="navigation">
  3.         <li style="border: 1px solid #eee;">
  4.             <a href="#">Foo</a>
  5.             <ul style="display: none;">
  6.                 <li style="border: 1px solid #eee;"><a href="#">fooFoo</a></li>
  7.                 <li style="border: 1px solid #eee;"><a href="#">fooBar</a></li>
  8.                 <li style="border: 1px solid #eee;"><a href="#">fooBaz</a></li>
  9.             </ul>
  10.         </li>
  11.         <li style="border: 1px solid #eee;">
  12.             <a href="#">Bar</a>
  13.             <ul style="display: none;">
  14.                 <li style="border: 1px solid #eee;"><a href="#">barFoo</a></li>
  15.                 <li style="border: 1px solid #eee;"><a href="#">barBar</a></li>
  16.                 <li style="border: 1px solid #eee;"><a href="#">barBaz</a></li>
  17.             </ul>
  18.         </li>
  19.         <li style="border: 1px solid #eee;">
  20.             <a href="#">Baz</a>
  21.             <ul style="display: none;">
  22.                 <li style="border: 1px solid #eee;"><a href="#">bazFoo</a></li>
  23.                 <li style="border: 1px solid #eee;"><a href="#">bazBar</a></li>
  24.                 <li style="border: 1px solid #eee;"><a href="#">bazBaz</a></li>
  25.             </ul>
  26.         </li>
  27.         <li style="border: 1px solid #eee;">
  28.             <a href="#">Candy</a>
  29.             <ul style="display: none;">
  30.                 <li style="border: 1px solid #eee;"><a href="#">candyFoo</a></li>
  31.                 <li style="border: 1px solid #eee;"><a href="#">candyBar</a></li>
  32.                 <li style="border: 1px solid #eee;"><a href="#">candyBaz</a></li>
  33.             </ul>
  34.         </li>
  35.         <li style="border: 1px solid #eee;"><a href="#">Fruits</a></li>
  36.         <li style="border: 1px solid #eee;"><a href="#">Vegetable</a></li>
  37.         <li style="border: 1px solid #eee;"><a href="#">twix</a></li>
  38.         <li style="border: 1px solid #eee;"><a href="#">apple</a></li>
  39.         <li style="border: 1px solid #eee;"><a href="#">fiber</a></li>
  40.         <li style="border: 1px solid #eee;"><a href="#">ice cream</a></li>
  41.         <li style="border: 1px solid #eee;"><a href="#">pizza</a></li>
  42.     </ul>
  43. </div>
  44. <script type="text/javascript">
  45. function addListener(element, type, expression, bubbling)
  46. {
  47.     bubbling = bubbling || false;
  48.  
  49.     if(window.addEventListener) { // Standard
  50.         element.addEventListener(type, expression, bubbling);
  51.         return true;
  52.     } else if(window.attachEvent) { // IE
  53.         element.attachEvent('on' + type, expression);
  54.         return true;
  55.     } else return false;
  56. }
  57.  
  58. elem = document.getElementById('menu').firstChild;
  59. while(true){
  60.     switch(elem.nodeName){
  61.         case 'UL':
  62.             elem = elem.firstChild;
  63.             break;
  64.         case 'LI':
  65.             addListener(elem, 'click', function(){
  66.                 childElem = this.firstChild;
  67.  
  68.                 function setBool(bool){ this.value = bool; }
  69.                 var bool = new setBool(true);
  70.  
  71.                 while(true){
  72.                     if(childElem.nodeName == 'UL'){
  73.                         addListener(childElem, 'click', function(){
  74.                             bool.value = false;
  75.                         });
  76.                         break;
  77.                     }
  78.                     childElem = childElem.nextSibling;
  79.                     if(childElem == null){ break; }
  80.                 }
  81.                 if(bool.value && childElem != null){
  82.                     if(childElem.style.display == 'block'){
  83.                         childElem.style.display = 'none';
  84.                     }else{
  85.                         childElem.style.display = 'block';
  86.                     }
  87.                 }
  88.             });
  89.             break;
  90.     }
  91.     elem = elem.nextSibling;
  92.     if(elem == null){ break; }
  93. }
  94. </script>
Con eso puedo mostrar el sub-menu, pero me gustaría que si pulso en el sub-menu no se esconda, sino que de la única forma como puedo esconder el submenu es pulsando en el menu.

Por ejemplo si pulso cualquier parte de foo, o sea en el elemento li muestra el sub-menú. Si vuelvo a pulsar en cualquier parte del elemento li de foo se esconda, pero no se puede esconder si he pulsado dentro del elemento ul dentro de foo.

No puedo crear otros elementos, porque el framework que uso para crearlo lo hace así, tengo que lidiar con ese tipo de menú. Tampoco quiero usar el elemento a porque deseo que se pueda mostrar y esconder el menu cuando pulse en el elemento li.

Traté de crear una variable y que dentro del segundo addListener volver a cambiarla, pero no hubo nada. Entonces pensé que pasando por referencia podía y no se me dió (¿o será que no estoy usando correctamente la referencia?).

Bueno espero a ver si me podrían indicar la mejor forma de hacerlo. Si el código requiere de regaños, adelante que ya tomé un relajante muscular para soportar el dolor de los golpes
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos