javascript DOM 操作

來源:互聯網
上載者:User
首先需要理解的一點是,DOM是針對XML的基於樹的API,它的實現有很多(各語言基本都有自己的實現),我們討論的是javascript中或者說xhtml(html)對DOM的實現。

一、使用DOM
考慮一個html檔案:<html>
<head><title>測試</title></head>
<body>
<p>測試</p>
</body>
</html>

1.訪問節點:
訪問html元素:var oHtml=document.documentElement;
擷取head元素:var oHead=oHtml.firstChild;
擷取body元素:var oBody=oHtml.lastChild; 或者 var oBody=document.body;

也可以通過childNodes來做同樣的工作:
var oHead=oHtml.childNodes[0] 或者 oHtml.childNodes.item(0);
var oBody=oHtml.childNodes[1] 或者 oHtml.childNodes.item(1);

判斷節點間關係:alert(oHead.parentNode==oHtml);  
alert(oBody.previousSibling==oHead);
alert(oHead.nextSibling==oBody);
alert(oHead.ownerDocument==document);

2.檢測節點類型:
通過節點的nodeType屬性來檢驗節點類型:
alert(document.nodeType); //輸出9
需要注意的是,DOM相容的瀏覽器(以FF2.0為例),擁有Node.DOCUMENT_NODE、Node.ELEMENT_NODE等常量。各常量名稱與數值對照表如下:ELEMENT_NODE                                 1
ATTRIBUTE_NODE                            2
TEXT_NODE                                         3
CDATA_SECTION_NODE                 4
ENTITY_REFERENCE_NODE            5
ENTITY_NODE                                     6
PROCESSING_INSTRCTION_NODE       7
COMMENT_NODE                             8
DOCUMENT_NODE                            9
DOCUMENT_TYPE_NODE               10
DOCUMENT_FRAGMENT_NODE   11
NOTATION_NODE                              12

IE6不支援,不過你可以自訂一個JS對象Node。

3.處理特性
處理特性可以使用標準的NameNodeMap中的方法:
getNamedItem(name) removeNamedItem(name) setNamedItem(node)    item(pos)

比如:<p id="test">測試</p>
假設變數oP是上面的p節點的引用,我們要訪問oP的id屬性:
var sId=oP.attributes.getNamedItem("id").nodeValue;

這些方法用起來很累贅,所以DOM又定義了三個方法來簡化:
getAttribute(name)         ——返回名稱為name的屬性的值
setAttribute(name,value) ——顧名思義
removeAttribute(name)    ——顧名思義

上面的例子可以改寫為:
var sId=oP.getAttribute("name");

4.訪問指定節點:
熟知的getElementByTagName(name),getElementByName(name),getElementById(id)三個方法,不再展開。

5.建立和動作節點:
(1)建立新節點,一張IE(6.0)和FF對DOM Level1的建立新節點方法支援的對照表:方法                                                                IE                                FF
createAttribute(name)                                  Y                                 Y
createCDATASection(text)                       N                                 Y
createComment(text)                                    Y                                 Y
createDocumentFragment()                         Y                                 Y
createElement(tagName)                            Y                                  Y
createEntityReference(name)                    N                                  Y
createProcessingInstruction(
target,data)                                                 N                                   Y
createTextNode(text)                               Y                                    Y

下面介紹常用的幾個方法

(2)createElement(),createTextNode(),appendChild()
例子:<html>
    <head>
        <title>createElement() Example</title>
        <script type="text/javascript">
            function createMessage() {
                var oP = document.createElement("p");
                var oText = document.createTextNode("Hello World!");
                 oP.appendChild(oText);
                 document.body.appendChild(oP);
             }
        </script>
    </head>
    <body onload="createMessage()">
    </body>
</html>

在頁面載入後,建立節點oP,並建立一個文本節點oText,oText通過appendChild方法附加在oP節點上,為了實際顯示出來,將oP節點通過appendChild方法附加在body節點上。此例子將顯示Hello World!

(3)removeChild(),replaceChild()和insertBefore()
從方法名稱就知道是幹什麼的:刪除節點,替換節點,插入節點。需要注意的是replaceChild和insertBefore兩個參數都是新節點在前,舊節點在後。

(4)createDocumentFragment()
此方法主要是為瞭解決大量添加節點時,速度過慢。通過建立一個文檔片段節點,將要添加的新節點附加在此片段節點上,然後再將文檔片段節點append到body上面,替代多次append到body節點。
例子:<html>
    <head>
        <title>insertBefore() Example</title>
        <script type="text/javascript">
            function addMessages() {
                var arrText = ["first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth"];
                
                var oFragment = document.createDocumentFragment();
                
                for (var i=0; i < arrText.length; i++) {
                    var oP = document.createElement("p");
                    var oText = document.createTextNode(arrText[i]);
                     oP.appendChild(oText);
                     oFragment.appendChild(oP);
                 }
                
                 document.body.appendChild(oFragment);

             }
        </script>
    </head>
    <body onload="addMessages()">

    </body>
</html>

二、HTML DOM的特徵功能

HTML DOM的特性和方法不是標準的DOM實現,是專門針對HTML同時也讓一些DOM操作變的更加簡便。

1.讓特性像屬性一樣
訪問某元素的特性需要用到getAttribute(name)方法,HTML DOM擴充,可以直接使用同樣名稱的屬性來擷取和設定這些值:
比如 <img src="test.jpg"/>
假設oImg是此元素的引用
(oImg.getAttribute("src")可以直接寫成:oImg.src,設定值簡化為:
oImg.src="test2.gif";
唯一特殊的class屬性,因為class是ECMAScript的保留字,所以替代的屬性名稱是className.

2.table的系列方法:
為了簡化建立表格,HTML DOM提供了一系列的表格方法,常用幾個:
cells ——返回</tr>元素中的所有儲存格
rows   ——表格中所有行的集合
insertRow(position) ——在rows集合中指定位置插入新行
deleteRow(position) ——與insertRow相反
insertCell(position) ——在cells集合的指定位置插入一個新的儲存格
deleteCell(position) ——與insertCell相反

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.