Внимание гуру JavaScript: нужна помощь с setInterval () - PullRequest
3 голосов
/ 16 июня 2010

Я пытаюсь сделать неинтерактивный дисплей для витрины магазина недвижимости.

Я давно не играл с setInterval().

В первый раз, когда мой скрипт проходит, это нормально. Но когда он пытается получить следующее свойство через getNextProperty(), он начинает терять скорость. Если у вас Firebug или эквивалентный вывод console.log(), вы увидите, что он вызывает то, чего не должно!

Теперь есть довольно много JavaScript, так что я чувствую себя лучше, если буду ссылаться на него, чем публиковать все это.

Дисплей магазина

Оскорбление JavaScript

Стоит отметить, что все мои DOM / AJAX сделаны с помощью jQuery.

Я старался изо всех сил, чтобы убедиться, что clearInterval() работает, и кажется, что он не запускает никакого кода под ним.

setInterval() используется для предварительной загрузки следующего изображения, а затем отображать его в галерее. Когда интервал обнаруживает, что мы находимся на последнем изображении ((nextListItem.length === 0)), он должен очистить этот интервал и начать заново с новым свойством.

Это уже давно сводит меня с ума, так что кто-нибудь может мне помочь?

Это, наверное, что-то действительно очевидное!

Большое спасибо!

Обновление

Что ж, теперь я чувствую себя лучше, узнав, что проблема заключалась в том, что я наивно полагал, что плагины будут работать из коробки.

Я получил этот плагин от ответа на переполнение стека . Я оповестил автора этого вопроса.

Спасибо за все ваши ответы!

1 Ответ

3 голосов
/ 16 июня 2010

Вот ваша проблемная область:

jQuery.extend(jQuery, {
  imagesToLoad: 0,

Проблема в том, что эта переменная является глобальной / общей (jQuery.imagesToLoad), поэтому эта проверка позже:

if(jQuery.loadedImages.length >= jQuery.imagesToLoad){

Зависит отэтот плагин не вызывается дважды одновременно, иначе, если проверка провалится, так как вы вызываете это позже в своем коде:

$.preloadImages({
  urls: [nextImage],

Это число падает до 1, что делает оценку iftrue не только на последнем изображении, но и на всех изображениях после первого в наборах после первого (из-за того, что при выполнении обратного вызова он перекрывается во времени), что вызывает возврат complete обратного вызова много раз, а не один раз, поэтому этот код:

$.preloadImages({
 urls: preloadImages,
 complete: function() { showProperty(property); }
});

... видит, что complete функция работает много раз, поэтому вы запускаете много интервалов одновременно (именно поэтому вы видите, что console.log('show property called' + property.slug) выполняется так много раз в журнале).

Краткое исправление: замените код preloadImages версией, которая не используетглобальная переменная:)

...