> return true;
> }
> return false;
> } else if (node.nodeType == document.TEXT_NODE) {
> return node.nodeValue.indexOf(string) > -1;
> }
>}
>console.log(talksAbout(document.body, "книг"));
>// → true
Свойства текстового узла >nodeValue
содержит строчку текста.
Часто бывает полезным ориентироваться по этим ссылкам между родителями, детьми и родственными узлами и проходить по всему документу. Однако если нам нужен конкретный узел в документе, очень неудобно идти по нему, начиная с >document.body
и тупо перебирая жёстко заданный в коде путь. Поступая так, мы вносим в программу допущения о точной структуре документа – а её мы позже можем захотеть поменять. Другой усложняющий фактор – текстовые узлы создаются даже для пробелов между узлами. В документе из примера у тега >body
не три дочерних (>h1
и два >p
), а целых семь: эти три плюс пробелы до, после и между ними.
Так что если нам нужен атрибут >href
из ссылки, мы не должны писать в программе что-то вроде: «второй ребёнок шестого ребёнка document.body». Лучше бы, если б мы могли сказать: «первая ссылка в документе». И так можно сделать:
>var link = document.body.getElementsByTagName("a")[0];
>console.log(link.href);
У всех узлов-элементов есть метод >getElementsByTagName
, собирающий все элементы с данным тегом, которые происходят (прямые или не прямые потомки) от этого узла, и возвращает его в виде массивоподобного объекта.
Чтобы найти конкретный узел, можно задать ему атрибут >id
и использовать метод >document.getElementById
.
>Мой страус Гертруда:
>
>
> var ostrich = document.getElementById("gertrude");
> console.log(ostrich.src);
>
Третий метод – >getElementsByClassName
, который, как и >getElementsByTagName
, ищет в содержимом узла-элемента и возвращает все элементы, содержащие в своём классе заданную строчку.
Почти всё в структуре DOM можно менять. У узлов-элементов есть набор методов, которые используются для их изменения. Метод >removeChild
удаляет заданную дочерний узел. Для добавления узла можно использовать >appendChild
, который добавляет узел в конец списка, либо >insertBefore
, добавляющий узел, переданную первым аргументом, перед узлом, переданным вторым аргументом.
>Один
>Два
>Три
>
> var paragraphs = document.body.getElementsByTagName("p");
> document.body.insertBefore(paragraphs[2], paragraphs[0]);
>
Узел может существовать в документе только в одном месте. Поэтому вставляя параграф «Три» перед параграфом «Один» мы фактически удаляем его из конца списка и вставляем в начало, и получаем «Три/Один/Два». Все операции по вставке узла приведут к его исчезновению с текущей позиции (если у него таковая была).