WEB开发网
开发学院网页设计JavaScript DTree中致命的递归 阅读

DTree中致命的递归

 2010-09-14 13:43:23 来源:WEB开发网   
核心提示: 3. openTo()方法中的递归和closeAllChildren()方法中的递归,同样,DTree中致命的递归(5),closeAllChildren()方法中的递归会由closeLevel()方法引起,dTree.prototype.openTo=function(nId,bSel

3. openTo()方法中的递归和closeAllChildren()方法中的递归。同样,closeAllChildren()方法中的递归会由closeLevel()方法引起。

dTree.prototype.openTo = function (nId, bSelect, bFirst) {
    if (!bFirst) {
        for (var n = 0; n < this.aNodes.length; n++) {
            if (this.aNodes[n].id == nId) {
                nId = n;
                break;
            }
        }
    }
    var cn = this.aNodes[nId];
    if (cn.pid == this.root.id || !cn._p) {
        return;
    }
    cn._io = true;
    cn._is = bSelect;
    if (this.completed && cn._hc) {
        this.nodeStatus(true, cn._ai, cn._ls);
    }
    if (this.completed && bSelect) {
        this.s(cn._ai);
    } else {
        if (bSelect) {
            this._sn = cn._ai;
        }
    }
    this.openTo(cn._p._ai, false, true);
};

dTree.prototype.closeAllChildren = function (node) {
    for (var n = 0; n < this.aNodes.length; n++) {
        if (this.aNodes[n].pid == node.id && this.aNodes[n]._hc) {
            if (this.aNodes[n]._io) {
                this.nodeStatus(false, n, this.aNodes[n]._ls);
            }
            this.aNodes[n]._io = false;
            this.closeAllChildren(this.aNodes[n]);
        }
    }
};

另外,大部分的方法中都包含了循环,整个代码的结构就是循环套递归,递归套循环。当节点数少时是发现不了问题的,节点数多的时候还不仅仅是加载树的过程特别慢,直接就是一个致命的错误——堆栈溢出!事实上,我所用来测试的数据不超过1000个节点,问题的关键就在于DTree树不像梅花雪树那样去动态地加载节点,它是一次性将所有的节点都加载完毕。当然,如果树比较小,DTree在使用上还是很方便的,毕竟它的结构比梅花雪树要简单,也没有那些过多的资源和js脚本需要引入。

最后,我在后面还是给出我测试用的代码吧,读者可以使用Tree.htm文件中的测试数据进行测试,我给了两组数据用来测试,一组数据节点比较少,是可以正常使用的,一组数据节点很多,会报堆栈溢出的错误。

上一页  1 2 3 4 5 

Tags:DTree 致命 递归

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接