jQuery do przechodzenia między elementami o tej samej klasie

581

Mam mnóstwo div z klasą testimoniali chcę użyć jquery, aby przejść przez nie w pętli, aby sprawdzić dla każdego div, czy określony warunek jest spełniony. Jeśli to prawda, powinien wykonać akcję.

Czy ktoś wie, jak bym to zrobił?

geoffs3310
źródło

Odpowiedzi:

1051

Użyj każdego: „ i” jest pozycją w tablicy, objjest iterowanym obiektem DOM (można uzyskać do niego dostęp również przez opakowanie jQuery $(this)).

$('.testimonial').each(function(i, obj) {
    //test
});

Sprawdź referencję interfejsu API, aby uzyskać więcej informacji.

Kees C. Bakker
źródło
2
Funkcja z parametrami i, obj bardzo pomaga. Jeśli użyto tylko każdego z nich, nie będzie to powtarzało się.
darwindeeds
2
@Darwindeeds poprawny! Funkcja jest używana przez rzeczywisty iterator do przetwarzania każdego elementu. Powrót falsespowoduje zatrzymanie iteracji.
Kees C. Bakker
138
Warto podkreślić, że „obj” będzie obiektem dom, a $ (this) jest obiektem jQuery.
AndreasT
Nie możemy zrobić jQuery (to 'ul li'). Długość, aby uzyskać długość tych elementów ul li?
techie_28,
16
+1 za sugerowanie $(this)dostępu do obiektu ... obiekt objDOM nie pozwala na przykład na bezpośrednie dołączanie funkcjiobj.empty()
Fr0zenFyr,
127

Spróbuj tego...

$('.testimonial').each(function(){
    //if statement here 
    // use $(this) to reference the current div in the loop
    //you can try something like...


    if(condition){

    }


 });
stephen776
źródło
4
FYI: break;nie złamie się. Musisz użyćreturn false;
Kolob Canyon
53

W dzisiejszych czasach jest to dość proste bez jQuery.

Bez jQuery:

Po prostu wybierz elementy i użyj .forEach()metody do iteracji nad nimi:

const elements = document.querySelectorAll('.testimonial');
Array.from(elements).forEach((element, index) => {
  // conditional logic here.. access element
});

W starszych przeglądarkach:

var testimonials = document.querySelectorAll('.testimonial');
Array.prototype.forEach.call(testimonials, function(element, index) {
  // conditional logic here.. access element
});
Josh Crozier
źródło
42

Wypróbuj ten przykład

HTML

<div class="testimonial" data-index="1">
    Testimonial 1
</div>
<div class="testimonial" data-index="2">
    Testimonial 2
</div>
<div class="testimonial" data-index="3">
    Testimonial 3
</div>
<div class="testimonial" data-index="4">
    Testimonial 4
</div>
<div class="testimonial" data-index="5">
    Testimonial 5
</div>

Kiedy chcemy uzyskać dostęp do tych, divsktóre mają data-indexwięcej niż 2wtedy, potrzebujemy tej jquery.

$('div[class="testimonial"]').each(function(index,item){
    if(parseInt($(item).data('index'))>2){
        $(item).html('Testimonial '+(index+1)+' by each loop');
    }
});

Przykładowy skrzypce

Manoj
źródło
29

możesz to zrobić w ten sposób

$('.testimonial').each(function(index, obj){
    //you can use this to access the current item
});
Ghyath Serhal
źródło
18

Funkcja .eq () jQuery może pomóc ci przechodzić przez elementy z podejściem indeksowanym.

var testimonialElements = $(".testimonial");
for(var i=0; i<testimonialElements.length; i++){
    var element = testimonialElements.eq(i);
    //do something with element
}
Atharva
źródło
1
jest to rzeczywiście najbardziej efektywne podejście.
Amin Setayeshfar
17
divs  = $('.testimonial')
for(ind in divs){
  div = divs[ind];
  //do whatever you want
}
ikostia
źródło
to nie daje ci obiektów jquery, tylko elementy dom
celwell
1
@celwell nie może oczekiwać, że jQuery zrobi wszystko za Ciebie. Chodzi o stworzenie własnego obiektu jQuery $(ind).
GoldBishop
14

Możesz to zrobić zwięźle, używając .filter. Poniższy przykład ukryje wszystkie div .testimonial zawierające słowo „coś”:

$(".testimonial").filter(function() {
    return $(this).text().toLowerCase().indexOf("something") !== -1;
}).hide();
karim79
źródło
10

Dzięki prostej pętli for:

var testimonials= $('.testimonial');
for (var i = 0; i < testimonials.length; i++) {
  // Using $() to re-wrap the element.
  $(testimonials[i]).text('a');
}
Ismail Rubad
źródło
8

Bez aktualizacji jQuery

document.querySelectorAll('.testimonial').forEach(function (element, index) {
    element.innerHTML = 'Testimonial ' + (index + 1);
});
<div class="testimonial"></div>
<div class="testimonial"></div>

KrisInception
źródło
prawie ta sama odpowiedź jest już tutaj, myślę, że powinieneś edytować istniejące
Oleh Rybalchenko
6
$('.testimonal').each(function(i,v){
  if (condition) {
    doSomething();
  }
});
David
źródło
4

Bardziej dokładnie:

$.each($('.testimonal'), function(index, value) { 
    console.log(index + ':' + value); 
});
Atif Tariq
źródło
Jest to miłe, jeśli lubisz czytać / pisać z bardziej funkcjonalnej perspektywy.
Sgnl
4

W JavaScript ES6 .forEach () nad podobną do tablicy kolekcją NodeList podaną przezElement.querySelectorAll()

document.querySelectorAll('.testimonial').forEach( el => {
  el.style.color = 'red';
  console.log( `Element ${el.tagName} with ID #${el.id} says: ${el.textContent}` );
});
<p class="testimonial" id="1">This is some text</p>
<div class="testimonial" id="2">Lorem ipsum</div>

Roko C. Buljan
źródło
Operator spread + notacja tablicowa nie jest potrzebna, czy na pewno doc..torAll.forEach()wystarczy?
aabbccsmith
Dziękuję Ci. Absolutnie. [...ArrayLike]był używany dla zapytania czasowego SelectorAll nie miał obsługi .forEach. @aabbccsmith
Roko C. Buljan
2

Możesz użyć metody jQuery $ each, aby przeglądać wszystkie elementy ze świadectwem klasy. i => to indeks elementu w kolekcji, a val daje obiekt tego konkretnego elementu i możesz użyć „val”, aby uzyskać dostęp do właściwości tego elementu i sprawdzić swój stan.

$.each($('.testimonal'), function(i, val) { 
    if(your condition){
       //your action
    }
});
Nidhi Gupta
źródło