Почему у setInterval, похоже, проблемы с областью действия в моем плагине jQuery?

#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); .