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')
. Может быть, это отдельный вопрос...
Является ли это очевидным?
Ответы
Ответ 1
Используйте slice()
http://api.jquery.com/slice/
$('#someElemID').find('.someClass').slice(nextIndex).each( ...
btw, если элементы статичны, рассмотрите кэширование:
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;
}
});
}
Это должно значительно повысить производительность.
Ответ 2
Другая возможность - сохранить индекс unincremented, тогда вы можете использовать gt селектор, чтобы напрямую выбирать элементы, которые происходят после сохраненного индекса, например это:
$('#someElemID .someClass:gt(' + storedIndex + ')').each(function() {
...
Ответ 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/