1

这是我正在处理的模块:

var FeatureRotator = (function($,global) {
    var self = {},
        currentFeature = 0,
        images = [],
        imagePrefix = "/public/images/features/",
        timer = null,        
        totalImages = 0,
        initialFeature,
        interval,
        blendSpeed,
        element = null,
        img1 = null,
        img2 = null;

    function setVisibleImage(iid) {
        $("#img1").attr('src',images[iid].src).css('opacity',1);
        $("#img2").css('opacity',0);
        $(".active").removeClass("active");
        $("#f"+iid).addClass("active");
    }

    function setCurrentImage(id) {
        currentFeature = id;
        setVisibleImage(id);
    }

    function doHoverIn(position) {
        if (currentFeature === position) {
            self.pause();
        } else {
            setCurrentImage(global.parseInt(position, 10));
            self.pause();
        }
    }

    function doHoverOut(position) {
        self.unpause();
    }

    self.init = function(options,callback) {
        var i = 0,
            tempImg = null;

        interval = options.interval || 5000;
        blendSpeed = options.blendSpeed || 500;
        element = options.element;
        initialFeature = options.initialFeature || 0;
        img1 = $("<img/>").attr('id','img1');
        img2 = $("<img/>").attr('id','img2').css('opacity','0').css('margin-top',-options.height);

        $(element).append(img1).append(img2);

        totalImages = $(".feature").size();

        for (i = 0;i < totalImages; i++) {
            tempImg = new global.Image();
            tempImg.src = imagePrefix +"feature_" + i + ".png";
            images.push(tempImg);


            $("#f"+i).css('background-image',
                            'url("'+imagePrefix+"feature_"+i+"_thumb.png"+'")')
                     .hover(doHoverIn($(this).attr('position'))
                     , doHoverOut($(this).attr('position'))
                     ).attr('position',i);
        }

        setVisibleImage(initialFeature);

        if (options.autoStart) {
            self.start();
        }
        if (callback !== null) {
            callback();
        }
    };

    function updateImage() {        
        var active = $("#img1").css('opacity') === 1 ? "#img1" : "#img2";
        var nextFeature = (currentFeature === totalImages-1 ? 0 : currentFeature+1);

        if (active === "#img1") {
            $("#img2").attr('src',images[nextFeature].src);            
            $("#img2").fadeTo(blendSpeed, 1);            
            $("#img1").fadeTo(blendSpeed, 0);
        } else {
            $("#img1").attr('src',images[nextFeature].src);            
            $("#img1").fadeTo(blendSpeed, 1);            
            $("#img2").fadeTo(blendSpeed, 0);
        }

        $("#f"+currentFeature).removeClass("active");
        $("#f"+nextFeature).addClass("active");

        currentFeature = nextFeature;
    }



    self.start = function() {
        currentFeature = initialFeature;
        setVisibleImage(currentFeature);
        timer = global.setInterval(function(){
            updateImage();
        }, interval);
    };        

    self.pause = function() {
        global.clearTimeout(timer);
    };

    self.unpause = function() {
        timer = global.setInterval(function(){
            updateImage();
        }, interval);
    };


    return self;
}(this.jQuery, this));

以下是它在页面上的使用方式:

<script type="text/javascript">
        // ...

        $(function() {
            FeatureRotator.init({
                interval:5000,
                element:'#intro',
                autoStart:true,
                height:177,
                blendSpeed:1000,
                initialFeature:0
            });
        });
    </script>

问题是,当从 init 方法调用 setVisibleImage 时,iid 的值是 NaN。当调用 setVisibleImage 函数时,我已经通过调试器验证了“initialFeature”为 0,但可惜的是,该值并没有出现在那里。

谁能帮我确定问题出在哪里?我已经通过 JSLint 运行了代码,它回来了。

更新

好的,这是我更新的代码,它现在可以工作了,除了褪色不起作用,图像只是翻转到下一个并且不再平滑褪色:

