Используя JQuery для Итерации через элементы с таймером

Я использовал последовательность ясных и ул. в прошлом:

// clear, because eof or other bits may be still set. 
s.clear();
s.str("");

, Который сделал вещь для обоих вводов и выводов stringstreams. С другой стороны, можно вручную очистить, затем искать соответствующую последовательность на начинание:

s.clear();
s.seekp(0); // for outputs: seek put ptr to start
s.seekg(0); // for inputs: seek get ptr to start

, Который предотвратит некоторые перераспределения, сделанные str путем перезаписи того независимо от того, что находится в буфере вывода в настоящее время вместо этого. Результаты похожи на это:

std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b";
assert(s.str() == "bello");

, Если Вы хотите использовать строку для c-функций, можно использовать std::ends, помещая завершающийся пустой указатель как это:

std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b" << std::ends;
assert(s.str().size() == 5 && std::strlen(s.str().data()) == 1);

std::ends остатки устаревшего std::strstream, который смог записать непосредственно в массив символов, который Вы выделили на стеке. Необходимо было вставить завершающийся пустой указатель вручную. Однако std::ends не удерживается от использования, я думаю, потому что это все еще полезно как в вышеупомянутых случаях.

5
задан gnarf 8 September 2009 в 20:46
поделиться

4 ответа

Подход Джона Фишера выглядит неплохо. Но если вы хотите придерживаться jQuery each, что довольно элегантно, попробуйте следующее (на основе подсказки JasonWoof установить таймауты на 5, 10 и т. Д.):

$("#div_image_thumb ul li").each(function (i) {
    var $li = $(this);
    setTimeout(function () { doThis($li); }, 5000 * (i + 1));
});
13
ответ дан 18 December 2019 в 06:51
поделиться

Что-то вроде этого должно работать правильно:

var elements = $("#div_image_thumb ul li");
var index = 0;

var doNext = null;
doNext = function() {
  var element = elements.eq(index);
  // do work 
  if (index < elements.length) {
    index++;
    setTimeout(doNext, 5000);
  }
}
7
ответ дан 18 December 2019 в 06:51
поделиться

Я думаю, что проблема с вашим кодом заключается в том, что вы устанавливаете срок действия нескольких таймеров одновременно (через 5 секунд)

Таким образом, вам нужно либо установить один таймер, либо в течение 5 секунд с этого момента, и пусть он запускает следующий 5-секундный таймер, или вам нужно установить несколько таймеров на разное время, например, на 5, 10, 15, 20 и т. д.

0
ответ дан 18 December 2019 в 06:51
поделиться

На основании вашего комментария к принятому ответу - вы хотите продолжить цикл по коллекции элементов, для этого вы можете использовать setInterval и некоторые вспомогательные функции

$(function() {
  var $lis = $("#div_image_thumb ul li");
  var index = 0;

  // setup a function to show the current one and increase the index
  var doNext = function() { 
    // assuming doThis is defined somewhere else.
    doThis($lis.eq(index));
    // increment the index - if it is beyond the number of li's - reset it to 0
    if (++index >= $lis.length) index = 0;
  };

  // call it once as we load
  doNext();
  // set it up to be called every 5000 ms
  setInterval(doNext, 5000);
});
3
ответ дан 18 December 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: