10.2 Modeling a Document: DOM Nodes and Trees
As we saw in previous chapters, the document's getElementById method is the simplest way to access a specific element in a page. In this section and the next, we discuss more thoroughly the objects returned by this method.
The getElementById method returns objects called DOM nodes. Every element in an XHTML page is modeled in the web browser by a DOM node. All the nodes in a document make up the page's DOM tree, which describes the relationships among elements. Nodes are related to each other through child-parent relationships. An XHTML element inside another element is said to be a child of the containing element. The containing element is known as the parent. A node may have multiple children, but only one parent. Nodes with the same parent node are referred to as siblings.
Some browsers have tools that allow you to see a visual representation of the DOM tree of a document. When installing Firefox, you can choose to install a tool called the DOM Inspector, which allows you to view the DOM tree of an XHTML document. To inspect a document, Firefox users can access the DOM Inspector from the Tools menu of Firefox. If the DOM inspector is not in the menu, run the Firefox installer and choose Custom in the Setup Type screen, making sure the DOM Inspector box is checked in the Optional Components window.
Microsoft provides a Developer Toolbar for Internet Explorer that allows you to inspect the DOM tree of a document. The toolbar can be downloaded from Microsoft at go.microsoft.com/fwlink/?LinkId=92716. Once the toolbar is installed, restart the browser, then click the » icon at the right of the toolbar and choose IE Developer Toolbar from the menu. Figure 10.1 shows an XHTML document and its DOM tree displayed in Firefox's DOM Inspector and in IE's Web Developer Toolbar.
1 <?xml version = "1.0" encoding = "utf-8"?> 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 4 5 <!-- Fig. 10.1: domtree.html --> 6 <!-- Demonstration of a document's DOM tree. --> 7 <html xmlns = "http://www.w3.org/1999/xhtml"> 8 <head> 9 <title>DOM Tree Demonstration</title> 10 </head> 11 <body> 12 <h1>An XHTML Page</h1> 13 <p>This page contains some basic XHTML elements. We use the Firefox 14 DOM Inspector and the IE Developer Toolbar to view the DOM tree 15 of the document, which contains a DOM node for every element in 16 the document.</p> 17 <p>Here's a list:</p> 18 <ul> 19 <li>One</li> 20 <li>Two</li> 21 <li>Three</li> 22 </ul> 23 </body> 24 </html>
Fig. 10.1. Demonstration of a document's DOM tree. (Part 1 of 3.)
a) The XHTML document is rendered in Firefox.
b) The Firefox DOM inspector displays the document tree in the left panel. The right panel shows information about the currently selected node.
Fig. 10.1. Demonstration of a document's DOM tree. (Part 2 of 3.)
c) The Internet Explorer Web Developer Toolbar displays much of the same information as the DOM inspector in Firefox in a panel at the bottom of the browser window.
Fig. 10.1. Demonstration of a document's DOM tree. (Part 3 of 3.)
The XHTML document contains a few simple elements. We explain the example based on the Firefox DOM Inspector—the IE Toolbar displays the document with only minor differences. A node can be expanded and collapsed using the + and - buttons next to the node's name. Figure 10.1(b) shows all the nodes in the document fully expanded. The document node (shown as #document) at the top of the tree is called the root node, because it has no parent. Below the document node, the HTML node is indented from the document node to signify that the HTML node is a child of the #document node. The HTML node represents the html element (lines 7–24).
The HEAD and BODY nodes are siblings, since they are both children of the HTML node. The HEAD contains two #comment nodes, representing lines 5–6. The TITLE node has a child text node (#text) containing the text DOM Tree Demonstration, visible in the right pane of the DOM inspector when the text node is selected. The BODY node contains nodes representing each of the elements in the page. Note that the LI nodes are children of the UL node, since they are nested inside it.
Also, notice that, in addition to the text nodes representing the text inside the body, paragraphs and list elements, a number of other text nodes appear in the document. These text nodes contain nothing but white space. When Firefox parses an XHTML document into a DOM tree, the white space between sibling elements is interpreted as text and placed inside text nodes. Internet Explorer ignores white space and does not convert it into empty text nodes. If you run this example on your own computer, you will notice that the BODY node has a #comment child node not present above in both the Firefox and Internet Explorer DOM trees. This is a result of the copyright line at the end of the example file that you downloaded.