Jquery返回undefined

时间:2010-09-25 11:19:48

标签: jquery return

我正在使用制表符 http://www.hieu.co.uk/blog/index.php/tabswitch/

我正在尝试添加额外的功能来返回标签的总数 我试图在函数内返回一个值 getLength中的alert语句输出正确的值 但返回的值是未定义的

这是我的代码:

//the function within tabswitch function:
var getLength = function(){
   var $totalPages = parseInt((Obj.length));
   alert('getLength function totalPages = '+$totalPages);
   $('.pagetotal').html(' '+$totalPages); //this correctly sets the element to the correct value
   return ($totalPages); // this returns undefined?
}

function setTabIndex(){
   $totalPages = $('.SlideTab').tabSwitch('getlength'); //undefined?
   $mypage = parseInt($(".SlideTab").tabSwitch('index')+1);
   $currentIndex = parseInt($(".SlideTab").tabSwitch('index'));
   $('.pageon').html('Page '+$mypage+' of');
   alert('totalPages = '+$totalPages+' myPage = '+$mypage+' currentindex = '+$currentIndex); //returns undefined for total pages??  
   setButtons();
};

完整的标签开关代码:

/*
 * .tabSwitch
 * Version: 1.0
 * http://www.hieu.co.uk/blog/index.php/tabswitch/
 *
 * Copyright (c) 2009 Hieu Pham - http://www.hieu.co.uk
 * COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
 * http://www.opensource.org/licenses/cddl1.php
 *
 * Date: 14/04/2009
 */
