jQuery:如何使用从0以外的索引开始的每个

时间:2011-01-21 15:47:07

标签: jquery each

我有一个元素集合,我想使用每个元素循环,但我在一个外部for循环中循环它们。当我在每个中找到我想要的东西时,我会返回false来突破。下一次外循环运行时,我想在我返回的元素之后的元素中开始。一般代码示例:

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')访问返回感到困惑。也许这本身就是一个单独的问题......

这是显而易见的吗?

3 个答案:

答案 0 :(得分: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;
        }
    });
}

这应该会大大提高绩效。

答案 1 :(得分:6)

另一种可能性是存储未增量的索引,然后您可以使用gt selector直接选择存储索引之后出现的元素,如下所示:

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

答案 2 :(得分: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/