Selecionando apenas elementos de primeiro nível no jquery


93

Como posso selecionar os elementos do link apenas do pai <ul>em uma lista como esta?

<ul>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a>
  <ul>
    <li><a href="#">Link</a></li>
    <li><a href="#">Link</a></li>
    <li><a href="#">Link</a></li>
    <li><a href="#">Link</a></li>
    <li><a href="#">Link</a></li>
  </ul>
</li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>

Então, em css ul li a, mas nãoul li ul li a

obrigado

Respostas:


108
$("ul > li a")

Mas você precisaria definir uma classe no ul raiz se quiser direcionar especificamente o ul mais externo:

<ul class="rootlist">
...

Então é:

$("ul.rootlist > li a")....

Outra maneira de garantir que você tenha apenas os elementos raiz li:

$("ul > li a").not("ul li ul a")

Parece desajeitado, mas deve funcionar


Hmm, descobri que meu problema era com o uso do jquery 1.2. Substituí-o pelo 1.3 e esse tipo de seletor está funcionando bem agora. Muito obrigado pela sua resposta e a todos que responderam.
aston de

Caso você não queira adicionar uma classe, basta fazer $ ("ul: first> li a"), obviamente, isso funcionaria apenas para o primeiro nível, não para os níveis internos.
Alfonso

Obrigado pela sua dica. Eu testei isso também e parece que funciona bem: ul.find(">li");se você tiver o nó "ul" como objeto JQuery na variável ul.
John Boe

55

Depois de obter o ul inicial, você pode usar o método children () , que considerará apenas os filhos imediatos do elemento. Como @activa aponta, uma maneira de selecionar facilmente o elemento raiz é fornecer uma classe ou um id. O seguinte assume que você tem um ul root com id root.

$('ul#root').children('li');

2
Obrigado, é muito útil para mim. Um $('ul').first().children('li')também pode ser usado
Ivan Black

Esta é a resposta preferida para mim, pois já tenho o elemento e, portanto, usarei .children em vez de .find.
Herbert Van-Vliet

7

Conforme declarado em outras respostas, o método mais simples é identificar exclusivamente o elemento raiz (por ID ou nome de classe) e usar o seletor descendente direto.

$('ul.topMenu > li > a')

No entanto, me deparei com essa questão em busca de uma solução que funcionasse em elementos não nomeados em diferentes profundidades do DOM.

Isso pode ser obtido verificando cada elemento e garantindo que não haja um pai na lista de elementos correspondentes. Aqui está minha solução , envolvida em um seletor jQuery 'topmost'.

jQuery.extend(jQuery.expr[':'], {
  topmost: function (e, index, match, array) {
    for (var i = 0; i < array.length; i++) {
      if (array[i] !== false && $(e).parents().index(array[i]) >= 0) {
        return false;
      }
    }
    return true;
  }
});

Utilizando isso, a solução para a postagem original é:

$('ul:topmost > li > a')

// Or, more simply:
$('li:topmost > a')

JsFiddle completo disponível aqui .


Usando novos métodos DOM, você pode melhorar drasticamente o desempenho do :topmost- tente usar .parentElement.closest(selector). Como sempre, o IE + Edge são os únicos a não suportá-lo> :-( então aqui está um polyfill pastebin.com/JNBk77Vm
oriadam


3

Você pode querer tentar isso se os resultados ainda fluem para os filhos; em muitos casos, o JQuery ainda se aplica aos filhos.

$("ul.rootlist > li > a")

Usando este método: E> F Corresponde a qualquer elemento F que seja filho de um elemento E.

Diz ao JQuery para procurar apenas filhos explícitos. http://www.w3.org/TR/CSS2/selector.html


0

Você também pode usar $("ul li:first-child")para obter apenas os filhos diretos da UL.

Eu concordo, porém, você precisa de um ID ou outra coisa para identificar o UL principal, caso contrário, ele apenas selecionará todos. Se você tivesse um div com um ID em torno do UL, a coisa mais fácil de fazer seria$("#someDiv > ul > li")


3
Este é o uso incorreto de :first-child. Isso selecionará o "primeiro lide cada ul". A postagem original pedia "cada, lidesde o início ul".
Courtney Christensen


0

Eu tive alguns problemas com classes aninhadas de qualquer profundidade, então descobri isso. Ele selecionará apenas o primeiro nível que encontrar de um objeto Jquery contido:

var $elementsAll = $("#container").find(".fooClass");4

var $levelOneElements = $elementsAll.not($elementsAll.children().find($elementsAll));

$levelOneElements.css({"color":"red"})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div class="fooClass" style="color:black">
Container
  <div id="container">
    <div class="fooClass" style="color:black">
      Level One
      <div>
        <div class="fooClass" style="color:black">
             Level Two
        </div>
      </div>
    </div>
    <div class="fooClass" style="color:black">
      Level One
      <div>
        <div class="fooClass" style="color:black">
             Level Two
        </div>
      </div>
    </div>
  </div>
</div>


0

1

 $("ul.rootlist > target-element")
2   $("ul.rootlist").find(target-element).eq(0) (only one instance)
3   $("ul.rootlist").children(target-element)

provavelmente existem muitas outras maneiras


-1
.add_to_cart >>> .form-item:eq(1)

o segundo .form-item no nível da árvore filho do .add_to_cart


1
Isso nem faz sentido para a pergunta
renke em

>>> O que é isso? Este seletor tem um nome? É um seletor válido? Ou foi uma piada?
John Boe
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.