Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.07.2012, 01:06
Новичок на форуме
Отправить личное сообщение для Nickolas Посмотреть профиль Найти все сообщения от Nickolas
 
Регистрация: 24.04.2012
Сообщений: 3

обход дерева DOM
Друзья, нужна рекурсивная функция обхода DOM дерева, можно с использованием jquery. желательно с комментариями, чтобы можно было разобраться. заранее спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 10.07.2012, 01:13
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

что значит рекурсивная? для каких целей? что бы обойти все элементы в DOM дереве, достаточно просто сделать:
var elems = document.getElementsByTagName('*');
for( var elem, i = 0; elem = elems[ i++ ]; ) {
    // some code
}
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #3 (permalink)  
Старый 10.07.2012, 01:47
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Мало ли зачем? Например нужны текстовые ноды.
Простейший вариант:
(function rec(el){
  var childs = el.childNodes, i = childs.length;
  while(i--) if( el.nodeType === 1 ) rec( childs[i] );
}(document.body))
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 10.07.2012, 10:00
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

Aetae,
непонятно зачем нужна рекурсия?
if (document.createNodeIterator && document.createTreeWalker){ //Traversal API
 texts = document.createNodeIterator( //создание NodeItertor
  document,//обход всего документа
  NodeFilter.SHOW_TEXT,//узлы текст
  null,//нету функции фильтра
  false//в HTML не используется
 );
 var text;
 while((text = texts.nextNode()) != null){
  //действия с узлами text
 }
}

Последний раз редактировалось Dim@, 10.07.2012 в 10:03.
Ответить с цитированием
  #5 (permalink)  
Старый 10.07.2012, 11:47
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от Dim@
непонятно зачем нужна рекурсия?
В IE8 ваш пример не работает
Ответить с цитированием
  #6 (permalink)  
Старый 10.07.2012, 11:51
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

IE9+
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 10.07.2012, 13:29
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

Gvozd,
ясно я просто на линуксе в FF сижу и тестить в браузерах не могу
Ответить с цитированием
  #8 (permalink)  
Старый 10.07.2012, 19:00
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

а как насчет замыканий типа
var next = document.body.firstChild;
function closers(){
 
next = next.nextSibling;
if(next !== null)setTimeout(closers);
}

писал в браузере если не будет работать скажите
Ответить с цитированием
  #9 (permalink)  
Старый 10.07.2012, 21:14
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

cyber,
работать то работает, только нельзя так проходит документ (он не делается плоским, а NodeInterator делает + структура HTML документов почти всегда имеет древоидное строение)
Ответить с цитированием
  #10 (permalink)  
Старый 10.07.2012, 21:52
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

ну это было показано для примера (не совсем удачный пример), вот полная рекурсия
<!DOCTYPE HTML>
<html>
  <head> </head>
  <body>
    <div id ='1'>
      <div id = '2'>
      
        <div id = '3'></div>
      </div>
    </div>
    
    <div id = 'result'></div>
    <script>

var elemS = document.getElementsByTagName('*');
var res = document.getElementById('result');
var i = 0,stop = elemS.length;
(function closers(){
 

result.innerHTML +=', '+ elemS[i].tagName; 
i++;
if(i < stop)setTimeout(closers,0);
}());

    </script>

  </body>
</html>

кстати делать полный перебор ДОМ дерева это плохо=)
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить список ВСЕХ элементов DOM Почемучкин Events/DOM/Window 7 16.04.2012 11:33
Как в браузерах реализуются функции DOM (например createElement) iamme Общие вопросы Javascript 7 02.09.2011 20:26
Как удалить элемент из дерева DOM dummer jQuery 13 16.01.2011 16:19
сохрание дерева DOM Paska Events/DOM/Window 3 02.08.2010 10:22
Сохранение дерева DOM в файл Александр1985 Общие вопросы Javascript 7 24.01.2009 23:15