2009-11-09 5 views
1

J'ai une navigation de style accordéon basée sur jQuery que j'essaie de modifier.Aide à la navigation jQuery requise

Il utilise ce code:

$('.interior #subContent > ul > li > a.drop').click(function(){ 
    $(this).parent().children('ul').toggle("slow"); 
    return false; 
}); 

Je dois pouvoir le garder ouvert à la section de la page active est activée. Je peux mettre en évidence le lien actif avec CSS, mais je pourrais utiliser quelques bons conseils pour le garder ouvert à la section active.

La navigation est la suivante:

<ul> 
    <li><a href="#" class="drop">Products</a> 
     <ul> 
     <li><a href="printing-newproducts.html">New Products</a></li> 
     <li><a href="printing-inksystems.html">Ink Systems</a></li> 
     <li><a href="printing-specialtyinks.html">Specialty Inks</a></li> 
     <li><a href="printing-environmentalinks.html">Environmental Inks</a></li> 
     <li><a href="printing-whiteplastisolinks.html">White Plastisol Inks</a></li> 
     <li><a href="printing-plastisolbases.html">Plastisol Bases</a></li> 
     <li><a href="printing-plastisolinkseries.html">Plastisol Ink Series</a></li> 
     <li><a href="printing-pvcfreewaterbase.html">Non-PVC Water-Based 
      System</a></li> 
     <li><a href="printing-modifersadditives.html">Modifiers &amp; Additives</a></li> 
     <li><a href="printing-completeproductlisting.html">Complete Product 
      Listing</a></li> 
     </ul> 
    </li> 
    <li><a href="#" class="drop">Technical Information</a> 
     <ul> 
     <li><a href="printing-technicaldatasheets.html">Technical Data Sheets</a></li> 
     <li><a href="printing-msds.html">MSDS</a></li> 
     <li><a href="printing-onlinecolorcard.html">Online Color Card</a></li> 
     <li><a href="printing-mixingsystemsoftware.html">Mixing System Software</a></li> 
     <li><a href="printing-technicalbulletins.html">Technical Bulletins</a></li> 
     </ul> 
    </li> 
    <li><a href="#" class="drop">Tips &amp; Techniques</a> 
     <ul> 
     <li><a href="printing-tradetips.html">Trade Tips</a></li> 
     <li><a href="printing-galleryoftechniques.html">Gallery of Techniques</a></li> 
     </ul> 
    </li> 
    </ul> 

Note: J'essayé de faire cela avec l'accordéon ui jquery, mais j'ai un conflit avec un autre style accordéon sur la page entre autres.

Vous pouvez le voir en action here: C'est la navigation latérale.

Merci pour toute aide.

Répondre

1

Je Attribuez un nom ou une classe aux éléments « li » de sorte que vous pouvez cibler l'onglet que vous voulez et appeler « show() » sur dans onReady:

<ul> 
    <li name="products" ><a href="#" class="drop">Products</a> 
     ... 
    </li> 
    <li name="technical-information"><a href="#" class="drop">Technical Information</a> 
     ... 
    </li> 
    <li name="tips" ><a href="#" class="drop">Tips &amp; Techniques</a> 
     ... 
    </li> 
</ul> 

bascule () appelle en fait cacher()/show(), donc en émission d'appel onReady() sur le choix « ul »

jQuery(window).ready(function() { 

    jQuery('li[name=products] ul').show(); 

}); 
+0

Votre solution proposée est logique, mais je n'ai pas réussi à la faire fonctionner correctement. Lorsque je clique sur l'élément, la liste s'ouvre mais ne s'ouvre pas à l'action active, et je ne peux pas la refermer sans actualiser la page. – fmz

+0

Je suppose que je ne comprends pas le problème: "Je dois être capable de le garder ouvert à la section sur laquelle la page active est active" Je supposais que ce contrôle serait sur plusieurs pages, et la section correspondante dans la liste est déjà ouverte . – jshalvi

+0

Je l'ai finalement compris. J'ai pris le code original que j'avais et j'ai modifié ce que vous avez ajouté.Voir ma solution finale ci-dessous. Je vais vous donner le crédit pour la réponse parce que je n'aurais jamais compris sans votre contribution. Merci. – fmz

1

boucle sur le uls au lieu de la masse agissant sur eux. Si vous pouvez sélectionner un li actif sous le ul donné, alors ne le réduisez pas.

Edit: Je pense que cela vous donnera près de ce que vous voulez, il est un peu codé à sec, donc je ne suis pas à 100%, le test est conseillé.

$('.interior #subContent > ul > li > a.drop').click(function(){ 
    $(this).parent().children('ul').each(function() { 
     if ($('li.active', this).length == 0) { 
      $(this).show("slow"); 
     } else { 
      $(this).toggle("slow"); 
     } 
    }); 
    return false; 
}); 
+0

Bryan, je suis assez nouveau à jQuery. Pourriez-vous fournir un peu plus de détails sur la façon dont cela est fait? – fmz

+0

fmz: essayez le code ci-dessus et voyez comment cela fonctionne pour vous, je l'ai écrit dans le navigateur ici, donc ce n'est peut-être pas parfait. Notez que cela nécessite que vous configuriez la classe pour le li sur quelle que soit la page active. –

+0

Bryan, j'essaye vraiment de faire ce travail. Votre solution proposée est logique, mais je n'ai pas réussi à la faire fonctionner correctement. Lorsque je clique sur l'élément, la liste s'ouvre mais ne s'ouvre pas à l'action active, et je ne peux pas la refermer sans actualiser la page. – fmz

0

Je suis une entrée vraiment solide de Bryan et jshali ci-dessus et je voulais poster la solution finale , ce qui a fonctionné assez bien.

$('.interior #subContent > ul > li > a.drop').click(function(){ 
$(this).parent().children('ul').toggle("slow"); 
    return false; 
}); 

$(window).ready(function() { 
$('li.products ul').show(); 
    $('li.technical ul').show(); 
    $('li.tips ul').show(); 
}); 

Puis j'ajoute la classe appropriée à l'élément de liste. Il était beaucoup plus facile d'ajouter la classe que le nom:

<li class="products"><a href="#" class="drop">Products</a> 

Fonctionne bien grâce à l'aide.