Разверните эту рекурсию в цикл)
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, время: 03:39. |