2011-01-21 4 views
14

Ho una raccolta di elementi che voglio ripetere su ognuno di essi, ma li sto eseguendo in loop su un ciclo for esterno. Quando trovo quello che voglio in ognuno, restituisco false per scoppiare. La prossima volta che si esegue il ciclo esterno, voglio iniziare in ognuno dell'elemento dopo quello in cui sono tornato. Un esempio di codice generico:jQuery: Come utilizzare ogni avvio a un indice diverso da 0

var nextIndex = 0; 

for (var j=1; j <= someCount; j++) { 
    // do outside loop stuff 

    $('#someElemID').find('.someClass').each(function(index) { 
     if (/*this is right one*/) { 
      // do something 
      // next index should get passed to each function next loop... somehow? 
      nextIndex = index + 1; 
      return false; 
     } 
    }); 
} 

ho pensato di passare a un ciclo for, ma poi mi sono confuso su come accedere al ritorno dalla .find('.someClass'). Forse è una domanda a parte ...

È ovvio?

risposta

17

Usa slice()http://api.jquery.com/slice/

$('#someElemID').find('.someClass').slice(nextIndex).each(... 

btw se gli elementi sono statici, prendere in considerazione la cache:

var $elms = $('.someClass', '#someElemID'), 
    nextIndex = 0; 

for (var j = 1; j <= someCount; j++) { 
    // do outside loop stuff 

    $elms.slice(nextIndex).each(function(index) { 
     if (/*this is right one*/) { 
      nextIndex = index + 1; 
      return false; 
     } 
    }); 
} 

che dovrebbe migliorare sensibilmente le prestazioni.

+0

Questo, con una piccola modifica, ha fatto esattamente quello che mi serviva con meno modifiche al mio codice esistente! Grazie. –

6

Un'altra possibilità è quella di memorizzare l'indice unincremented, quindi è possibile utilizzare il gt selector per selezionare direttamente gli elementi che si verificano dopo che l'indice memorizzati, come questo:

$('#someElemID .someClass:gt(' + storedIndex + ')').each(function() { 
    ... 
+2

+1 per indicare il selettore gt. Non ti rendi conto che potresti usarlo in quel modo. Grazie. –

3

Non so quanto spesso si sta andando per eseguire questo o quante diverse varizioni è necessario, ma non mi piace lasciare nextValue fluttuante nello spazio. Potresti fare qualcosa del genere, che ti darebbe la possibilità di creare più "code" diverse, se lo vorrai. Sembra che tu voglia solo trovare quell'elemento una sola volta e, una volta fatto, non vorrai più cercarlo di nuovo. Questo dovrebbe fare proprio questo, e funziona memorizzando nella cache il selettore. Se stai cambiando il DOM tra una chiamata e l'altra, usa una delle altre risposte.

nameThisFunction = function(s) { 
    var self = this; 
    this.selector = $(s); 
    return function(searchFor) { 
     self.selector.each(function(i) { 
      if (/*Do your comparision to searchFor*/) { 
       // Do what you want 
       self.selector.splice(i, 1); 
       return false; 
      } 
     }); 

    } 
}; 

var thisQueue = new nameThisFunction('#someElemId .someClass'); 

thisQueue('Search for something here'); 

Ecco un esempio di violino: http://jsfiddle.net/robert/RCfeJ/

+1

+1 perché mi hai mostrato un altro modo in cui non avrei pensato di farlo. Devo andare a meditare su questo ancora ... tanto da imparare! Grazie. –