Простой вызов функции внутри модуля, получение NaN, а? - PullRequest
1 голос
/ 04 февраля 2011

Вот модуль, над которым я работаю:

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>

Проблема в том, что setVisibleImage вызывается изметод init, значение iid - NaN.Я прошел через отладчик и проверил, что 'initialFeature' равно 0, когда вызывается функция setVisibleImage, но, увы, значение не делает его там.

Может кто-нибудь помочь мне определить, в чем проблема?Я выполнил код через JSLint, и он вернулся чистым.

UPDATE

Хорошо, вот мой обновленный код, который работает сейчас, за исключением того, что замирание не работаетизображение просто переходит к следующему и перестает плавно исчезать:

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

1 Ответ

2 голосов
/ 04 февраля 2011

Так как вы получаете NaN, я предполагаю, что это на самом деле происходит из этой строки:

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

... которая вызывает это:

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

... который вызывает это:

setVisibleImage(id);

Таким образом, position, передаваемый на parseInt, приходит от $(this).attr('position'), что, вероятно, является значением, которое не может быть проанализировано в Number,вы получите NaN.

Проверьте значение этого атрибута в первой строке блока для оператора for.

for (i = 0;i < totalImages; i++) {
    console.log( $(this).attr('position') ); // verify the value of position
    // ...
...