Введение

В этом разделе представлено краткое концептуальное введение в DOM: что это такое, как он предоставляет структуру для HTML и XML-документов, как вы можете получить к нему доступ, и как этот API представляет справочную информацию и примеры.

Что такое DOM?

Document Object Model (DOM) - это программный интерфейс для HTML и XML-документов. Он представляет страницу, чтобы программы могли изменять структуру, стиль и содержание документа. DOM отображает страницу ввиде узлов и объектов. Таким образом, языки программирования могут взаимодействовать со страницей.

Веб-страница - это документ. Этот документ можно либо отобразить в окне браузера, либо в качестве источника HTML. Но в обоих случаях это один и тот же документ. Объектная модель документа (DOM) представляет этот же документ, таким образом, чтобы им можно было манипулировать. DOM представляет собой объектно-ориентированное представление веб-страницы, которое может быть модифицировано с помощью скриптовых языков, таких как JavaScript.

Стандарты W3C DOM и WHATWG DOM реализованы в большинстве современных браузеров. Многие браузеры расширяют стандарт, поэтому следует проявлять осторожность при использовании их в Интернете, где к документам могут обращаться различные браузеры с различными DOM.

Например, стандарт DOM указывает, что метод getElementsByTagName в коде ниже должен возвращать список всех <p> элементов в документе:

var paragraphs = document.getElementsByTagName("P");
// paragraphs[0] первый <p>-элемент
// paragraphs[1] второй <p>-элемент и т.д.
alert(paragraphs[0].nodeName);

Все свойства, методы и события, доступные для управления и создания веб-страниц, организованы в объекты (например, объект документа, который представляет сам документ (document), объект таблица (table), который реализует специальный интерфейс DOM HTMLTableElement для доступа к таблицам HTML и т. д. ). Эта документация предоставляет по-объектную справку по DOM, реализованную в браузерах на базе Gecko.

DOM и JavaScript

Краткий пример выше, как и почти все примеры в этом руководстве, - это JavaScript. То есть, он написан на JavaScript, но он использует DOM для доступа к документу и его элементам. DOM не является языком программирования, но без него язык JavaScript не имел бы никаких моделей или понятия о веб-страницах, HTML и XML документах, и об их составных частях (например, элементах). Каждый элемент в документе - документ в целом, секция документа head, таблицы внутри документа, заголовки таблиц, текст внутри ячеек таблицы - являются частью объектной модели документа для этого документа, поэтому к ним можно получить доступ и манипулировать ним с помощью DOM и скриптового языка, такого как JavaScript.

В начале JavaScript и DOM были тесно переплетены, но в конечном итоге они превратились в отдельные сущности. Содержимое страницы хранится в DOM и может быть доступно и обработано через JavaScript, так что мы можем написать приблизительно такое уравнение:

API (HTML или XML страницы) = DOM + JS (скриптовый язык)

DOM был разработан, чтобы быть независимым от любого конкретного языка программирования, делая структурное представление документа доступным из единого согласованного API. Хотя мы ориентируемся исключительно на JavaScript в этой справочной документации, реализации DOM могут быть созданы для любого языка, как демонстрирует этот пример Python:

# Python DOM example
import xml.dom.minidom as m
doc = m.parse("C:\\Projects\\Py\\chap1.xml");
doc.nodeName # DOM property of document object;
p_list = doc.getElementsByTagName("para");

Для получения дополнительной информации о том, какие технологии используются для написания JavaScript в Интернете, см.  обзор технологий JavaScript.

Как получить доступ к DOM?

Вам не нужно делать что-то особенное, чтобы начать использовать DOM. Различные браузеры имеют различные реализации DOM, и эти реализации демонстрируют различную степень соответствия действующему стандарту DOM (тема, которую мы пытаемся избежать в этой документации), но каждый веб-браузер использует некоторую объектную модель документа, чтобы сделать веб-страницы доступными для скрипта.

