2011-01-21 35 views
14

我有一個元素集合,我想循環使用每個元素,但是我正在循環它們的內部for循環。當我在每一箇中找到我想要的東西時,我都會返回假來爆發。下一次外層循環運行時,我想從我返回的那個元素開始。一個通用的代碼示例:jQuery:如何使用每個索引以外的索引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; 
     } 
    }); 
} 

我認爲有關切換到一個for循環,但後來,我被困惑,如何訪問從.find('.someClass')回報。也許這是一個單獨的問題本身...

這是一個明顯的嗎?

回答

17

使用slice()http://api.jquery.com/slice/

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

順便說一句,如果內容是靜態的,考慮緩存:

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

這應該大大提高性能。

+0

這一點,加上一點點修改,究竟做了什麼,我需要用最少的改變我現有的代碼!謝謝。 – 2011-01-21 19:10:13

6

另一種可能性是存儲索引unincremented,那麼你可以使用gt selector直接選擇存儲索引後發生的元素,像這樣:

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

+1用於指出gt選擇器。沒意識到你可以這樣使用它。謝謝。 – 2011-01-21 19:08:38

3

我不知道你是怎麼去常運行這個或你需要多少種不同的變化,但我不喜歡在太空中漂浮nextValue。你可以做這樣的事情,如果你願意的話,你可以創建多個不同的'隊列'。這聽起來像你只想找到一個項目,一旦你做了,你永遠不想再次搜索。這應該做到這一點,它通過緩存選擇器。如果您在呼叫之間更改DOM,請使用其他答案之一。

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

下面是一個例子小提琴:http://jsfiddle.net/robert/RCfeJ/

+1

+1,因爲你向我展示了另一種我不會想到這樣做的方式。我需要更多地思考這一個...非常多的學習!謝謝。 – 2011-01-21 19:11:23