Подтвердить что ты не робот

Как получить все дочерние ноды в JS, включая всех "внуков"?

Я хочу сканировать div для всех дочернихNodes, включая те, которые расположены внутри других элементов. Прямо сейчас у меня есть это:

var t = document.getElementById('DivId').childNodes;
for(i=0; i<t.length; i++) alert(t[i].id);

Но он получает детей только от Div, а не от внуков. Спасибо!

Изменить: этот вопрос был слишком расплывчатым. Извини за это. Здесь скрипка:

http://jsfiddle.net/F6L2B/

Body.onload script не запускается в JSFiddle, но он работает, за исключением того, что поля ввода "Me Second" и "Me Third" не назначаются tabIndex и поэтому пропускаются.

4b9b3361

Ответ 1

Это самый быстрый и простой способ, и он работает во всех браузерах:

myDiv.getElementsByTagName("*")

Ответ 2

Если вы ищете все HTMLElement в современных браузерах, вы можете использовать:

myDiv.querySelectorAll("*")

Ответ 3

Как насчет правнуков?

Чтобы сделать сколь угодно глубоким, вы можете использовать рекурсивную функцию.

var alldescendants = [];

var t = document.getElementById('DivId').childNodes;
    for(i = 0; i < t.length; i++)
        if (t[i].nodeType == 1)
            recurseAndAdd(t[i], alldescendants);

function recurseAndAdd(el, descendants) {
  descendants.push(el.id);
  var children = el.childNodes;
  for(i=0; i < children.length; i++) {
     if (children[i].nodeType == 1) {
         recurseAndAdd(children[i]);
     }
  }
}

Если вы действительно хотите внуков, тогда вы можете вынуть рекурсию (и, вероятно, переименовать функцию)

function recurseAndAdd(el, descendants) {
  descendants.push(el.id);
  var children = el.childNodes;
  for(i=0; i < children.length; i++) {
     if (children[i].nodeType == 1) {
         descendants.push(children[i].id);
     }
  }
}