var FeatureRotator = (function($,global) {
    var self = {},
        currentFeature = 0,
        images = [],
        imagePrefix = "/public/images/features/",
        timer = null,        
        totalImages = 0,
        initialFeature = 0,
        interval,
        blendSpeed;


    function setVisibleImage(iid) {
        $("#img1").attr('src',images[iid].src).css('opacity',1);
        $("#img2").css('opacity',0);
        $(".active").removeClass("active");
        $("#f"+iid).addClass("active");
    }

    function setCurrentImage(id) {
        currentFeature = id;
        setVisibleImage(id);
    }

    function doHoverIn(obj) {
        var position = global.parseInt(obj.target.attributes["position"].value,10);

        if (currentFeature === position) {
            self.pause();
        } else {
            setCurrentImage(global.parseInt(position, 10));
            self.pause();
        }
    }

    function doHoverOut() {
        self.unpause();
    }

    self.init = function(options,callback) {
        var i = 0,
            tempImg = null,
            element = null,
            img1 = null,
            img2 = null;

        interval = options.interval || 5000;
        blendSpeed = options.blendSpeed || 500;
        element = options.element;
        initialFeature = options.initialFeature || 0;
        img1 = $("<img/>").attr('id','img1');
        img2 = $("<img/>").attr('id','img2').css('opacity','0').css('margin-top',-options.height);

        $(element).append(img1).append(img2);

        totalImages = $(".feature").size();

        for (i = 0;i < totalImages; i++) {
            tempImg = new global.Image();
            tempImg.src = imagePrefix +"feature_" + i + ".png";
            images.push(tempImg);


            $("#f"+i).css('background-image','url("'+imagePrefix+"feature_"+i+"_thumb.png"+'")')
                     .hover(doHoverIn, doHoverOut)
                     .attr('position',i);
        }

        setVisibleImage(initialFeature);

        if (options.autoStart) {
            self.start();
        }
        if (typeof callback === "function") {
            callback();
        }
    };

    function updateImage() {        
        var active = $("#img1").css('opacity') === 1 ? "#img1" : "#img2";
        var nextFeature = (currentFeature === totalImages-1 ? 0 : currentFeature+1);

        if (active === "#img1") {
            $("#img2").attr('src',images[nextFeature].src);            
            $("#img2").fadeTo(blendSpeed, 1);            
            $("#img1").fadeTo(blendSpeed, 0);
        } else {
            $("#img1").attr('src',images[nextFeature].src);            
            $("#img1").fadeTo(blendSpeed, 1);            
            $("#img2").fadeTo(blendSpeed, 0);
        }

        $("#f"+currentFeature).removeClass("active");
        $("#f"+nextFeature).addClass("active");

        currentFeature = nextFeature;
    }



    self.start = function() {
        currentFeature = initialFeature;
        setVisibleImage(currentFeature);
        timer = global.setInterval(function(){
            updateImage();
        }, interval);
    };

    self.stop = function() {
        global.clearTimeout(timer);
    };

    self.pause = function() {
        global.clearTimeout(timer);
    };

    self.unpause = function() {
        timer = global.setInterval(function(){
            updateImage();
        }, interval);
    };


    return self;
}(this.jQuery, this));
4

1 回答 1

2

既然你得到了NaN,我猜它实际上是从这条线上发生的:

.hover(doHoverIn($(this).attr('position'))

...它称之为:

setCurrentImage(global.parseInt(position, 10)); // note the parseInt()

...它称之为:

setVisibleImage(id);

所以position被传递给parseInt来自$(this).attr('position'),这可能是一个无法解析为数字的值,所以你得到NaN.

for在语句块的第一行中检查该属性的值。

for (i = 0;i < totalImages; i++) {
    console.log( $(this).attr('position') ); // verify the value of position
    // ...
于 2011-02-04T20:39:35.557 回答