Глава 4.3. Узлы дерева документаВ этой главе мы рассматриваем базовый тип узлов дерева документа и списки, образованные такими узлами. 4.3.1. Абстрактный узел: интерфейс NodeПоддержка: Поддерживается для XML-документов (XMLDOMNode); для HTML-документов поддерживается частично. DOM 1 полностью, DOM 2 частично. Интерфейс Node соответствует абстрактному узлу дерева XML- или HTML-документа. Все конкретные составляющие документа реализуются интерфейсами, которые являются его потомками. Тип узла задается значением его свойства nodeType в соответствии со следующей таблицей:
Значения свойств узла nodeName, nodeValue и attributes меняются в зависимости от его типа:
Примечание. Internet Explorer поддерживает только узлы типа Element, Attr и Text. Для остальных типов узлов перечисленные в таблице свойства не определены.
Свойство attributesСинтаксис: узел.attributes Изменяемое: нет Поддержка: Для XML-документов соответствует стандарту; для HTML-документов частично (см. прим.). Соответствует стандарту. Свойство attributes возвращает объект типа NamedNodeMap, содержащий список всех атрибутов данного узла, если узел имеет тип Element, и null в противном случае. Примечание. В Internet Explorer это свойство реализовано нестандартно:
Следующий пример <BODY bgcolor="yellow" text="green"> <SCRIPT> var body = document.getElementsByTagName("BODY")[0]; var attrs = body.attributes; for (var i = 0; i < attrs.length; i++) { if (attrs[i].nodeValue) document.write(attrs[i].nodeName, "=", attrs[i].nodeValue, " "); } </SCRIPT> </BODY> выведет в Gecko текст: bgcolor=yellow text=green, Свойство childNodesСинтаксис: узел.childNodes Изменяемое: нет Поддержка: Соответствует стандарту. Соответствует стандарту. Свойство childNodes возвращает объект типа NodeList, содержащий список всех детей данного узла. Если узел не имеет детей, то возвращается список нулевой длины. Следующий пример <BODY> <SCRIPT> var body = document.getElementsByTagName("BODY")[0]; var list = body.childNodes; for (var i = 0; i < list.length; i++) { document.write(list[i].nodeName, " "); } </SCRIPT> </BODY> выведет в Gecko текст: #text SCRIPT, а в Internet Explorer: SCRIPT #text. Как мы видим, порядок элементов в списке может быть любым; гарантируется только, что в нем присутствуют все дети данного узла. Свойство firstChildСинтаксис: узел.firstChild Изменяемое: нет Поддержка: Соответствует стандарту. Соответствует стандарту. Свойство firstChild возвращает указатель на первый узел, являющийся сыном
данного узла. Если узел не имеет детей, то возвращается null. Это свойство
эквивалентно выражению Свойство lastChildСинтаксис: узел.lastChild Изменяемое: нет Поддержка: Соответствует стандарту. Соответствует стандарту. Свойство lastChild возвращает указатель на последний узел, являющийся сыном
данного узла. Если узел не имеет детей, то возвращается null. Это свойство
эквивалентно выражению Свойство localNameСинтаксис: узел.localName Изменяемое: нет Поддержка: Не поддерживается. Не поддерживается. Свойство localName возвращает строку, содержащую локальную часть ограниченного имени узла. Оно имеет смысл только для узлов типа Element и Attr, созданных соответственно методами CreateElementNS и CreateAttributeNS. В остальных случаях возвращается null. Свойство namespaceURIСинтаксис: узел.namespaceURI Изменяемое: нет Поддержка: Только для XML-документов. Не поддерживается. Свойство namespaceURI возвращает строку, содержащую URI пространства имен данного узла. Оно имеет смысл только для узлов типа Element и Attr, созданных соответственно методами CreateElementNS и CreateAttributeNS. В остальных случаях возвращается null. Свойство nextSiblingСинтаксис: узел.nextSibling Изменяемое: нет Поддержка: Соответствует стандарту. Соответствует стандарту. Свойство nextSibling возвращает указатель на узел, непосредственно следующий в документе за данным узлом. Если такого узла нет, то возвращается null. Свойство nodeNameСинтаксис: узел.nodeName Изменяемое: нет Поддержка: Для XML-документов соответствует стандарту; для HTML-документов частично (см. прим. к Таблице 4.4). Соответствует стандарту. Свойство nodeName возвращает строку, содержащую имя данного узла согласно
Таблицы 4.4. Пример: оператор Свойство nodeTypeСинтаксис: узел.nodeType Изменяемое: нет Поддержка: Для XML-документов соответствует стандарту; для HTML-документов частично (см. прим.). Соответствует стандарту. Свойство nodeType возвращает тип данного узла согласно Таблицы 4.3. Примечание. В Internet Explorer это свойство реализовано для узлов Element и Text. Для остальных типов узлов оно не определено. Пример: оператор Свойство nodeValueСинтаксис: узел.nodeValue Изменяемое: да Исключения: NO_MODIFICATION_ALLOWED_ERR (при записи), DOMSTRING_SIZE_ERR (при чтении) Поддержка: Cоответствует стандарту. Соответствует стандарту. Свойство nodeValue обеспечивает доступ к значению данного узла. Значение узла зависит от его типа (см. Таблицу 4.4). Если значением узла может быть только null, то попытка изменить его значение игнорируется. Пример: var text = document.createTextNode(""); text.nodeValue = "Пример абзаца."; var elem = document.createElement("P"); elem.appendChild(text); document.body.appendChild(elem); Свойство ownerDocumentСинтаксис: узел.ownerDocument Изменяемое: нет Поддержка: Только для XML-документов. Соответствует стандарту. Свойство ownerDocument возвращает указатель на объект Document, к которому принадлежит данный узел. Для узлов типа Document и DocumentType, которые еще не связаны с конкретным документом, возвращается null. Пример: var elem = document.createElement("P"); document.body.appendChild(elem); alert(elem.ownerDocument.documentElement.nodeName); Свойство parentNodeСинтаксис: узел.parentNode Изменяемое: нет Поддержка: Соответствует стандарту. Соответствует стандарту. Свойство parentNode возвращает указатель на узел, являющийся отцом данного узла. Если узел не имеет отца, то возвращается null. Свойство prefixСинтаксис: узел.prefix Изменяемое: да Исключения: INVALID_CHARACTER_ERR, NO_MODIFICATION_ALLOWED_ERR, NAMESPACE_ERR Поддержка: Только для XML-документов; неизменяемое. Не поддерживается. Свойство prefix возвращает строку, содержащую префикс пространства имен данного узла. Оно имеет смысл только для узлов типа Element и Attr, созданных соответственно методами CreateElementNS и CreateAttributeNS. В остальных случаях возвращается null. При записи этого свойства автоматически изменяются свойство узла nodeName, содержащее ограниченное имя узла, а также свойства tagName (если это Element) и name (если это Attr). Свойство previousSiblingСинтаксис: узел.previousSibling Изменяемое: нет Поддержка: Соответствует стандарту. Соответствует стандарту. Свойство previousSibling возвращает указатель на узел, непосредственно предшествующий в документе данному узлу. Если такого узла нет, то возвращается null. Метод appendChildСинтаксис: узел.appendChild(newChild) Аргументы: newChild выражение типа Node Результат: узел Node Исключения: HIERARCHY_REQUEST_ERR, WRONG_DOCUMENT_ERR, NO_MODIFICATION_ALLOWED_ERR Поддержка: Соответствует стандарту. Соответствует стандарту. Метод appendChild добавляет узел newChild в конец списка детей данного узла и возвращает его в качестве результата. Если узел newChild уже был в списке, то он сначала удаляется, а затем добавляется. Пример: сценарий var elem = document.createElement("IMG"); document.body.appendChild(elem); alert(document.body.lastChild.tagName); выведет на экран текст IMG. Метод cloneNodeСинтаксис: узел.cloneNode(deep) Аргументы: deep логическое выражение Результат: новый узел Node Исключения: нет Поддержка: Соответствует стандарту. Соответствует стандарту. Метод cloneNode создает копию данного узла и возвращает ее. Если аргумент deep равен true, то создается копия поддерева документа, начиная с данного узла; если он равен false, то копируется только сам узел (и его атрибуты, если это Element). Метод hasAttributesСинтаксис: узел.hasAttributes() Результат: логическое значение Исключения: нет Поддержка: Не поддерживается. Соответствует стандарту. Метод hasAttributes возвращает true, если узел является элементом
и имеет хотя бы один атрибут. В остальных случаях возвращается false. Вызов
этого метода эквивалентен выражению Метод hasChildNodesСинтаксис: узел.hasChildNodes() Результат: логическое значение Исключения: нет Поддержка: Соответствует стандарту. Соответствует стандарту. Метод hasChildNodes возвращает true, если узел имеет хотя
бы одного ребенка; в противном случае возвращается false. Вызов этого метода
эквивалентен выражению Метод insertBeforeСинтаксис: узел.insertBefore(newChild, refChild) Аргументы: newChild, refChild выражения типа Node Результат: узел Node Исключения: HIERARCHY_REQUEST_ERR, WRONG_DOCUMENT_ERR, NO_MODIFICATION_ALLOWED_ERR, NOT_FOUND_ERR Поддержка: Соответствует стандарту. Соответствует стандарту. Метод insertBefore вставляет узел newChild в список детей данного узла перед узлом refChild и возвращает его в качестве результата. Если узел newChild уже был в списке, то он сначала удаляется, а затем добавляется. Пример: сценарий var elem = document.createElement("IMG"); document.body.insertBefore(elem, document.body.firstChild); alert(document.body.firstChild.tagName); выведет на экран текст IMG. Метод isSupportedСинтаксис: объект.isSupported(feature, version) Аргументы: feature, version выражения типа DOMString Результат: логическое значение Исключения: нет Поддержка: Не поддерживается. Соответствует стандарту. Метод isSupported возвращает true, если реализация DOM поддерживает указанное свойство, и false в противном случае. Имя свойства (в любом регистре) задается аргументом feature; оно должно соответствовать правилам образования имен XML. Аргумент version задает имя версии проверяемого свойства. Если он не задан, то возвращается true, если поддерживается хотя бы какая-то версия данного свойства. Ср. метод DOMImplementation.hasFeature. В Gecko значениями feature могут быть строки "XML" и "HTML", а значением version строки "1.0" и "2.0". Пример: alert(document.body.isSupported("HTML", "1.0")); alert(document.body.isSupported("HTML", "2.0")); alert(document.body.isSupported("HTML", "3.0")); Первые два оператора alert выведут строку true, а третий false. Метод normalizeСинтаксис: узел.normalize() Исключения: нет Поддержка: Только для XML-документов. Соответствует стандарту. Метод normalize нормализует текстовое содержимое данного узла. Нормализация состоит в том, что пустые текстовые узлы удаляются, а соседние текстовые узлы сливаются в один. В результате остаются только текстовые узлы, разделенные какими-либо символами разметки (тегами, комментариями, директивами, секциями CDATA или ссылками на разделы). Нормализованная форма элементов дерева обеспечивает неизменность его структуры при сохранении и перезагрузке. Следующий пример нормализует все абзацы документа. var pars = document.getElementsByTagName("P"); for (var i = 0; i < pars.length; i++) pars[i].normalize(); Метод removeChildСинтаксис: узел.removeChild(oldChild) Аргументы: oldChild выражение типа Node Результат: узел Node Исключения: NO_MODIFICATION_ALLOWED_ERR, NOT_FOUND_ERR Поддержка: Соответствует стандарту. Соответствует стандарту. Метод removeChild удаляет узел oldChild из списка детей данного узла и возвращает его в качестве результата. Пример: document.body.removeChild(document.body.firstChild); Метод replaceChildСинтаксис: узел.replaceChild(newChild, oldChild) Аргументы: newChild, oldChild выражения типа Node Результат: узел Node Исключения: HIERARCHY_REQUEST_ERR, WRONG_DOCUMENT_ERR, NO_MODIFICATION_ALLOWED_ERR, NOT_FOUND_ERR Поддержка: Соответствует стандарту. Соответствует стандарту. Метод replaceChild заменяет узел oldChild в списке детей данного узла на узел newChild и возвращает oldChild в качестве результата. Если newChild уже был в списке детей, то он удаляется из него до замены. Пример: var elem = document.createElement("P"); document.body.replaceChild(elem, document.body.firstChild); 4.3.2. Упорядоченный список узлов: интерфейс NodeListПоддержка: Для XML-документов соответствует стандарту (XMLDOMNodeList); для HTML-документов поддерживается в виде коллекций. Соответствует стандарту. Интерфейс NodeList реализует упорядоченные списки узлов, которые возвращаются многими свойствами и методами DOM. Списки узлов в DOM являются живыми, т. е. любое изменение документа влечет автоматическое изменение всех связанных с ним списков. Этот интерфейс имеет единственное свойство length, возвращающее количество узлов в списке, и единственный метод item, возвращающий элемент списка с заданным номером (элементы списка узлов нумеруются, начиная с нуля). Свойство lengthСинтаксис: список.length Изменяемое: нет Поддержка: Cоответствует стандарту. Соответствует стандарту. Свойство length возвращает количество элементов в данном списке. Допустимые индексы элементов списка лежат в диапазоне от 0 до length-1 включительно. Следующий пример выводит на экран количество элементов в дереве документа: alert(document.getElementsByTagName("*").length); // в Gecko (стандарт) alert(document.all.length); // в Internet Explorer Метод itemСинтаксис: список.item(index) Аргументы: index числовое выражение Результат: узел Node или null Исключения: нет Поддержка: Соответствует стандарту. Соответствует стандарту. Метод item возвращает элемент списка узлов с заданным индексом в качестве результата. Если индекс выходит за пределы диапазона элементов списка, то возвращается null. Пример: оператор alert(document.childNodes.item(0).nodeName); выведет на экран текст HTML. JavaScript позволяет нам записать обращение к элементу списка более компактно. Предыдущий оператор может выглядеть так: alert(document.childNodes[0].nodeName); Internet Explorer поддерживает еще одну форму обращения к элементу списка, а именно: alert(document.childNodes(0).nodeName); Однако, эта форма является нестандартной, и ей лучше не пользоваться. 4.3.3. Неупорядоченный список узлов: интерфейс NamedNodeMapПоддержка: Для XML-документов соответствует стандарту (XMLDOMNamedNodeMap); для HTML-документов поддерживается в виде коллекций. Соответствует стандарту. Интерфейс NamedNodeMap реализует неупорядоченные списки узлов, доступ к которым осуществляется по имени узла. Эти списки также являются живыми, т. е. любое изменение документа влечет автоматическое изменение всех связанных с ним списков. DOM допускает возможность доступа к элементам списка NamedNodeMap по их номеру в списке, но подчеркивает, что эта возможность не означает упорядоченности списка по какому-либо признаку. Этот интерфейс имеет единственное свойство length, возвращающее количество узлов в списке, и несколько методов, обеспечивающих доступ к элементам списка:
Свойство lengthСинтаксис: список.length Изменяемое: нет Поддержка: Cоответствует стандарту. Соответствует стандарту. Свойство length возвращает количество элементов в данном списке. Допустимые индексы элементов списка лежат в диапазоне от 0 до length-1 включительно. Следующий пример выводит на экран количество атрибутов элемента BODY: alert(document.body.attributes.length); Метод getNamedItemСинтаксис: список.getNamedItem(name) Аргументы: name выражение типа DOMString Результат: узел Node или null Исключения: нет Поддержка: Только для XML-документов. Соответствует стандарту. Метод getNamedItem возвращает элемент списка узлов с заданным именем name в качестве результата. Если узла с таким именем в списке нет, то возвращается null. Пример: alert(document.body.attributes.getNamedItem("text").nodeValue); В Internet Explorer этот пример должен быть записан любым из двух следующих способов: alert(document.body.attributes["text"].nodeValue); alert(document.body.attributes("text").nodeValue); Метод getNamedItemNSСинтаксис: список.getNamedItemNS(namespaceURI, localName) Аргументы: namespaceURI, localName выражения типа DOMString Результат: узел Node или null Исключения: нет Поддержка: Нестандартная поддержка для XML-документов (см. прим.). Не поддерживается. Метод getNamedItemNS возвращает элемент списка узлов с заданным именем в качестве результата. Если узла с таким именем в списке нет, то возвращается null. Этот метод предназначен для XML-документов и для HTML-документов может не поддерживаться. Аргумент namespaceURI задает URI пространства имен, а localName локальное имя узла. Примечание. В Microsoft XML DOM этот метод имеет вид getQualifiedItem(localName, namespaceURI). Метод itemСинтаксис: список.item(index) Аргументы: index числовое выражение Результат: узел Node или null Исключения: нет Поддержка: Соответствует стандарту. Соответствует стандарту. Метод item возвращает элемент списка узлов с заданным индексом в качестве результата. Если индекс выходит за пределы диапазона элементов списка, то возвращается null. Пример: alert(document.body.attributes.item(0).nodeName); JavaScript позволяет нам записать обращение к элементу списка более компактно. Предыдущий оператор может выглядеть так: alert(document.attributes[0].nodeName); Internet Explorer поддерживает еще одну форму обращения к элементу списка, а именно: alert(document.attributes(0).nodeName); Однако, эта форма является нестандартной, и ей лучше не пользоваться. Метод removeNamedItemСинтаксис: список.removeNamedItem(name) Аргументы: name выражение типа DOMString Результат: узел Node Исключения: NOT_FOUND_ERR, NO_MODIFICATION_ALLOWED_ERR Поддержка: Только для XML-документов. Соответствует стандарту. Метод removeNamedItem удаляет элемент списка узлов с заданным именем name и возвращает его в качестве результата. Если удаляемый узел является атрибутом элемента, имеющим значение по умолчанию, то сразу после его удаления он вновь появляется в списке со значением по умолчанию. Пример: document.body.attributes.removeNamedItem("text"); Метод removeNamedItemNSСинтаксис: список.removeNamedItemNS(namespaceURI, localName) Аргументы: namespaceURI, localName выражения типа DOMString Результат: узел Node Исключения: NOT_FOUND_ERR, NO_MODIFICATION_ALLOWED_ERR Поддержка: Нестандартная поддержка для XML-документов (см. прим.). Не поддерживается. Метод removeNamedItemNS удаляет элемент списка узлов с заданным именем и возвращает его в качестве результата. Если удаляемый узел является атрибутом элемента, имеющим значение по умолчанию, то сразу после его удаления он вновь появляется в списке со значением по умолчанию. Этот метод предназначен для XML-документов и для HTML-документов может не поддерживаться. Аргумент namespaceURI задает URI пространства имен, а localName локальное имя узла. Примечание. В Microsoft XML DOM этот метод имеет вид removeQualifiedItem(localName, namespaceURI). Метод setNamedItemСинтаксис: список.setNamedItem(arg) Аргументы: arg выражение типа Node Результат: узел Node или null Исключения: WRONG_DOCUMENT_ERR, NO_MODIFICATION_ALLOWED_ERR, INUSE_ATTRIBURE_ERR Поддержка: Только для XML-документов. Соответствует стандарту. Метод setNamedItem добавляет элемент arg в данный список узлов. Если узел с таким именем в списке есть, то он заменяется на arg и возвращается в качестве результата. Если узла с таким именем в списке нет, то arg вставляется в список и возвращается null. Пример: var attr = document.createAttribute("text"); attr.nodeValue = "red"; document.body.attributes.setNamedItem(attr); Метод setNamedItemNSСинтаксис: список.setNamedItemNS(arg) Аргументы: arg выражение типа Node Результат: узел Node или null Исключения: WRONG_DOCUMENT_ERR, NO_MODIFICATION_ALLOWED_ERR, INUSE_ATTRIBURE_ERR Поддержка: Не поддерживается. Не поддерживается. Метод setNamedItemNS добавляет элемент arg в данный список узлов. Если узел с таким именем в списке есть, то он заменяется на arg и возвращается в качестве результата. Если узла с таким именем в списке нет, то arg вставляется в список и возвращается null. Этот метод предназначен для XML-документов и для HTML-документов может не поддерживаться. Он отличается от метода setNamedItem тем, что при вставке узла используются URI его пространства имен, и его локальное имя. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||