天天看點

javascript之DOM技術(一)

 首先需要了解的一點是,dom是針對xml的基于樹的api,它的實作有很多(各語言基本都有自己的實作),我們讨論的是javascript中或者說xhtml(html)對dom的實作。

一、使用dom

考慮一個html檔案:

javascript之DOM技術(一)

<html>

javascript之DOM技術(一)

<head><title>測試</title></head>

javascript之DOM技術(一)

<body>

javascript之DOM技術(一)

<p>測試</p>

javascript之DOM技術(一)

</body>

javascript之DOM技術(一)

</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);

判斷節點間關系:

javascript之DOM技術(一)

alert(ohead.parentnode==ohtml);  

javascript之DOM技術(一)

alert(obody.previoussibling==ohead);

javascript之DOM技術(一)

alert(ohead.nextsibling==obody);

javascript之DOM技術(一)

alert(ohead.ownerdocument==document);

2.檢測節點類型:

通過節點的nodetype屬性來檢驗節點類型:

alert(document.nodetype);  //輸出9

需要注意的是,dom相容的浏覽器(以ff2.0為例),擁有node.document_node、node.element_node等常量。各常量名稱與數值對照表如下:

javascript之DOM技術(一)

element_node                                 1

javascript之DOM技術(一)

attribute_node                            2

javascript之DOM技術(一)

text_node                                         3

javascript之DOM技術(一)

cdata_section_node                 4

javascript之DOM技術(一)

entity_reference_node            5

javascript之DOM技術(一)

entity_node                                     6

javascript之DOM技術(一)

processing_instrction_node       7

javascript之DOM技術(一)

comment_node                              8

javascript之DOM技術(一)

document_node                            9

javascript之DOM技術(一)

document_type_node               10

javascript之DOM技術(一)

document_fragment_node   11

javascript之DOM技術(一)

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的建立新節點方法支援的對照表:

javascript之DOM技術(一)

方法                                                               ie                               ff

javascript之DOM技術(一)

createattribute(name)                                 y                                y

javascript之DOM技術(一)

createcdatasection(text)                        n                                y

javascript之DOM技術(一)

createcomment(text)                                    y                                y

javascript之DOM技術(一)

createdocumentfragment()                        y                                y

javascript之DOM技術(一)

createelement(tagname)                             y                                 y

javascript之DOM技術(一)

createentityreference(name)                     n                                 y

javascript之DOM技術(一)

createprocessinginstruction(

javascript之DOM技術(一)

target,data)                                                   n                                  y

javascript之DOM技術(一)

createtextnode(text)                                  y                                   y

下面介紹常用的幾個方法

(2)createelement(),createtextnode(),appendchild()

例子:

javascript之DOM技術(一)
javascript之DOM技術(一)

    <head>

javascript之DOM技術(一)

        <title>createelement() example</title>

javascript之DOM技術(一)

        <script type="text/javascript">

javascript之DOM技術(一)

            function createmessage() {

javascript之DOM技術(一)

                var op = document.createelement("p");

javascript之DOM技術(一)

                var otext = document.createtextnode("hello world!");

javascript之DOM技術(一)

                op.appendchild(otext);

javascript之DOM技術(一)

                document.body.appendchild(op);

javascript之DOM技術(一)

            }

javascript之DOM技術(一)

        </script>

javascript之DOM技術(一)

    </head>

javascript之DOM技術(一)

    <body onload="createmessage()">

javascript之DOM技術(一)

    </body>

javascript之DOM技術(一)
javascript之DOM技術(一)

在頁面載入後,建立節點op,并建立一個文本節點otext,otext通過appendchild方法附加在op節點上,為了實際顯示出來,将op節點通過appendchild方法附加在body節點上。此例子将顯示hello world!

(3)removechild(),replacechild()和insertbefore()

從方法名稱就知道是幹什麼的:删除節點,替換節點,插入節點。需要注意的是replacechild和insertbefore兩個參數都是新節點在前,舊節點在後。

(4)createdocumentfragment()

此方法主要是為了解決大量添加節點時,速度過慢。通過建立一個文檔碎片節點,将要添加的新節點附加在此碎片節點上,然後再将文檔碎片節點append到body上面,替代多次append到body節點。

javascript之DOM技術(一)
javascript之DOM技術(一)
javascript之DOM技術(一)

        <title>insertbefore() example</title>

javascript之DOM技術(一)
javascript之DOM技術(一)

            function addmessages() {

javascript之DOM技術(一)

                var arrtext = ["first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth"];

javascript之DOM技術(一)
javascript之DOM技術(一)

                var ofragment = document.createdocumentfragment();

javascript之DOM技術(一)
javascript之DOM技術(一)

                for (var i=0; i < arrtext.length; i++) {

javascript之DOM技術(一)

                    var op = document.createelement("p");

javascript之DOM技術(一)

                    var otext = document.createtextnode(arrtext[i]);

javascript之DOM技術(一)

                    op.appendchild(otext);

javascript之DOM技術(一)

                    ofragment.appendchild(op);

javascript之DOM技術(一)

                }

javascript之DOM技術(一)
javascript之DOM技術(一)

                document.body.appendchild(ofragment);

javascript之DOM技術(一)
javascript之DOM技術(一)
javascript之DOM技術(一)
javascript之DOM技術(一)
javascript之DOM技術(一)

    <body onload="addmessages()">

javascript之DOM技術(一)
javascript之DOM技術(一)
javascript之DOM技術(一)

二、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相反

三。周遊dom

dom的周遊是dom level2中提出的标準,ie6沒有實作,mozilla和safari已經實作,最新ie7不清楚是否實作。不再展開,具體請見《javascript進階程式設計》

文章轉自莊周夢蝶  ,原文釋出5-16

繼續閱讀