如何获取DOM的提取

时间:2012-03-03 14:06:15

标签: javascript xml dom

我有一个* .svg文件,我在这个函数中迭代地遍历

function traverseSVG( root ){
    var stack = [root];
    var c;
    var item = new Item( "root" );
    item.parent = item;

    while( stack.length > 0 ){
        c = stack[ stack.length - 1 ];
        if( c.nodeType == 1 && c.childNodes.length > 0 ){
            stack.push( c.firstChild );
        } else if( c.nextSibling != null ){
            stack.pop();
            stack.push( c.nextSibling );
        } else {
            while( stack.length > 0 ){
                c = stack.pop();
                if( c.nextSibling != null ){
                    stack.push( c.nextSibling );
                    break;
                }
            }
        }
    }
}

在item变量中,我想存储一些符合特定条件的元素。 item变量具有以下构造函数:

function Item( e ) {
    this.e = e;
    this.children = [];
    this.parent = null;
}
Item.prototype.addChild = function( c ){
    this.children.push( c );
    c.setParent( this );
    return c;
}
Item.prototype.setParent = function( p ){
    this.parent = p;
    return p;
}

例如,如果输入svg如下所示:sample svg,则Item应存储所有组和路径元素,并注意层次结构顺序。因此在新树中不应包含defs元素,但defs元素内的组应该成为defs parent的直接子元素。这就像输入DOM的提取。

如果输入的元素应包含在新DOM中,请考虑还有一个返回true或false的测试函数。我的问题是:我如何在遍历函数中包含这个,最好?问题是跟踪正确的当前项目,当遍历在DOM中更深入并再次出现时。我已经尝试了很多,但没有解决方法。

提前感谢您的帮助!

问候菲律宾

1 个答案:

答案 0 :(得分:0)

所以,经过一段时间的大脑扭曲后,我才开始工作。对于每个可能会执行类似任务的人来说,这是我的解决方案:

function traverseSVG( root ){
    var stack = [root];
    var c, i;
    var item = new Item( root );
        item.parent = item;

    while( stack.length > 0 ){
        i = null;
        c = stack[ stack.length - 1 ];

        if( Item.isItem( c ) && item.canAppend ){
            i = new Item( c );
            item.addChild( i );
        }


        if( c.nodeType == 1 && c.childNodes.length > 0 ){
            stack.push( c.firstChild );

            if( i != null ){
                item = i;
            }

        } else if( c.nextSibling != null ){
            stack.pop();
            stack.push( c.nextSibling );

        } else {
            while( stack.length > 0 ){
            c = stack.pop();

            if( c === item.e ){
                item = item.parent;
            }

                if( c.nextSibling != null ){
                stack.push( c.nextSibling );
                break;
            }
        }
    }
}

}

将i变量用于新项目就可以了。问候...