#javascript #jquery #jquery-plugins
#javascript #jquery #jquery-плагины
Вопрос:
Извините, что это не более конкретно, но у меня возникли проблемы с выделением проблемы.
Я написал очень простой плагин jQuery, который прокручивает изображения или другие элементы через div, например, карусель, с заданным интервалом. Я хотел, чтобы этот плагин работал с несколькими экземплярами на одной странице, но когда я вызываю его для нескольких элементов, прокручивается только последний инициализированный элемент. Я предполагаю, что причиной является способ, которым я использую setInterval, но я не понимаю, почему.
Функция для прокрутки выглядит следующим образом, а полный исходный код приведен выше.
function scrollRight() {
// Don't animate if the mouse is over the scrollah
if (hovering) { return; }
/* If we're at the end, flip back to the first image
* before animating, lest we view blankness in the wrapper
*/
if (position === nChildren) {
position = 0;
$wrapper.css('left', '0px');
}
// Animate to the next view
position ;
$wrapper.animate({
left: position*-width 'px'
}, 1000, 'swing', function() {
// Animation complete.
});
}
setInterval(scrollRight, 5000);
Итак, почему отдельные экземпляры этого плагина не прокручиваются еще раз, были инициализированы?
Комментарии:
1. Нужно увидеть больше кода, а именно определения
$wrapper
и других переменных.2. вы пробовали переносить первый аргумент в анонимную функцию :
setInterval(function(){scrollRight();},5000);
?3. @gion_13, это не имело бы никакого значения.
Ответ №1:
Я думаю, что если вы измените $wrapper = $this.find('.wrapper');
на var $wrapper = $this.find('.wrapper');
, это может сработать.
Узнал это на днях из Stack Overflow: переменные, которые не используют var
ключевое слово, неявно являются глобальными по области видимости, поэтому я думаю, что каждый скроллер перезаписывает одну и ту же глобальную $wrapper
переменную.
РЕДАКТИРОВАТЬ: возможно, также захочется сделать var $this = $(this);
.