소개
This article is an overview of some powerful, fundamental DOM level 1.0 methods and how to use them from JavaScript. You will learn how to create, access and control, and remove HTML elements dynamically. The DOM methods presented here are not specific to HTML; they also apply to XML. The demonstrations provided here will work fine in any browser with full support for DOM level 1, such as the Mozilla browser or others based on it like the next-generation Navigator browser from Netscape. The code samples in this document also work on IE5.
Sample1.html 개괄
This article is an introduction to the DOM through sample code. To get started, try out the following HTML sample. It uses DOM level 1 methods from JavaScript to create an HTML table dynamically. It creates a small table with four cells and text content inside each cell. The text content of the cell is: "cell is row y column x" showing the row and column numbers for that cell in the table.
<html> <head> <title>Sample code - Traversing an HTML Table with JavaScript and DOM Interfaces</title> <script> function start() { // get the reference for the body var mybody = document.getElementsByTagName("body")[0]; // creates a <table> element and a <tbody> element mytable = document.createElement("table"); mytablebody = document.createElement("tbody"); // creating all cells for(var j = 0; j < 2; j++) { // creates a <tr> element mycurrent_row = document.createElement("tr"); for(var i = 0; i < 2; i++) { // creates a <td> element mycurrent_cell = document.createElement("td"); // creates a text node currenttext = document.createTextNode("cell is row "+j+", column "+i); // appends the text node we created into the cell <td> mycurrent_cell.appendChild(currenttext); // appends the cell <td> into the row <tr> mycurrent_row.appendChild(mycurrent_cell); } // appends the row <tr> into <tbody> mytablebody.appendChild(mycurrent_row); } // appends <tbody> into <table> mytable.appendChild(mytablebody); // appends <table> into <body> mybody.appendChild(mytable); // sets the border attribute of mytable to 2; mytable.setAttribute("border", "2"); } </script> </head> <body onload="start()"> </body> </html>
Note the order in which we created the elements and the text node:
- First we created the <table> element.
- Next, we created the <tbody> element, which is a child of the <table> element.
- Next, we used a loop to create the <tr> elements, which are children of the <tbody> element.
- For each <tr> element, we used a loop to create the <td> elements, which are children of <tr> elements.
- For each <td> element, we then created the text node with the table cell's text.
Once we have created the <table>, <tbody>, <tr>, and <td> elements and then the text node, we then append each object to its parent in the opposite order:
- First, we attach each text node to its parent <td> element using
mycurrent_cell.appendChild(currenttext);
- Next, we attach each <td> element to its parent <tr> element using
mycurrent_row.appendChild(mycurrent_cell);
- Next, we attach each <tr> element to the parent <tbody> element using
mytablebody.appendChild(mycurrent_row);
- Next, we attach the <tbody> element to its parent <table> element using
mytable.appendChild(mytablebody);
- Next, we attach the <table> element to its parent <body> element using
mybody.appendChild(mytable);
Remember this technique. You will use it frequently in programming for the W3C DOM. First, you create elements from the top down; then you attach the children to the parents from the bottom up.
Here's the HTML markup generated by the JavaScript code:
... <table border="2"> <tr><td>cell is row 0 column 0</td><td>cell is row 0 column 1</td></tr> <tr><td>cell is row 1 column 0</td><td>cell is row 1 column 1</td></tr> </table> ...
Here's the DOM object tree generated by the code for the TABLE element and its child elements:
You can build this table and its internal child elements by using just a few DOM methods. Remember to keep in mind the tree model for the structures you are planning to create; this will make it easier to write the necessary code. In the <table> tree of Figure 1 the element <table> has one child, the element <tbody>. <tbody> has two children. Each <tbody>'s child (<tr>) has one child (<td>). Finally, each <td> has one child, a text node.
기본 DOM Methods - Sample2.html
getElementsByTagName
is a method of both the Document interface and the Element interface, so both the root document object as well as all Element objects have the getElementByTagName
method. To get a list of children of some element, selecting them by tag names, you can use element.getElementsByTagName(tagname)
.
getElementsByTagName
returns a list of child elements that have the specified tagname. From that list of child elements, you can reach an individual element by calling the item
method, passing an index for the item number you want returned. The first child element of the list is element number zero. It's easy and very simple but needs attention when you are working with large structures. In the next topic we continue working with the Table sample. The following sample is a simpler one, intended to show some basic methods:
<html> <head> <title>Sample code - Traversing an HTML Table with JavaScript and DOM Interfaces</title> <script> function start() { // get a list of all the body elements (there will only be one), // and then select the zeroth (or first) such element myBody = document.getElementsByTagName("body")[0]; // now, get all the p elements that are children of the body myBodyElements = myBody.getElementsByTagName("p"); // get the second item of the list of p elements myP = myBodyElements[1]; } </script> </head> <body onload="start()"> <p>hi</p> <p>hello</p> </body> </html>
In this example, we set the myP
variable to the DOM object for the second p
element inside the body:
- First, we get a list of all the body elements via
myBody = document.getElementsByTagName("body")[0]
Since there is only one body element in any valid HTML document, this list will have only one item, which we retrieve by selecting the first element in that list using[0]
. - Next, we get all the p elements that are children of the body via
myBodyElements = myBody.getElementsByTagName("p");
- Finally, we get the second item from the list of p elements via
myP = myBodyElements[1];
Once you have gotten the DOM object for an HTML element, you can set its properties. For example, if you want to set the style background color property, you just add:
myP.style.background = "rgb(255,0,0)"; // setting inline STYLE attribute
TextNodes 를 document.createTextNode("..")
로 생성
Use the document object to invoke the createTextNode method and create your text node. You just need to pass the text content. The return value is an object that represents the text node.
myTextNode = document.createTextNode("world");
This means that you have created a node of the type TEXT_NODE (a piece of text) whose text data is "world", and myTextNode is your reference to this node object. To insert this text into your HTML page, you need to make this text node a child of some other node element.
appendChild(..) 로 element 넣기
So, by calling myP.appendChild([node_element]), you are making the element a new child of the second <p> element.
myP.appendChild(myTextNode);
After testing this sample, note that the words hello and world are together: helloworld. So visually, when you see the HTML page it seems like the two text nodes hello and world are a single node, but remember that in the document model, there are two nodes. The second node is a new node of type TEXT_NODE, and it is the second child of the second <p> tag. The following figure shows the recently created Text Node object inside the document tree.
document object 과 createElement(..)
method 로 새 element 생성
You can create new HTML elements or any other element you want with createElement. For example, if you want to create a new <p> element as a child of the <body> element, you can use the myBody in the previous example and append a new element node. To create a node simply call document.createElement("tagname")
. For example:
myNewPTAGnode = document.createElement("p"); myBody.appendChild(myNewPTAGnode);
removeChild(..)
method 로 노드 제거
Each node can be removed. The following line removes the text node which contains the word world of the myP (second <p> element).
myP.removeChild(myTextNode);
Finally you can add myTextNode (which contains the word world) into the recently created <p> element:
myNewPTAGnode.appendChild(myTextNode);
The final state for the modified object tree looks like this:
테이블 동적 생성 (Sample1.html 로 돌아감)
For the rest of this article we will continue working with sample1.html. The following figure shows the table object tree structure for the table created in the sample.
HTML 테이블 구조 다시 보기
element nodes 생성 하여 document tree 안에 넣기
The basic steps to create the table in sample1.html are:
- Get the body object (first item of the document object).
- Create all the elements.
- Finally, append each child according to the table structure (as in the above figure). The following source code is a commented version for the sample1.html.
setAttribute
. setAttribute has two arguments: the attribute name and the attribute value. You can set any attribute of any element using the setAttribute method.<head> <title>Sample code - Traversing an HTML Table with JavaScript and DOM Interfaces</title> <script> function start() { // get the reference for the body var mybody = document.getElementsByTagName("body")[0]; // creates <table> and <tbody> elements mytable = document.createElement("table"); mytablebody = document.createElement("tbody"); // creating all cells for(var j = 0; j < 2; j++) { // creates a <tr> element mycurrent_row = document.createElement("tr"); for(var i = 0; i < 2; i++) { // creates a <td> element mycurrent_cell = document.createElement("td"); // creates a Text Node currenttext = document.createTextNode("cell is row " + j + ", column " + i); // appends the Text Node we created into the cell <td> mycurrent_cell.appendChild(currenttext); // appends the cell <td> into the row <tr> mycurrent_row.appendChild(mycurrent_cell); } // appends the row <tr> into <tbody> mytablebody.appendChild(mycurrent_row); } // appends <tbody> into <table> mytable.appendChild(mytablebody); // appends <table> into <body> mybody.appendChild(mytable); // sets the border attribute of mytable to 2; mytable.setAttribute("border","2"); } </script> </head> <body onload="start()"> </body> </html>
DOM 과 CSS 로 테이블 다루기
table에서 text node 얻기
This example introduces two new DOM attributes. First it uses the childNodes
attribute to get the list of child nodes of mycel. The childNodes
list includes all child nodes, regardless of what their name or type is. Like getElementsByTagName, it returns a list of nodes. The difference is that getElementsByTagName only returns elements of the specified tag name. Once you have the returned list, use [x]
method to retrieve the desired child item. This example stores in myceltext the text node of the second cell in the second row of the table. Then, to display the results in this example, it creates a new text node whose content is the data of myceltext and appends it as a child of the <body> element.
mybody = document.getElementsByTagName("body")[0]; mytable = mybody.getElementsByTagName("table")[0]; mytablebody = mytable.getElementsByTagName("tbody")[0]; myrow = mytablebody.getElementsByTagName("tr")[1]; mycel = myrow.getElementsByTagName("td")[1]; // first item element of the childNodes list of mycel myceltext=mycel.childNodes[0]; // content of currenttext is the data content of myceltext currenttext=document.createTextNode(myceltext.data); mybody.appendChild(currenttext);
attribute 값 얻기
At the end of sample1 there is a call to setAttribute on the mytable object. This call was used to set the border property of the table. To retrieve the value of the attribute, use the getAttribute method:
mytable.getAttribute("border");
style 속성을 바꾸어 컬럼 숨기기
Once you have the object in your JavaScript variable, you can set style properties directly. The following code is a modified version of sample1.html in which each cell of the second column is hidden and each cell of the first column is changed to have a red background. Note that the style property was set directly.
<html> <body onload="start()"> </body> <script> function start() { var mybody =document.getElementsByTagName("body")[0]; mytable = document.createElement("table"); mytablebody = document.createElement("tbody"); for(var j = 0; j < 2; j++) { mycurrent_row=document.createElement("tr"); for(var i = 0; i < 2; i++) { mycurrent_cell = document.createElement("td"); currenttext = document.createTextNode("cell is:" + i + j); mycurrent_cell.appendChild(currenttext); mycurrent_row.appendChild(mycurrent_cell); // set the cell background color // if the column is 0. If the column is 1 hide the cel if (i == 0) { mycurrent_cell.style.background = "rgb(255,0,0)"; } else { mycurrent_cell.style.display = "none"; } } mytablebody.appendChild(mycurrent_row); } mytable.appendChild(mytablebody); mybody.appendChild(mytable); } </script> </html>