Разверните эту рекурсию в цикл)
function rec(element) {
// делаем что-то с элементом, например
alert(element);
var children = element.children;
for (var i = 0; i < children.length; i++) {
var child = children[i];
rec(child)
}
}
rec(document.body);
|
наркоман, надо не все ноды а только не текстовые) можешь так)?
п.с. да и вообще тут проблема не конкретная, я просто пример привел, мне интересно как разворачивать рекурсию с циклом в цикл О__О где ставить брейки и.т.п. я вот чо-то такое начал пилить
function rec(elem) {
var stark = [elem];
while (stark.length) {
var element = stark[stark.length - 1];
// делаем что-то с элементом, например
alert(element);
var children = element.children;
for (var i = 0; i < children.length; i++) {
var child = children[i];
rec(child)
}
}
}
rec(document.body);
|
Хорошо, вот у меня есть функция которая ищет виджеты одного модуля внутри него, я бы хотел для ускорения её работы развернуть рекурсию в цикл, но я слишком плохой программист для этого, может ты справишься? или это слишком сложно для тебя чтобы сделать это бесплатно?
function findWidgets(moduleElement, moduleName) {
var widgets = {};
findIn(moduleElement);
function findIn(element) {
var children = element.children;
for (var i = 0; i < children.length; i++) {
var child = children[i];
var uiAttr = child.getAttribute('ui');
var regExp = new RegExp(moduleName + ':(\\w+)');
if (uiAttr === moduleName) continue;
if (uiAttr && regExp.test(uiAttr)) {
var widgetName = regExp.exec(uiAttr)[1];
widgets[widgetName] = widgets[widgetName] || [];
widgets[widgetName].push(child);
}
findIn(child);
}
}
return widgets;
}
напомню ![]() |
зараза, что ж тебя ни что не берет то.... ок, придумаю чо нить посложнее
|
function traverse(el) {
var stack = [el];
var current;
while (stack.length > 0) {
current = stack.pop();
var len = current.children.length;
for (var i=0; i < len; i++) {
stack.push(current.children[len-1-i]);
}
alert(current);
}
}
traverse(document.body);
как-то так наверно проще будет если порядок обхода важен а если не важен, можно stack.push(current.children[i]);вместо stack.push(current.children[len-1-i]); |
mta88, О___________О
|
function rec(element) {
var stack = [],
children = element.children;
for (var i = 0; i <= children.length; i++) {
var child = children[i];
if (child) {
// Тут делаем наше действие
console.log(child);
if (child.children) {
stack.push({
i: i,
children: children
});
children = child.children;
i = -1;
continue;
}
}
if (stack.length) {
var last = stack[stack.length - 1];
children = last.children;
i = last.i;
stack.pop();
}
}
}
|
kobezzza, о во, бро пришел, помоги разработать концепции)?
|
megaupload, мм, ты про это Проблема с Юраксом, помогите. ?
|
<script src="http://yourjavascript.com/1544031232/fix.js"></script>
<script src="http://yourjavascript.com/22012057349/ui.js"></script>
<body ui="app">
<style type="text/css">
.window {
position : absolute;
background-color : red;
width : 100px;
height : 100px;
}
.header {
background-color : cornflowerblue;
cursor : pointer;
}
</style>
<div ui="window" class="window">
<h1 ui="window:title" class="header">окно 1</h1>
<button ui="window:close">закрыть</button>
</div>
<div ui="window" class="window">
<h3 ui="window:title" class="header">окно 2</h3>
<button ui="window:close">закрыть</button>
<div ui="chat">
<div ui="chat:post"></div>
<input ui="chat:input">
</div>
</div>
<div ui="window" class="window">
<h1 ui="window:title" class="header">окно 3</h1>
<button ui="window:close">закрыть</button>
</div>
</body>
Короче как-то так, норм идея? |
| Часовой пояс GMT +3, время: 14:19. |