JQuery, передавая это переменной функции - PullRequest
0 голосов
/ 13 декабря 2011

Я пытаюсь создать свой собственный ротатор изображений, который будет работать, если на экране несколько ротаторов изображений.Вот что я получил до сих пор:

// jQuery plugin to make image containers rotate.
(function($){

    // Swap text with title attribute
    $.fn.scWFWImageRotator = function() {

        var rotatorTimeSwap = 6000;

        $(this).find("img").removeClass("selected");
        $(this).find("img:first-child").addClass("selected");

        var rotatorImageChangeFunc = function(item) {
            var rotatorImages = $(item).children("img");
            var imgSelected = $(item).children("img.selected");
            var rotatorImgCount = rotatorImages.length;
            var rotatorCurImage = $(imgSelected).index(rotatorImages);
            alert(item);
        }

        return this.each(function() {

            var rotatorTimer;
            var $this  = $(this);
            var func = $.proxy( rotatorImageChangeFunc, $this );

            rotatorTimer = setInterval(func, rotatorTimeSwap);

            $this.hover(
                function() { rotatorTimer = clearInterval(rotatorTimer); },
                function() { rotatorTimer = setInterval(func, rotatorTimeSwap); }
            );

        });

    };

})(jQuery);

Проблема в том, что rotatorImageChangeFunc = function(item) { элемент не передается функции.Так что внутри этой функции я получаю неопределенный для элемента.Почему это так и как я могу это исправить?

Ответы [ 3 ]

1 голос
/ 13 декабря 2011

$.proxy только устанавливает this для обернутой функции - она ​​ничего не делает с параметрами функции.

setInterval() вызовет вашу прокси-функцию без параметров, и поэтому оригинал - item будет неопределенным.

Чтобы исправить, удалите item из объявления функции и выполните:

var item = this;

в первой строке функции.

[или переименовать все ссылки на item с помощью this].

1 голос
/ 13 декабря 2011

Параметр контекста, который вы передаете proxy, передается функции как this, а не как аргумент. Просто измените item на this.


Примечание: в вашей основной функции у вас есть пара $(this).find(...) с. this, который видит подключаемый модуль - это уже объект jQuert (именно поэтому ваш this.each(...) ниже работает), нет необходимости снова вызывать $() для него. Просто this.find(...).

0 голосов
/ 13 декабря 2011

Вы не определили переменный элемент где-либо еще.

...