316

I have a div and it has several input elements in it... I'd like to iterate through each of those elements. Ideas?

Andrea
  • 6,032
  • 2
  • 28
  • 55
Shamoon
  • 41,293
  • 91
  • 306
  • 570

8 Answers8

572

Use children() and each(), you can optionally pass a selector to children

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

You could also just use the immediate child selector:

$('#mydiv > input').each(function () { /* ... */ });
Martin
  • 2,575
  • 6
  • 32
  • 53
Andy E
  • 338,112
  • 86
  • 474
  • 445
71

It is also possible to iterate through all elements within a specific context, no mattter how deeply nested they are:

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

The second parameter $('#mydiv') which is passed to the jQuery 'input' Selector is the context. In this case the each() clause will iterate through all input elements within the #mydiv container, even if they are not direct children of #mydiv.

Liquinaut
  • 3,759
  • 1
  • 21
  • 17
21

If you need to loop through child elements recursively:

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"));   

NOTE: In this example I show the events handlers registered with an object.

tomloprod
  • 7,472
  • 6
  • 48
  • 66
15
$('#myDiv').children().each( (index, element) => {
    console.log(index);     // children's index
    console.log(element);   // children's element
 });

This iterates through all the children and their element with index value can be accessed separately using element and index respectively.

Surya
  • 971
  • 2
  • 17
  • 30
8

It can be done this way as well:

$('input', '#div').each(function () {
    console.log($(this)); //log every element found to console output
});
Dan Atkinson
  • 11,391
  • 14
  • 81
  • 114
Umar Asghar
  • 3,808
  • 1
  • 36
  • 32
3

I don't think that you need to use each(), you can use standard for 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");
}

this way you can have the standard for loop features like break and continue works by default

also, the debugging will be easier

Basheer AL-MOMANI
  • 14,473
  • 9
  • 96
  • 92
  • 1
    My experience is that `$.each()` is always slower than a `for` loop, and this is the only answer that uses it. The key here is to use the `.eq()` to access the actual element within the `children` array and not bracket (`[]`) notation. – elPastor Feb 19 '19 at 14:58
1

children() is a loop in itself.

$('.element').children().animate({
'opacity':'0'
});
Dan185
  • 356
  • 3
  • 12
-1

It's working with .attr('value'), for elements attributes

$("#element div").each(function() {
   $(this).attr('value')
});
KarolSVK
  • 1
  • 1