310

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

Andrea
  • 5,893
  • 1
  • 29
  • 53
Shamoon
  • 38,429
  • 77
  • 269
  • 518

8 Answers8

554

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

$('#mydiv').children('input').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 () { /* ... */ });
Andy E
  • 326,646
  • 82
  • 467
  • 441
66

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,543
  • 1
  • 19
  • 17
16

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
  • 6,752
  • 6
  • 44
  • 64
13
$('#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
  • 689
  • 12
  • 24
9

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,046
  • 14
  • 81
  • 111
Umar Asghar
  • 3,182
  • 1
  • 31
  • 27
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
  • 13,431
  • 9
  • 89
  • 88
  • 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
  • 336
  • 3
  • 11
-1

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

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