Когда вы создаете код, независимо от того, встроен ли он в элемент <script> или включен в веб-страницу с помощью инструкции по загрузке скрипта извне, вы можете сразу начать использовать API для элементов document или window  для манипулирования самим документом или получить его дочерние элементы, которые являются различными элементами веб-страницы. Ваше программирование DOM может быть достаточно простым, как, например, следующий код, который выводит предупреждающее сообщение используя функцию alert() из объекта window, или может использовать более сложные методы DOM для создания нового контента, как в более длинном примере ниже.

Следующий пример кода JavaScript буде выводить предупреждение, когда загрузка документа завершена (и когда весь DOM доступен для использования).

<body onload="window.alert('Welcome to my home page!');"> 

Эта функция создает новый элемент H1, добавляет в него текст и, затем, добавляет H1 в дерево данного документа:

<html>
  <head>
    <script>
       // запускает эту функцию, когда документ загружен
       window.onload = function() {

         // создает пару элементов на пустой веб-странице
         var heading = document.createElement("h1");
         var heading_text = document.createTextNode("Big Head!");
         heading.appendChild(heading_text);
         document.body.appendChild(heading);
      }
    </script>
  </head>
  <body>
  </body>
</html>

Важные типы данных

Эта руководство пытается описать различные объекты и типы данных как можно проще. Но есть много различных типов данных, которые передаются через API, о которых вы должны знать. Для простоты, примеры синтаксиса в этом руководстве по API обычно назвывают узловые элементы - элементами element, массивам узлов, такие как nodeList, - также элементами element, а аттрибуты узлов attribute именуются просто аттрибутам.

Следующая таблица кратко описывает эти типы данных.

document Когда элемент возвращает объект типа document (например,  свойство элемента ownerDocument возвращает document, к которому он принадлежит), этот элемент является корневым объектом документа document. Глава Руководство по DOM document описывает объект document.
element element refers to an element or a node of type element returned by a member of the DOM API. Rather than saying, for example, that the document.createElement() method returns an object reference to a node, we just say that this method returns the element that has just been created in the DOM. element objects implement the DOM Element interface and also the more basic Node interface, both of which are included together in this reference.
nodeList A nodeList is an array of elements, like the kind that is returned by the method document.getElementsByTagName(). Items in a nodeList are accessed by index in either of two ways:
  • list.item(1)
  • list[1]
These two are equivalent. In the first, item() is the single method on the nodeList object. The latter uses the typical array syntax to fetch the second item in the list.
attribute When an attribute is returned by a member (e.g., by the createAttribute() method), it is an object reference that exposes a special (albeit small) interface for attributes. Attributes are nodes in the DOM just like elements are, though you may rarely use them as such.
namedNodeMap A namedNodeMap is like an array, but the items are accessed by name or index, though this latter case is merely a convenience for enumeration, as they are in no particular order in the list. A namedNodeMap has an item() method for this purpose, and you can also add and remove items from a namedNodeMap.

Интерфейсы DOM

This guide is about the objects and the actual things you can use to manipulate the DOM hierarchy. There are many points where understanding how these work can be confusing. For example, the object representing the HTML form element gets its name property from the HTMLFormElement interface but its className property from the HTMLElement interface. In both cases, the property you want is simply in that form object.

Но взаимосвязь между объектами и интерфейсами, которые они реализуют в DOM, может сбить с толку, и поэтому этот раздел пытается немного рассказать о реальных интерфейсах в спецификации DOM и о том, как они становятся доступными.

Интерфейсы и Объекты

Many objects borrow from several different interfaces. The table object, for example, implements a specialized HTML Table Element Interface, which includes such methods as createCaption and insertRow. But since it's also an HTML element, table implements the Element interface described in the DOM element Reference chapter. And finally, since an HTML element is also, as far as the DOM is concerned, a node in the tree of nodes that make up the object model for an HTML or XML page, the table object also implements the more basic Node interface, from which Element derives.

When you get a reference to a table object, as in the following example, you routinely use all three of these interfaces interchangeably on the object, perhaps without knowing it.

var table = document.getElementById("table");
var tableAttrs = table.attributes; // Node/Element interface
for (var i = 0; i < tableAttrs.length; i++) {
  // HTMLTableElement interface: border attribute
  if(tableAttrs[i].nodeName.toLowerCase() == "border")
    table.border = "1"; 
}
// HTMLTableElement interface: summary attribute
table.summary = "note: increased border";

