Сохранить интервал JavaScript в объекте jQuery element.data? - PullRequest
2 голосов
/ 03 августа 2010

Я работаю над плагином jQuery (виджетом пользовательского интерфейса jQuery) под названием Smooth Div Scroll , где мне нужно хранить ссылки на интервалы, характерные для каждого отдельного экземпляра плагина на странице.Если я просто напишу что-то вроде этого:

var myInterval = setInterval(function() {  
    alert("Hi!");  
}, 100);

... переменная myInterval будет на самом деле window.myInterval и будет использоваться все экземпляры плагина на странице.Поэтому, когда я пытаюсь установить или очистить интервал для экземпляра, интервал для всех экземпляров будет установлен / очищен, поскольку все они ссылаются на одну и ту же переменную окна.

Просматривая jQuery API, я нашел метод .data , который используется для хранения произвольных данных, связанных с сопоставляемыми элементами, и так как каждый экземпляр плагина имеет соответствующий элемент DOM.Отлично!Используя этот метод, я могу хранить данные, относящиеся к соответствующему элементу.Поэтому я структурировал свой код следующим образом (где el - это ссылка на соответствующий элемент):

el.data("myInterval", setInterval(function() {  
    alert("Hi!");  
}, 100));

В некоторой степени это работает, поскольку различные экземпляры плагина больше не ссылаются на одну и ту же переменную (интервал),Но я заметил, что если у меня есть страница с 2-3 экземплярами моего плагина и я устанавливаю одинаковый интервал для каждого экземпляра, только первый экземпляр начинает свой интервал.Но если таймер интервала небольшой, только некоторые элементы начинают свой интервал.

Я не делал глубоких копий в реальных значениях, но если у меня есть три экземпляра плагина на одной странице, и интервал установлен на 5, например:

el.data("myInterval", setInterval(function() {  
    alert("Hi!");  
}, 5));

... только первый экземпляр будет запущен.Если я увеличу его до 20-30, запустятся два экземпляра, и если я увеличу его, скажем, до 50, начнутся все три экземпляра.Это так странно?!

У меня такие вопросы:

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

Пожалуйста, помогите мне с этим - я в тупике!Если вам нужен реальный исходный код, проверьте страницу плагина (ссылка вверху этого поста).

/ Thomas Kahn

Ответы [ 2 ]

1 голос
/ 03 августа 2010

Возвращаемое значение setInterval и setTimeout - это просто целые числа, используемые внутренне для ссылки на тайм-ауты, поэтому сохранение целого числа с .data не является проблемой.

0 голосов
/ 04 августа 2010

Изучив код и немного прощупав его, кажется, что проблема не связана с хранением интервалов в el.data. Интервалы хранятся просто отлично. Я подозреваю, что проблема связана с подпрограммами, которые выполняются в неправильном порядке в коде. Правильный порядок должен быть:

  1. загрузка фрагмента HTML-контента (изображения), используя нагрузку jQuery ().
  2. Рассчитать общую ширину всех эти элементы.
  3. Начать интервал который прокручивает эти изображения.

Проблема, похоже, заключается в том, что процедура, которая вычисляет общую ширину всех элементов, запускается до / в то же время, когда содержимое загружается через AJAX с использованием нагрузки jQuery. В результате общая вычисленная ширина загруженных элементов равна 0 (нулю), а процедура прокрутки останавливается, поскольку нет смысла прокручивать что-либо с шириной нуля.

...