Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.05.2013, 14:48
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Разверните эту рекурсию в цикл)
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);
Ответить с цитированием
  #2 (permalink)  
Старый 24.05.2013, 15:30
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

наркоман, надо не все ноды а только не текстовые) можешь так)?


п.с. да и вообще тут проблема не конкретная, я просто пример привел, мне интересно как разворачивать рекурсию с циклом в цикл О__О

где ставить брейки и.т.п.


я вот чо-то такое начал пилить


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);
Ответить с цитированием
  #3 (permalink)  
Старый 24.05.2013, 16:03
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Хорошо, вот у меня есть функция которая ищет виджеты одного модуля внутри него, я бы хотел для ускорения её работы развернуть рекурсию в цикл, но я слишком плохой программист для этого, может ты справишься? или это слишком сложно для тебя чтобы сделать это бесплатно?

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;
  }


напомню

Последний раз редактировалось megaupload, 24.05.2013 в 16:09.
Ответить с цитированием
  #4 (permalink)  
Старый 24.05.2013, 16:34
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

зараза, что ж тебя ни что не берет то.... ок, придумаю чо нить посложнее
Ответить с цитированием
  #5 (permalink)  
Старый 24.05.2013, 17:23
Профессор
Отправить личное сообщение для mta88 Посмотреть профиль Найти все сообщения от mta88
 
Регистрация: 16.05.2013
Сообщений: 229

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]);
Ответить с цитированием
  #6 (permalink)  
Старый 24.05.2013, 17:29
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

mta88, О___________О
Ответить с цитированием
  #7 (permalink)  
Старый 24.05.2013, 18:22
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

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
code monkey
Ответить с цитированием
  #8 (permalink)  
Старый 24.05.2013, 18:25
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

kobezzza, о во, бро пришел, помоги разработать концепции)?

Последний раз редактировалось megaupload, 24.05.2013 в 18:30.
Ответить с цитированием
  #9 (permalink)  
Старый 24.05.2013, 18:29
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

megaupload, мм, ты про это Проблема с Юраксом, помогите. ?
__________________
kobezzza
code monkey
Ответить с цитированием
  #10 (permalink)  
Старый 24.05.2013, 18:30
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

<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>


Короче как-то так, норм идея?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать чтобы цикл не запускался второй раз Brook Events/DOM/Window 5 12.05.2013 20:43
Цикл без подвисания MatrixGru jQuery 5 08.03.2013 09:21
Как обработать бесконечный цикл? Iktash Элементы интерфейса 3 16.11.2012 08:26
Нужен цикл для создания огромного массива apish Общие вопросы Javascript 2 20.09.2012 15:10
Бесконечный цикл Sundro Общие вопросы Javascript 8 08.08.2011 12:58