Выразительный JavaScript (Хавербеке) - страница 132

>        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.

>

Мой страус Гертруда:

>


>

Третий метод – >getElementsByClassName, который, как и >getElementsByTagName, ищет в содержимом узла-элемента и возвращает все элементы, содержащие в своём классе заданную строчку.

Меняем документ

Почти всё в структуре DOM можно менять. У узлов-элементов есть набор методов, которые используются для их изменения. Метод >removeChild удаляет заданную дочерний узел. Для добавления узла можно использовать >appendChild, который добавляет узел в конец списка, либо >insertBefore, добавляющий узел, переданную первым аргументом, перед узлом, переданным вторым аргументом.

>

Один

>

Два

>

Три


>

Узел может существовать в документе только в одном месте. Поэтому вставляя параграф «Три» перед параграфом «Один» мы фактически удаляем его из конца списка и вставляем в начало, и получаем «Три/Один/Два». Все операции по вставке узла приведут к его исчезновению с текущей позиции (если у него таковая была).