用法:domIterator(range.startContainer, range.endContainer)
代码:
function domIterator(startNode, endNode, ctx ) {
ctx = ctx || {
exitNode: endNode,
ret: [],
exit: false,
findingParentNext: false
};
var node = startNode;
var ret = ctx.ret;
if (ctx.exit) {
return ret;
}
do {
if (!node.equals(ret[ret.length - 1])) {
ret.push(node);
}
if (!ctx.findingParentNext && node.getChildCount && node.getChildCount()) {
domIterator(node.getFirst(), node.getLast(), ctx);
if (ctx.exit) {
break;
}
}
if (node.equals(ctx.exitNode)) {
ctx.exit = true;
break;
}
if (node.equals(endNode)) {
break;
}
if (node.getNext()) {
ctx.findingParentNext = false;
node = node.getNext();
} else {
var parent = node.getParent();
if (parent.equals(ctx.exitNode)) {
ctx.exit = true;
break;
}
if (parent.getNext()) {
ctx.findingParentNext = false;
node = parent.getNext();
} else {
ctx.findingParentNext = true;
node = parent;
}
}
}
while (node);
return ret;
}