我有一个* .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中更深入并再次出现时。我已经尝试了很多,但没有解决方法。
提前感谢您的帮助!
问候菲律宾
答案 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变量用于新项目就可以了。问候...