(function($){
    $.fn.tabSwitch = function(command, Arguements, EndFunction) {
        //Default value should be set here
        var defaults = {
            type    :   "toggle", //Type of effect
            cols    :   2, //This only used when you're using type = table
            toggle  :   "fade", //This specific which type of toggle effect
            ease    :   40, 
            easeType:   "linear", //This isn't work for this version yet
            loopback:   0, //If it's 1 it will loop when it reach the ends
            width   :   400, // Size of the viewport
            height  :   400,
            index   :   0, //The current tab index
            speed   :   500, //Speed of the animation
            interval:   5000, //The interval of auto-animate
            step    :   1, //How many step you want to use in moveStep
            wrapperClass : "", //You could add extra class for the wraper
            viewportClass : "" //You could add extra class for the viewport
        };

        var Args = $.extend(defaults, Arguements);
        var Obj = this; 

        var $totalPages = (Obj.length);

        //For quicker access
        var jFirstObj = Obj.eq(1);
        var DOMFirstObj = Obj.eq(1).get(0); 
        if(!$.isFunction(EndFunction)){
            //Set the index in the cache
            var Callback = function(){
                $.data(DOMFirstObj, "index", Args.index);
            };
        }
        else{
            var Callback = function(){
                $.data(DOMFirstObj, "index", Args.index);
                EndFunction();
            };
        }
        //Back up orginal information
        StoreToCache = function(){
            //Now store the tab type in the cache for further use
            $.data(DOMFirstObj, "type", Args.type);
            $.data(DOMFirstObj, "toggle", Args.toggle);
            $.data(DOMFirstObj, "cols", Args.cols);
            $.data(DOMFirstObj, "ease", Args.ease);
            $.data(DOMFirstObj, "easeType", Args.easeType);
            $.data(DOMFirstObj, "index", Args.index);
            $.data(DOMFirstObj, "loopback", Args.loopback);
            //Before do anything to the object, keep a backup so we could revert it
            if(jFirstObj.attr('style')){
                $.data(DOMFirstObj, "orgAttr", jFirstObj.attr('style'));
            }else{
                $.data(DOMFirstObj, "orgAttr", "");
            }
        }
        //Remove all the data in cache and reset the object back to original
        backFromCache = function(){
            Obj.attr('style',$.data(DOMFirstObj, "orgAttr"));
            var ViewPortObj = $("#ViewPort"+$.data(DOMFirstObj));
            ViewPortObj.replaceWith(Obj);
            //Remove auto if it's running
            stopAuto();
            //Clear cacke
            $.removeData(DOMFirstObj);
        }
        //Execute when input comment is create
        var createTab = function(){
            //Back up orginal information
            StoreToCache(); 
            //Construct the form
            //Set all the CSS for the list div, this;s the common setting for all type of tab
            if(Args.width)  Obj.width(Args.width);
            if(Args.height) Obj.height(Args.height);            
            //A big wraper around and change some CSS of the wrap
            var WraperSelector = "WideDiv" + $.data(DOMFirstObj);
            Obj.wrapAll("<div id='"+WraperSelector +"'></div>");
            var WraperObj = $("#"+WraperSelector);
            WraperObj.addClass(Args.wraperClass);
            WraperObj.css({"position":"relative"});
            WraperObj.wrap("<div id='" +WraperSelector.replace("WideDiv","ViewPort") + "'></div>")
            //Now create the viewport with the input size
            var ViewPortObj = $("#" + WraperSelector.replace("WideDiv","ViewPort"));
            ViewPortObj.width(Args.width);
            ViewPortObj.height(Args.height);
            ViewPortObj.css({"display":"block","overflow":"hidden","position":"relative"});                 
            ViewPortObj.addClass(Args.viewportClass);
            switch(Args.type)
            {
                case "slide":
                    Obj.css({"float":"left"});
                    //A big wraper around and change some CSS of the wrap
                    WraperObj.width((Args.width+2) * Obj.length);
                    //Now create the viewport with the input size
                    break;
                case "scroll":
                    //A big wraper around and change some CSS of the wrap               
                    WraperObj.width(Args.width);
                    WraperObj.height((Args.height+2) * Obj.length);
                    break;
                case "toggle":
                    WraperObj.width(Args.width);
                    WraperObj.height(Args.height);
                    Obj.css({"position":"absolute", "left": "-999px"});
                    Obj.eq(Args.index).css({"left":"0px", "top":"0px"});
                    Obj.eq(Args.index).css("opacity", 1);
                    break;
                case "table":
                    WraperObj.width(Args.width*Args.cols);
                    Obj.css("float", "left");
            }
            moveTo();
        }

        var getLength = function(){
            //$totalPages = parseInt((Obj.length));
            alert('getLength function totalPages = '+$totalPages);
            $('.pagetotal').html(' '+$totalPages);
            return ($totalPages);
        }
        // Move object to a position set by Args.Index
        var moveTo = function(){

            //get the easeLevel from the cache
            var ease = 0;
            //Check if the next idx is out of the limit or not
            if(!Args.easeType){
                Args.easeType = (DOMFirstObj, "easeType");
            }
            if(Args.index > Obj.length -1 ){
                if($.data(DOMFirstObj, "loopback")!=0){
                    Args.index = 0;
                    ease = -$.data(DOMFirstObj, "ease");
                }
                else return;
            }
            if(Args.index < 0 ){
                if($.data(DOMFirstObj, "loopback")!=0){                 
                    Args.index = Obj.length-1;
                    ease = $.data(DOMFirstObj, "ease");
                } else return;
            }   
            var WraperSelector = "WideDiv" + $.data(DOMFirstObj);               
            var WraperObj = $("#"+WraperSelector);
            //See what type of effect we stimulate
            switch($.data(DOMFirstObj, "type")){
                case 'slide':
                    //Get how much ease we set and start the animation
                    if(ease!=0){
                        var easeLevel = (parseInt(WraperObj.css("left").replace("px",""))+ease);
                        WraperObj.animate({left: easeLevel+"px"}, Args.speed, function(){
                            WraperObj.animate({left:-(Obj.outerWidth(true) * Args.index)+"px"}, Args.speed, Args.easeType, Callback());         
                        });
                    }else{
                        WraperObj.animate({left:-(Obj.outerWidth(true) * Args.index)+"px"}, Args.speed, Args.easeType, Callback());         
                    }               
                break;
                case 'scroll':
                    //Get how much ease we set and start the animation
                    if(ease!=0){
                        var easeLevel = (parseInt(WraperObj.css("top").replace("px",""))+ease);
                        WraperObj.animate({top: easeLevel+"px"}, Args.speed, function(){
                            WraperObj.animate({top:-(Obj.outerHeight(true) * Args.index)+"px"}, Args.speed, Args.easeType, Callback());         
                        });
                    }else{
                        WraperObj.animate({top:-(Obj.outerHeight(true) * Args.index)+"px"}, Args.speed, Args.easeType, Callback());         
                    }
                break;
                case 'toggle':
                    //move the new one on top of the old div
                    Obj.eq(Args.index).css({"left":"0px", "top":"0px"});
                    switch($.data(DOMFirstObj, "toggle"))
                    {
                        case "fade":
                            Obj.eq(Args.index).css({"opacity":0});                                              
                            Obj.eq(Args.index).animate({"opacity":1},Args.speed);
                            if($.data(DOMFirstObj, "index")!=Args.index){
                                Obj.eq($.data(DOMFirstObj, "index")).animate({"opacity":0},Args.speed, function(){
                                    $(this).css("left",-999);
                                    Callback();
                                });
                            }
                            break;
                        case "toggle":
                            if($.data(DOMFirstObj, "index")!=Args.index){                           
                                Obj.eq(Args.index).css({"display":"none"});
                                Obj.eq($.data(DOMFirstObj, "index")).slideUp(Args.speed,  function(){
                                    Obj.eq(Args.index).slideDown(Args.speed, function(){Callback();});                          
                                    $(this).css("left",-999);                                                   
                                });
                            }
                            break;
                        case "show":
                            if($.data(DOMFirstObj, "index")!=Args.index){                                       
                                Obj.eq(Args.index).css({"display":"none"});
                                Obj.eq($.data(DOMFirstObj, "index")).hide(Args.speed, function(){
                                    Obj.eq(Args.index).show(Args.speed,function(){Callback();});                            
                                    $(this).css("left",-999);                                                   
                                });
                            }
                            break;
                        case "noeffect":
                            if($.data(DOMFirstObj, "index")!=Args.index){               
                                Obj.eq($.data(DOMFirstObj, "index")).css("left", -999);
                                Callback();
                            }
                            break;
                    }
                    break;
                case "table":
                    var cols = $.data(DOMFirstObj, "cols");
                    //Where the next idx in the table
                    var nextX = -(Args.index % cols) * Obj.width();
                    var nextY = -Math.floor(Args.index / cols) * Obj.height();
                    //Move horizontal first
                    WraperObj.animate({"left": nextX}, Args.speed, Args.easeType, function(){
                        WraperObj.animate({"top": nextY}, Args.speed, Args.easeType, Callback());
                    });
                    break;
                default:
                    $('html,body').animate({"scrollTop":Obj.eq(Args.index).offset().top},Args.speed);
                break;

            }
        };

        //Move by steps
        moveStep = function(){
            var currentIdx = $.data(DOMFirstObj, "index");
            //Calculate the next index
            Args.index = parseInt(currentIdx) + parseInt(Args.step);
            //Then move to it
            moveTo();
        }
        //Set it run auto
        startAuto = function(){
            //Save the autoswitch into memory and start it
            $.data(DOMFirstObj, "AutoSwitch", setInterval(moveStep, Args.interval));
        }
        //Stop the auto
        stopAuto = function(){
            //Stop the interval and clear the cache
            clearInterval($.data(DOMFirstObj, "AutoSwitch"));
            $.removeData(DOMFirstObj, "AutoSwitch");
        }
        //Toggle auto
        toggleAuto = function(){
            if(isAuto()){
                stopAuto();
            }else{
                startAuto();
            }
        }
        //Return if this is auto or not
        isAuto = function(){
            if($.data(DOMFirstObj, "AutoSwitch")){
                return true;
            }else{
                return false;
            }       
        }
        if(!command) command = "";
        //Check what user want
        switch(command.toLowerCase()){
            case "index": 
                if($.data(DOMFirstObj, "index")){
                    return $.data(DOMFirstObj, "index");
                }else{
                    return 0;
                }
                break;
            case "moveto":
                moveTo();
                break;
            case "movestep":
                moveStep();
                break;
            case "destroy":
                backFromCache();
                break;
            case "create":
                createTab();
                break;
            case "isauto":
                return isAuto();
                break;
            case "toggleauto":
                toggleAuto();
                break;
            case "startauto":
                startAuto();
                break;
            case "stopauto":
                stopAuto();
                break;
            case "getlength":
                getLength();
                break;
            case "pagecount":
                pageCount();
                break;
        }
    };
})(jQuery);

1 个答案:

答案 0 :(得分:1)

套管在这里很重要,你可能需要拨打getLength而不是getlength,如下所示:

$totalPages = $('.SlideTab').tabSwitch('getLength'); 

此外,您提醒并返回不同的变量,您还需要在.html()来电中使用$totalPages

$('.pagetotal').html(' '+$totalPages);