Первый элемент NodeList в document.body.childNodes - PullRequest
1 голос
/ 25 января 2012

Есть HTML-страница с таким содержимым.

enter image description here

Документация в MDN гласит, что childNodes returns a collection of child nodes of the given element, который является NodeList.

Итак, согласно документу, первый дочерний элемент для NodeList должен быть <h1>PyCon Video Archive</h1>.

Но в Инструментах разработчика (Chromium) все сказано иначе.

! [Введите описание изображения здесь] [2]

Итак, почему именно первый узел не <h1>PyCon Video Archive</h1>? Почему текстовый объект в качестве первого элемента?

Буду признателен за помощь.

EDIT

Итак, я только что понял, что в Firebug (FF) одна и та же функция ведет себя по-разному.

enter image description here

Мой новый вопрос: Является ли использование .childNodes () ненадежным способом доступа к элементам DOM?

Ответы [ 2 ]

1 голос
/ 25 января 2012

Чтобы получить первый элемент child, вы можете использовать ...

document.body.firstElementChild;

... но более старые brwosers не поддерживают это.


Метод, который имеет большую поддержку, это children collection ...

document.body.children[0];

..., которая имеет довольно хорошую поддержку, но все еще имеет некоторые дыры с точки зрения старых браузеров.

(Просто дважды проверьте, и если вы не поддерживаете Firefox 3 и если вы не включаете комментарии HTML-кода в разметку, использование .children будет безопасным.)


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

function firstElementChild( parent ) {

    var el = parent.firstChild;
    while( el && el.nodeType !== 1 )
        el = el.nextSibling;

    return el;
}

и используйте его вот так ...

var h1 = firstElementChild( document.body );
1 голос
/ 25 января 2012

Поскольку перед элементом h1 есть текстовый узел с пробелами. Предположительно, в источнике (если вы просматриваете источник) открывающий тег h1 был либо с отступом, либо перемещен на новую строку в теле (или в обоих) для удобства чтения. В предположении, я думаю, что это что-то вроде следующего:

<body>
    <h1>PyCon Video Archive</h1>
    <!-- ...other html... -->

Если вы измените это на:

<body><h1>PyCon Video Archive</h1><!-- ...other html... -->

Тогда первый childNode действительно будет элементом h1.

Стоит отметить, что текст, даже вне тега элемента, все еще является дочерним узлом родительского элемента. Хотя тот, который не может быть легко нацелен на селектор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...