2010-08-05 5 views
0

J'ai une liste non ordonnée imbriquée représentant une hiérarchie d'arborescence. Il peut y avoir plusieurs tags ul profondément imbriqués dans la liste non ordonnée. Exemple très simple:Obtenir une étiquette suivante dans l'arborescence ul imbriquée

<ul> 
    <li><a href="#" class="allowed">Link</a> 
     <ul> 
      <li><a href="#" class="allowed">Link</a></li> 
      <li><a href="#" class="allowed">Link</a></li> 
     </ul> 
    </li> 
    <li><a href="#" class="allowed">Link</a> 
     <ul> 
      <li><a href="#" class="disallowed">Link</a></li> 
      <li><a href="#" class="disallowed">Link</a></li> 
     </ul> 
    </li> 
</ul> 

Comme vous pouvez le voir, certains liens peuvent avoir une classe "autorisé". Quand un lien comme celui-ci est cliqué, je voudrais obtenir une balise suivante dans l'arbre et si elle a la classe "disallowed", changez-la en "allowed". Comment puis-je obtenir le prochain tag dans l'arborescence?

MISE À JOUR:

Ce que je veux dire. Avant:

<ul> 
    <li><a href="#" class="allowed">Link</a> 
     <ul> 
      <li><a href="#" class="allowed">Link</a></li> 
      <li><a href="#" class="allowed">Link</a></li> 
     </ul> 
    </li> 
    <li><a href="#" class="allowed">Link</a><!-- this gets clicked on --> 
     <ul> 
      <li><a href="#" class="disallowed">Link</a></li> 
      <li><a href="#" class="disallowed">Link</a></li> 
     </ul> 
    </li> 
</ul> 

changements HTML à ceci:

<ul> 
    <li><a href="#" class="allowed">Link</a> 
     <ul> 
      <li><a href="#" class="allowed">Link</a></li> 
      <li><a href="#" class="allowed">Link</a></li> 
     </ul> 
    </li> 
    <li><a href="#" class="allowed">Link</a> 
     <ul> 
      <li><a href="#" class="allowed">Link</a></li> 
      <li><a href="#" class="disallowed">Link</a></li> 
     </ul> 
    </li> 
</ul> 

Et ainsi de suite.

+2

comme je peux le voir, il n'y a pas de «li» avec la classe ... – Reigel

+0

@Reigel J'ai corrigé la faute de frappe. Je voulais dire une étiquette, bien sûr. –

+0

Je ne comprends toujours pas: D Peux-tu mettre des codes avant-après de html. avant qu'un clic ne se produise (vous l'avez déjà), et après un clic se produit .. – Reigel

Répondre

1
$('.allowed').live(function() { 
    var links= $('a'); 
    var ix= links.index(this); 
    if (ix!==-1 && ix<links.length-1) 
     links.eq(ix+1).removeClass('disallowed').addClass('allowed'); 
}); 
  • celui-ci utilise live() pour attraper les clics, en supposant que, après, après un lien est changé en class="allowed", en cliquant qui doit effectuer la même action

  • il recherche le lien suivant sur toute la page. Si vous voulez seulement vérifier à l'intérieur d'un conteneur particulier, utilisez cela comme parent pour trouver des liens, par exemple. var links= $('#myul a');, pour l'efficacité et pour éviter que cela affecte les autres pages liens

+0

Merci, je vais essayer, Si cela fonctionne, je vais accepter votre réponse. –

0

vous pourriez faire quelque chose comme

$('a.allowed').click(function(){ 
    $(this).next().find('a:first').attr('class', 'allowed'); 
}); 

cela fera toutes les balises un sous ul à côté du lien qui a été cliqué une classe allowed.

+0

Ouais mais cela ne doit pas être affaire. La structure HTML ci-dessus est juste un exemple, Il pourrait y avoir un autre ul imbriqué à l'intérieur. –

+0

donc vous voulez que tout 'a' sous le lien qui est cliqué devrait se transformer en' allowed'? dans votre édition, le seul lien qui est changé est juste le premier 'a' qui est trouvé. –

+0

vous pouvez essayer mon edit .. –

1
$(document).ready(function() { 
     var el = null; 
     $('ul li a.allowed').click(function(){ 
     el = $(this); 
     while($(el).closest('.ul')){ 
      el = $(el).closest('.ul'); 
      var a = $(el).find('li a.disallowed:first'); 
      if(a){ 
      $(a).removeclass('disallowed').addClass('allowed'); 
      return true; 
      } 
     } 
    }); 
}); 
1
$(function(){ 
    $('ul li a').click(function(){ 
     if ($(this).is('.allowed')) { 
      var nextElem = $(this).next('ul').length?$(this).next('ul'):$(this).closest('li').next('li'); 
      nextElem.find('a:first'). 
       filter(function(){ 
        return $(this).is('.disallowed'); 
       }). 
       removeClass('disallowed'). 
       addClass('allowed'); 
     } 
     return false; 
    }); 
}); 

Ouf! demo

+0

Cela ne fonctionne pas. Essayez de cliquer sur le lien 11 à partir du haut. –

+0

excusez-moi? ... 11e n'est pas autorisé à droite? donc cela n'aura aucun effet .. – Reigel

+0

Oui mais cliquez sur les liens après le 11 est autorisé. Ensuite, cliquez sur le lien 11 et voir ce qui se passe (plus d'un lien après le 11e devient autorisé). –

Questions connexes