2011-11-30 1 views
32

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

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

Но он получает детей от Div, а не внуков. Благодаря!

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

http://jsfiddle.net/F6L2B/

Сценарий body.onload не работает на JSFiddle, но это работает, за исключением того, что «Me Второй» и поля ввода «Me» В-третьих, не будучи назначен TabIndex и поэтому пропущены.

ответ

48

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

myDiv.getElementsByTagName("*") 
+0

Далеко, лучший способ. Плюс это ваниль JS. – Davdriver

6

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

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

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); 
    } 
    } 
} 
+0

Для вашей функции требуется небольшое изменение, чтобы гарантировать, что к результатам будут добавлены только узлы (теги) элемента. Вам нужно проверить, что 'if (el.nodeType == 1) {...}' перед добавлением его в коллекцию. – Strelok

+0

@Strelok - как он выглядит сейчас - я, возможно, исправил его по-другому, пока вы писали этот комментарий. –

+2

Нет, это все равно. 'childNodes' возвращает * все *, включая текст внутри узлов, например' span', атрибуты, комментарии и т. д. Если вам нужны дочерние узлы, которые являются элементами (span, div, label, input и т. д.), вам нужно поставить чек на ' if (el.nodeType == 1) {...} ', где 1 указывает тип узла ELEMENT. – Strelok

13

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

myDiv.querySelectorAll("*") 
+12

Использование 'myDiv.getElementsByTagName (" * ")' почти наверняка будет быстрее, а также будет работать на гораздо более старых браузерах. – rvighne

+0

@rvighne Ваш комментарий должен был быть МАРКИРОВАННЫМ ответом на этот вопрос. – thednp

+0

Это действительно изобретательно. Престижность за ответ! –

Смежные вопросы