2009-10-21 18 views
10

Espero que pueda ayudar. Soy muy nuevo en jQuery y estoy trabajando en un menú de acordeón de cinco o seis niveles para mi navegación lateral. Obtuve la mayoría del código que tengo hasta ahora de Dane Peterson @ daneomatic.com (¡gracias Dane!). Pero, estoy atascado en una cosa:jQuery menú de acordeón - mantener abierto el menú del acordeón en la página Estoy en

me gustaría tener mi acordeón trabajo/árbol de la siguiente manera:

Cuando navego hacia abajo en, por ejemplo, el nivel tres, y haga clic en el enlace para abrir la página vinculada a ese nivel, ¿cómo señalo una vez que carga la página de nivel tres que estoy en esa página? Además, ¿cómo puedo mantener el árbol abierto a ese nivel cuando cargo la página?

Supongo que lo que estoy preguntando es: ¿hay alguna manera para que el acordeón/árbol se actualice automáticamente para mostrar en qué página estás y tener el árbol abierto para ese nivel?

¡Gracias de antemano!

Respuesta

0

Este es uno de los inconvenientes de los sitios web navegados con JavaScript: su URL en realidad no apunta a su página, como una página tradicional. Hace que sea difícil usar las características normales del navegador como marcadores y el botón Atrás.

Una solución que algunas personas parecen estar usando estos días es almacenar esta información después de la parte de hash de la url.

http://www.mysite.com/path/index.html#jsPageIndicator 

Al almacenar la información en lugar de "jsPageIndicator" anterior, a continuación, puede analizar con el código JavaScript después de $ ready (documento)(), y hacer que le diga qué página debe ser cargado. En su caso, esto podría ser algo simple, como el índice del acordeón que tiene el foco (debe estar abierto).

También puede ser que desee ver en la jQuery history plugin.

O, como señala a continuación Alex, benalman.com/projects/jquery-bbq-plugin

+0

Si seleccionó el método de cambio de hash que se describe aquí, el siguiente complemento no tiene comparación: http://benalman.com/projects/jquery-bbq-plugin/ - pronto reemplazará el plugin de jQuery history, que está terriblemente anticuado. –

+0

@Alex - ¡agradable! no estaba enterado de eso. – Matt

+0

Gracias por la información. Veré si puedo hacer que funcione con su solución o con la de No Surprises (arriba) ¡con los dedos cruzados! – MelissaTA

9

Para obtener el acordeón para abrir automáticamente la sección correcta en función de la dirección URL, deberá empezar desde activando la opción navigation con algo como:

$('#accordion').accordion('option', 'navigation', true); 

por defecto, esta opción busca el enlace de cabecera de acordeón que tiene un href que coincide con la URL Fragme nt (si su URL es http://somesite.com/about#contact, #contact es el fragmento) y abre esa sección del enlace del encabezado. Dado que está utilizando el acordeón para desplazarse a diferentes páginas, es probable que no tienen fragmentos de URL a contrastar, por lo que tendrá que escribir una costumbre navigationFilter:

$('#accordion').accordion('option', 'navigationFilter', function(){ ... }); 

Usted puede utilizar la opción de navigationFilter anula cómo el complemento de acordeón coincide con los enlaces de encabezado a la URL de la página actual.

Hasta ahora, tenemos la sección correcta del acordeón para abrir en función de la página actual. A continuación, debemos resaltar el enlace en esa sección que corresponde a la página. Que va a hacer que con algo como:

<script type="text/javascript"> 
    $(document).ready(function() { 
    $('#accordion li').each(function() { 
     var li = $(this); 
     var a = $('a', li); 
     if(/* compare the href of the 'a' element to the current URL */) { 
     li.addClass('active'); 
     } 
    }); 
    }); 
</script> 

<div id="accordion"> 
    <h3><a href="#">Section 1</a></h3> 
    <div> 
    <ul> 
     <li><a href="/about">About</a></li> 
     <li><a href="/contact">Contact</a></li> 
    </ul> 
    </div> 
    <h3><a href="#">Section 2</a></h3> 
    <div> 
    <ul> 
     <li><a href="/help">Help</a></li> 
     <li><a href="/faq">FAQ</a></li> 
    </ul> 
    </div> 
</div> 

Aquí vamos a través de todos los enlaces de la página en el acordeón de navegación, recogiendo la que coincida con la URL actual, y la aplicación de una clase .active a ella, que le luego puede tener un estilo diferente con CSS.


Un aparte: otra, probablemente mejor, manera de lograr la segunda parte es la construcción de la página con la clase .active ya aplicada al enlace correspondiente, pero que se supone que tiene el control sobre el backend y que sabes cómo hacerlo. De hecho, si ese es el caso, puede omitir todo el asunto navigationFilter y generar un bloque <script> para establecer la opción active en el acordeón para abrir la sección derecha.

+0

Gracias, probaré estas soluciones. ¡Feliz viernes! – MelissaTA

0

Ninguna de las anteriores trabajó para mí. La documentación para jquery ui es de repuesto, y el código fuente no deja muchas pistas para alguien que no está bien versado en jquery.

Usé el acordeón en una barra lateral, y los enlaces en cada sección de contenido estaban dentro de las tablas, así que tuve que hacer un seguimiento de mi estructura HTML (algo frágil) y hacer esto justo después de la creación del acordeón:

 $("#sidebar td").each(function() { 
      var td = $(this); 
      var a = td[0].firstChild; 
      if (a.href == location.href) { 
       $("#sidebar").accordion("activate", 
         td.parent().parent().parent().parent().prev()); 
      } 
     }); 

Sí, horrible, copias de seguridad de un tr, tbody, mesa y div, pero funcionó, y en nuestro caso no hemos cambiado la estructura HTML en meses.

2

bien este problema me ha estado molestando por un tiempo y pensaba que iba a publicar mi solución a este problema. (Soy un poco novato con JQuery así que ...)

En mi circunstancia tengo una página maestra que contiene el script JQuery para manejar la automatización del menú y tengo varias páginas de contenido que tienen menús diferentes (Tengo un menú horizontal en el encabezado de la página y luego el acordeón JQuery maneja el sub menú, por así decirlo).

Agregué las etiquetas de identificación al encabezado del menú y luego coloqué lo siguiente en el marcador de posición de contenido de la página de contenido.

$(document).ready(function() { 
     $('.active').next().hide().removeClass('active'); 
     $('#yourMenuHeaderIdTag).addClass('active').next().show(); 
    }; 

Esto funciona perfectamente y que hizo que me pregunte por qué he luchado con esto durante la última semana o así que cuando la solución es tan simple!

Cuestiones relacionadas