我将此代码移动到一个单独的函数中,它停止工作,为什么?

时间:2012-08-09 19:01:08

标签: javascript

以下是我的代码的摘录。您可以忽略其中的大部分内容:关注点是refreshDimensions方法,对zoomTo内部方法的调用以及调用后的代码块。

function refreshDimensions(node) {
    _("refreshdimensions");
    t = $("#contents");
    var other = $(selectednode).parent().parent(":not(#contents)");
    if(!other.length) {
    other = selectednode || zoomednode || start;
    t.width("100%");
    } else {
    t.width("100%");
    t.width((t.width() + other.position().left));
    }
    t.height($(other).position().top);

    /* Begin animating */

    t.animate({ fontSize: zoom }, {duration: 0, queue: false });

//    
}

function zoomTo(node, select) {
    var oldzoom, zoomdepth, t;
    oldzoom = zoomednode;
    if($(node)[0] != $(zoomednode)[0]) {
    savedepth = t = zoomdepth = $(node).parents("ul").length;
    if(!zoomednode)
        zoomednode = topChapter;
    $(zoomednode).toggleClass("zoomednode", false);
    if(!node)
        node = topChapter;
    /* capture values */
    var sz;
    var capp = cBaseSz.slice((zoom = zoomnum = sz = parseFloat(cBaseSz)+"").length);
    /* end capture */
    while(--t > 0) {
            zoomnum = (zoom *= 1.15);
    }
    zoom  += capp;
    zoomdepth -= $(zoomednode).parents("ul").length;
    if(zoomdepth < 0)
        zoomdepth *= -1;
    zoomednode = node;
    zoomednode.toggleClass("zoomednode", true);
    switch(select) {
    case 0:
    case false:
    default:
        break;
    case true:
    case 1:
        toggleNode(selectednode, false);
        toggleNode(node, true);
        break;
    case 2:
        toggleNode(zoomednode, false);
            zoomednode = 0;
    }


    /* Handle showing/hiding */

    //////////////////////////////
    //
    var showzoom = 1, showselect = 1, showidea = 1, seldepth, zdepth, showlist, hidelist = {};
    /* This is the 'brute force' way of doing it, horribly inefficient */
    if(zoomednode)
        zdepth = $(zoomednode).parents(".chapter").length;
    if(selectednode)
        seldepth = $(selectednode).parents(".chapter").length;
    else
        seldepth = zdepth;
    if(!seldepth)
        seldepth = zdepth = 0;
    showlist=$(".chapter, .idea").filter( function() {
        if($(this).parents("li").length < (zdepth+showzoom))
        return true;
        else {
        hidelist = $(hidelist).add(this);
        return false;
        }
    });


    $(showlist).show()/*.not(hidelist)*/;
    if(hidelist && hidelist.length) {
        $(hidelist).hide();
    }
    /* End showing/hiding */

    refreshDimensions(node);

    if(node) {
        _("top: " + $(zoomednode).position().top);
        $("html,body").stop().animate(
        { scrollTop: $(zoomednode).position().top - topAdjust }, {duration: 60+60*zoomdepth, queue: false }, 0);
    }

    }
    else {
    var dest;
    if($(zoomednode).parents(".chapter").length > 1)
        dest = $(zoomednode).parent().parent().prevAll(".chapter:first .chapterheading:first");
    else {
    //    if($(zoomednode)[0] != $("#contents")[0]) {
        toggleNode(selectednode, false);
        dest = $("#contents");
    //    } else
    //  dest = $(start);
    }
    zoomTo(dest, 0);
    }
}

所以我的问题是,当我在调用refreshDimensions(以'if(node){')开头的块之后移动代码位到refreshDimensions(最后)时,所需的效果停止工作。我已将该行使用的所有变量转储到控制台中,并且它们在两个实例中都是一致的,但是当我将代码移动到refreshDimensions时,我的页面被“捕获”在屏幕顶部并且根本不会滚动。这真的让我难过,因为一切都指向它应该完全相同...

1 个答案:

答案 0 :(得分:0)

原来是因为'zoomdepth'应该是全局变量而不是局部变量。