Ключевые Интерфесы в DOM

This section lists some of the most commonly-used interfaces in the DOM. The idea is not to describe what these APIs do here but to give you an idea of the sorts of methods and properties you will see very often as you use the DOM. These common APIs are used in the longer examples in the DOM Examples chapter at the end of this book.

Document и window объекты являются объектами, интерфейсы которых наиболее  часто используются при программировании DOM. Простыми словами, объект window  представляет собой что-то вроде браузера, а объект document корень самого документа. Element наследуется от общего интерфейса Node, и вместе эти два интерфейса предоставляют множество методов и свойств, которые вы используете для отдельных элементов. Эти элементы также могут иметь определенные интерфейсы для обработки данных, которые хранятся в этих элементах, как в примере объекта tableв предыдущем разделе.

Ниже приведен краткий список общих API-интерфейсов в сценариях веб-страниц и XML-страниц с использованием DOM.

Тестирование DOM API

This document provides samples for every interface that you can use in your own web development. In some cases, the samples are complete HTML pages, with the DOM access in a <script> element, the interface (e.g, buttons) necessary to fire up the script in a form, and the HTML elements upon which the DOM operates listed as well. When this is the case, you can cut and paste the example into a new HTML document, save it, and run the example from the browser.

There are some cases, however, when the examples are more concise. To run examples that only demonstrate the basic relationship of the interface to the HTML elements, you may want to set up a test page in which interfaces can be easily accessed from scripts. The following very simple web page provides a <script> element in the header in which you can place functions that test the interface, a few HTML elements with attributes that you can retrieve, set, or otherwise manipulate, and the web user interface necessary to call those functions from the browser.

You can use this test page or create a similar one to test the DOM interfaces you are interested in and see how they work on the browser platform. You can update the contents of the test() function as needed, create more buttons, or add elements as necessary.

<html>
  <head>
    <title>DOM Tests</title>
    <script type="application/javascript">
    function setBodyAttr(attr, value){
      if (document.body) eval('document.body.'+attr+'="'+value+'"');
      else notSupported();
    }
    </script>
  </head> 
  <body>
    <div style="margin: .5in; height: 400;"> 
      <p><b><tt>text</tt></b></p> 
      <form> 
        <select onChange="setBodyAttr('text',
        this.options[this.selectedIndex].value);"> 
          <option value="black">black 
          <option value="darkblue">darkblue 
        </select>
        <p><b><tt>bgColor</tt></b></p>
        <select onChange="setBodyAttr('bgColor',
        this.options[this.selectedIndex].value);"> 
          <option value="white">white 
          <option value="lightgrey">gray
        </select>
        <p><b><tt>link</tt></b></p> 
        <select onChange="setBodyAttr('link',
        this.options[this.selectedIndex].value);">
          <option value="blue">blue
          <option value="green">green
        </select>  <small>
        <a href="http://www.brownhen.com/dom_api_top.html" id="sample">
        (sample link)</a></small><br>
      </form>
      <form>
        <input type="button" value="version" onclick="ver()" />
      </form>
    </div>
  </body>
</html>

To test a lot of interfaces in a single page-for example, a "suite" of properties that affect the colors of a web page-you can create a similar test page with a whole console of buttons, textfields, and other HTML elements. The following screenshot gives you some idea of how interfaces can be grouped together for testing.

Схема 0.1 Sample DOM Test Page
Image:DOM_Ref_Introduction_to_the_DOM.gif

In this example, the dropdown menus dynamically update such DOM-accessible aspects of the web page as its background color (bgColor), the color of the hyperlinks (aLink), and color of the text (text). However you design your test pages, testing the interfaces as you read about them is an important part of learning how to use the DOM effectively.

Метки документа и участники

 Внесли вклад в эту страницу: ivaskonyan, arturparkhisenko, T-V-N, Paul_Yuhnovich, arunpandianp, ethertank, shaman
 Обновлялась последний раз: ivaskonyan,