Como iterar os elementos filhos de uma div usando o jQuery?

257

Eu tenho uma div e ela possui vários elementos de entrada ... Eu gostaria de percorrer cada um desses elementos. Ideias?

Shamoon
fonte

Respostas:

476

Use children()e each(), opcionalmente, você pode passar um seletor parachildren

$('#mydiv').children('input').each(function () {
    alert(this.value); // "this" is the current element in the loop
});

Você também pode usar o seletor filho imediato:

$('#mydiv > input').each(function () { /* ... */ });
Andy E
fonte
68
use $ (this) no fechamento para acessar o item "atual" no loop.
amarsuperstar
1
@amarsuperstar: foi apenas no processo de adicionar essa informação :-)
Andy E
Existe uma maneira de saber o valor de "n", supondo que $ (this) seja o "n" é filho do pai?
Souvik Ghosh 21/09/16
1
@SouvikGhosh: o índice é passado como o primeiro argumento para a função de retorno de chamada each(). Verifique os documentos, vinculados na resposta acima.
Andy E
55

Também é possível iterar por todos os elementos em um contexto específico, não importando o quão profundamente aninhados eles estejam:

$('input', $('#mydiv')).each(function () {
    console.log($(this)); //log every element found to console output
});

O segundo parâmetro $ ('# mydiv') que é passado para o seletor 'input' do jQuery é o contexto. Nesse caso, a cláusula each () irá percorrer todos os elementos de entrada no contêiner #mydiv, mesmo que não sejam filhos diretos de #mydiv.

Liquinaut
fonte
1
Provavelmente, por aninhar esta solução funcionou para mim, enquanto a outra não. Por esse motivo, acho que essa normalmente é a melhor solução.
Arame3333 28/10/2015
Era isso que eu estava procurando. Alguma maneira de fazer json a partir de seus valores? Eu preciso postar todo o tema como json.
Muhammad Saqib
8

Se você precisar percorrer elementos filho recursivamente :

function recursiveEach($element){
    $element.children().each(function () {
        var $currentElement = $(this);
        // Show element
        console.info($currentElement);
        // Show events handlers of current element
        console.info($currentElement.data('events'));
        // Loop her children
        recursiveEach($currentElement);
    });
}

// Parent div
recursiveEach($("#div"));   

NOTA: Neste exemplo, mostro os manipuladores de eventos registrados com um objeto.

tomloprode
fonte
5

Também pode ser feito desta maneira:

$('input', '#div').each(function () {
    console.log($(this)); //log every element found to console output
});
Umar Asghar
fonte
3
$('#myDiv').children().each( (index, element) => {
    console.log(index);     // children's index
    console.log(element);   // children's element
 });

Isso itera através de todos os filhos e seu elemento com valor de índice pode ser acessado separadamente usando elemento e índice, respectivamente.

Surya Swanoff
fonte
1

children () é um loop em si.

$('.element').children().animate({
'opacity':'0'
});
Dan185
fonte
1

Eu não acho que você precisa usar each(), você pode usar o padrão para loop

var children = $element.children().not(".pb-sortable-placeholder");
for (var i = 0; i < children.length; i++) {
    var currentChild = children.eq(i);
    // whatever logic you want
    var oldPosition = currentChild.data("position");
}

Dessa forma, você pode ter o padrão para recursos de loop como breake continuefunciona por padrão

também o debugging will be easier

Basheer AL-MOMANI
fonte
Minha experiência é que $.each()é sempre mais lento que um forloop, e esta é a única resposta que o utiliza. A chave aqui é usar o .eq()para acessar o elemento real dentro da childrenmatriz e não a []notação bracket ( ).
ElPastor 19/02/19