jquery将此传递给变量函数

时间:2011-12-13 13:18:43

标签: javascript jquery jquery-plugins anonymous-function

如果屏幕上有多个图像旋转器,我正在尝试制作自己的图像旋转器。这是我到目前为止所得到的:

// 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 个答案:

答案 0 :(得分:1)

传递给proxy的上下文参数作为this传递给函数,而不是参数。只需将item更改为this


旁注:在您的主要功能中,您有几个$(this).find(...)个。插件函数看到的this 已经一个jQuert对象(这就是下面的this.each(...)有效的原因),无需再次调用$() 。只需this.find(...)

答案 1 :(得分:1)

$.proxy仅为包装函数设置this - 它不对函数参数执行任何操作。

setInterval()会在没有参数的情况下调用您的代理函数,因此原始版本item也将是未定义的。

要修复,请从函数声明中删除item,并执行:

var item = this;

在函数的第一行。

[或使用item重命名对this的所有引用。

答案 2 :(得分:-1)

您尚未定义变量项anaywhere。