jQuery: как использовать каждый, начиная с индекса, отличного от 0 - PullRequest
14 голосов
/ 21 января 2011

У меня есть коллекция элементов, которые я хочу зациклить, используя каждый, но я зацикливаю их внутри внешнего цикла 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 ]

17 голосов
/ 21 января 2011

Использование 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;
        }
    });
}

Это должно значительно улучшить производительность.

6 голосов
/ 21 января 2011

Другая возможность заключается в том, чтобы сохранить индекс без указания имени, тогда вы можете использовать селектор gt для непосредственного выбора элементов, которые появляются после сохраненного индекса, например:

$('#someElemID .someClass:gt(' + storedIndex + ')').each(function() {
    ...
3 голосов
/ 21 января 2011

Я не знаю, как часто вы собираетесь запускать это или сколько разных вариаций вам нужно, но я не люблю оставлять 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/

...