Как насчет объединения дочерних узлов, если они есть, и использования цикла while(nodes.length)
?По сути, продолжайте добавлять новые узлы в стек и продолжайте цикл (каждый раз проверяя один узел), пока стек не станет пустым: http://jsfiddle.net/gEm77/1/.
var z = 0; // my precaution for a while(true) loop
function iterativelyWalk(nodes, cb) {
nodes = [].slice.call(nodes);
while(++z < 100 && nodes.length) {
var node = nodes.shift(),
ret = cb(node);
if (ret) {
return ret;
}
if (node.childNodes.length) {
nodes = [].slice.call(node.childNodes).concat(nodes);
}
}
}