隨筆-314  評(píng)論-209  文章-0  trackbacks-0
          <script?language="JavaScript">
          <!--
          var?doc?=?new?ActiveXObject("Msxml2.DOMDocument");?//ie5.5+,CreateObject("Microsoft.XMLDOM")?


          //加載文檔
          //
          doc.load("b.xml");

          //創(chuàng)建文件頭
          var?p?=?doc.createProcessingInstruction("xml","version='1.0'??encoding='gb2312'");

          ????
          //添加文件頭
          ????doc.appendChild(p);

          //用于直接加載時(shí)獲得根接點(diǎn)
          //
          var?root?=?doc.documentElement;

          //兩種方式創(chuàng)建根接點(diǎn)
          //
          ????var?root?=?doc.createElement("students");
          ????var?root?=?doc.createNode(1,"students","");

          ????
          //創(chuàng)建子接點(diǎn)
          ????var?n?=?doc.createNode(1,"ttyp","");

          ????????
          //指定子接點(diǎn)文本
          ????????//n.text?=?"?this?is?a?test";
          ????
          ????
          //創(chuàng)建孫接點(diǎn)
          ????var?o?=?doc.createElement("sex");
          ????????o.text?
          =?"";????//指定其文本

          ????
          //創(chuàng)建屬性
          ????var?r?=?doc.createAttribute("id");
          ????????r.value
          ="test";

          ????????
          //添加屬性
          ????????n.setAttributeNode(r);

          ????
          //創(chuàng)建第二個(gè)屬性????
          ????var?r1?=?doc.createAttribute("class");
          ????????r1.value
          ="tt";
          ????????
          ????????
          //添加屬性
          ????????n.setAttributeNode(r1);

          ????????
          //刪除第二個(gè)屬性
          ????????n.removeAttribute("class");

          ????????
          //添加孫接點(diǎn)
          ????????n.appendChild(o);

          ????????
          //添加文本接點(diǎn)
          ????????n.appendChild(doc.createTextNode("this?is?a?text?node."));

          ????????
          //添加注釋
          ????????n.appendChild(doc.createComment("this?is?a?comment\n"));
          ????
          ????????
          //添加子接點(diǎn)
          ????????root.appendChild(n);
          ????
          ????
          //復(fù)制接點(diǎn)
          ????var?m?=?n.cloneNode(true);

          ????????root.appendChild(m);
          ????????
          ????????
          //刪除接點(diǎn)
          ????????root.removeChild(root.childNodes(0));

          ????
          //創(chuàng)建數(shù)據(jù)段
          ????var?c?=?doc.createCDATASection("this?is?a?cdata");
          ????????c.text?
          =?"hi,cdata";
          ????????
          //添加數(shù)據(jù)段
          ????????root.appendChild(c);
          ????
          ????
          //添加根接點(diǎn)
          ????doc.appendChild(root);

          ????
          //查找接點(diǎn)
          ????var?a?=?doc.getElementsByTagName("ttyp");
          ????
          //var?a?=?doc.selectNodes("http://ttyp");

          ????
          //顯示改接點(diǎn)的屬性
          ????for(var?i=?0;i<a.length;i++)
          ????
          {
          ????????alert(a[i].xml);
          ????????
          for(var?j=0;j<a[i].attributes.length;j++)
          ????????
          {
          ????????????alert(a[i].attributes[j].name);
          ????????}

          ????}


          ????
          //修改節(jié)點(diǎn),利用XPATH定位節(jié)點(diǎn)
          ????var?b?=?doc.selectSingleNode("//ttyp/sex");
          ????b.text?
          =?"";

          ????
          //alert(doc.xml);

          ????
          //XML保存(需要在服務(wù)端,客戶端用FSO)
          ????//doc.save();
          ????
          ????
          //查看根接點(diǎn)XML
          ????if(n)
          ????
          {
          ????????alert(n.ownerDocument.xml);
          ????}


          //-->
          </script>

          7.4、文檔對(duì)象模型(DOM)
            文檔對(duì)象模型(DOM)是表示文檔(比如HTML和XML)和訪問(wèn)、操作構(gòu)成文檔的各種元素的應(yīng)用程序接口(API)。一般的,支持Javascript的所有瀏覽器都支持DOM。本文所涉及的DOM,是指W3C定義的標(biāo)準(zhǔn)的文檔對(duì)象模型,它以樹形結(jié)構(gòu)表示HTML和XML文檔,定義了遍歷這個(gè)樹和檢查、修改樹的節(jié)點(diǎn)的方法和屬性。

          7.4.1、DOM眼中的HTML文檔:樹
            在DOM眼中,HTML跟XML一樣是一種樹形結(jié)構(gòu)的文檔,<html>是根(root)節(jié)點(diǎn),<head>、<title>、<body>是<html>的子(children)節(jié)點(diǎn),互相之間是兄弟(sibling)節(jié)點(diǎn);<body>下面才是子節(jié)點(diǎn)<table>、<span>、<p>等等。如下圖:

            

            這個(gè)是不是跟XML的結(jié)構(gòu)有點(diǎn)相似呢。不同的是,HTML文檔的樹形主要包含表示元素、標(biāo)記的節(jié)點(diǎn)和表示文本串的節(jié)點(diǎn)。

          7.4.2、HTML文檔的節(jié)點(diǎn)
            DOM下,HTML文檔各個(gè)節(jié)點(diǎn)被視為各種類型的Node對(duì)象。每個(gè)Node對(duì)象都有自己的屬性和方法,利用這些屬性和方法可以遍歷整個(gè)文檔樹。由于HTML文檔的復(fù)雜性,DOM定義了nodeType來(lái)表示節(jié)點(diǎn)的類型。這里列出Node常用的幾種節(jié)點(diǎn)類型:
          接口nodeType常量nodeType值備注
          ElementNode.ELEMENT_NODE1元素節(jié)點(diǎn)
          TextNode.TEXT_NODE3文本節(jié)點(diǎn)
          DocumentNode.DOCUMENT_NODE9document
          CommentNode.COMMENT_NODE8注釋的文本
          DocumentFragmentNode.DOCUMENT_FRAGMENT_NODE11document片斷
          AttrNode.ATTRIBUTE_NODE2節(jié)點(diǎn)屬性

            DOM樹的根節(jié)點(diǎn)是個(gè)Document對(duì)象,該對(duì)象的documentElement屬性引用表示文檔根元素的Element對(duì)象(對(duì)于HTML文檔,這個(gè)就是<html>標(biāo)記)。Javascript操作HTML文檔的時(shí)候,document即指向整個(gè)文檔,<body>、<table>等節(jié)點(diǎn)類型即為Element。Comment類型的節(jié)點(diǎn)則是指文檔的注釋。具體節(jié)點(diǎn)類型的含義,請(qǐng)參考《Javascript權(quán)威指南》,在此不贅述。

            Document定義的方法大多數(shù)是生產(chǎn)型方法,主要用于創(chuàng)建可以插入文檔中的各種類型的節(jié)點(diǎn)。常用的Document方法有:

          方法描述
          createAttribute()用指定的名字創(chuàng)建新的Attr節(jié)點(diǎn)。
          createComment()用指定的字符串創(chuàng)建新的Comment節(jié)點(diǎn)。
          createElement()用指定的標(biāo)記名創(chuàng)建新的Element節(jié)點(diǎn)。
          createTextNode()用指定的文本創(chuàng)建新的TextNode節(jié)點(diǎn)。
          getElementById()返回文檔中具有指定id屬性的Element節(jié)點(diǎn)。
          getElementsByTagName()返回文檔中具有指定標(biāo)記名的所有Element節(jié)點(diǎn)。

            對(duì)于Element節(jié)點(diǎn),可以通過(guò)調(diào)用getAttribute()、setAttribute()、removeAttribute()方法來(lái)查詢、設(shè)置或者刪除一個(gè)Element節(jié)點(diǎn)的性質(zhì),比如<table>標(biāo)記的border屬性。下面列出Element常用的屬性:

          屬性描述
          tagName元素的標(biāo)記名稱,比如<p>元素為P。HTML文檔返回的tabName均為大寫。

            Element常用的方法:

          方法描述
          getAttribute()以字符串形式返回指定屬性的值。
          getAttributeNode()以Attr節(jié)點(diǎn)的形式返回指定屬性的值。
          getElementsByTabName()返回一個(gè)Node數(shù)組,包含具有指定標(biāo)記名的所有Element節(jié)點(diǎn)的子孫節(jié)點(diǎn),其順序?yàn)樵谖臋n中出現(xiàn)的順序。
          hasAttribute()如果該元素具有指定名字的屬性,則返回true。
          removeAttribute()從元素中刪除指定的屬性。
          removeAttributeNode()從元素的屬性列表中刪除指定的Attr節(jié)點(diǎn)。
          setAttribute()把指定的屬性設(shè)置為指定的字符串值,如果該屬性不存在則添加一個(gè)新屬性。
          setAttributeNode()把指定的Attr節(jié)點(diǎn)添加到該元素的屬性列表中。

            Attr對(duì)象代表文檔元素的屬性,有name、value等屬性,可以通過(guò)Node接口的attributes屬性或者調(diào)用Element接口的getAttributeNode()方法來(lái)獲取。不過(guò),在大多數(shù)情況下,使用Element元素屬性的最簡(jiǎn)單方法是getAttribute()和setAttribute()兩個(gè)方法,而不是Attr對(duì)象。

          7.4.3、使用DOM操作HTML文檔
            Node對(duì)象定義了一系列屬性和方法,來(lái)方便遍歷整個(gè)文檔。用parentNode屬性和childNodes[]數(shù)組可以在文檔樹中上下移動(dòng);通過(guò)遍歷childNodes[]數(shù)組或者使用firstChild和nextSibling屬性進(jìn)行循環(huán)操作,也可以使用lastChild和previousSibling進(jìn)行逆向循環(huán)操作,也可以枚舉指定節(jié)點(diǎn)的子節(jié)點(diǎn)。而調(diào)用appendChild()、insertBefore()、removeChild()、replaceChild()方法可以改變一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)從而改變文檔樹。

            需要指出的是,childNodes[]的值實(shí)際上是一個(gè)NodeList對(duì)象。因此,可以通過(guò)遍歷childNodes[]數(shù)組的每個(gè)元素,來(lái)枚舉一個(gè)給定節(jié)點(diǎn)的所有子節(jié)點(diǎn);通過(guò)遞歸,可以枚舉樹中的所有節(jié)點(diǎn)。下表列出了Node對(duì)象的一些常用屬性和方法:

            Node對(duì)象常用屬性:

          屬性描述
          attributes如果該節(jié)點(diǎn)是一個(gè)Element,則以NamedNodeMap形式返回該元素的屬性。
          childNodes以Node[]的形式存放當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)。如果沒(méi)有子節(jié)點(diǎn),則返回空數(shù)組。
          firstChild以Node的形式返回當(dāng)前節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn)。如果沒(méi)有子節(jié)點(diǎn),則為null。
          lastChild以Node的形式返回當(dāng)前節(jié)點(diǎn)的最后一個(gè)子節(jié)點(diǎn)。如果沒(méi)有子節(jié)點(diǎn),則為null。
          nextSibling以Node的形式返回當(dāng)前節(jié)點(diǎn)的兄弟下一個(gè)節(jié)點(diǎn)。如果沒(méi)有這樣的節(jié)點(diǎn),則返回null。
          nodeName節(jié)點(diǎn)的名字,Element節(jié)點(diǎn)則代表Element的標(biāo)記名稱。
          nodeType代表節(jié)點(diǎn)的類型。
          parentNode以Node的形式返回當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)。如果沒(méi)有父節(jié)點(diǎn),則為null。
          previousSibling以Node的形式返回緊挨當(dāng)前節(jié)點(diǎn)、位于它之前的兄弟節(jié)點(diǎn)。如果沒(méi)有這樣的節(jié)點(diǎn),則返回null。

            Node對(duì)象常用方法:

          方法描述
          appendChild()通過(guò)把一個(gè)節(jié)點(diǎn)增加到當(dāng)前節(jié)點(diǎn)的childNodes[]組,給文檔樹增加節(jié)點(diǎn)。
          cloneNode()復(fù)制當(dāng)前節(jié)點(diǎn),或者復(fù)制當(dāng)前節(jié)點(diǎn)以及它的所有子孫節(jié)點(diǎn)。
          hasChildNodes()如果當(dāng)前節(jié)點(diǎn)擁有子節(jié)點(diǎn),則將返回true。
          insertBefore()給文檔樹插入一個(gè)節(jié)點(diǎn),位置在當(dāng)前節(jié)點(diǎn)的指定子節(jié)點(diǎn)之前。如果該節(jié)點(diǎn)已經(jīng)存在,則刪除之再插入到它的位置。
          removeChild()從文檔樹中刪除并返回指定的子節(jié)點(diǎn)。
          replaceChild()從文檔樹中刪除并返回指定的子節(jié)點(diǎn),用另一個(gè)節(jié)點(diǎn)替換它。

            接下來(lái),讓我們使用上述的DOM應(yīng)用編程接口,來(lái)試著操作HTML文檔。

          posted on 2006-06-22 12:28 xzc 閱讀(978) 評(píng)論(0)  編輯  收藏 所屬分類: XML
          主站蜘蛛池模板: 桑植县| 山西省| 慈溪市| 德清县| 庄浪县| 三穗县| 定州市| 句容市| 韩城市| 哈巴河县| 宁津县| 修文县| 兴海县| 灵武市| 柯坪县| 屏东县| 姚安县| 隆子县| 罗平县| 即墨市| 威海市| 梅河口市| 辽阳市| 二连浩特市| 安阳县| 治多县| 濮阳市| 洮南市| 南充市| 武邑县| 安阳县| 高尔夫| 濮阳县| 曲水县| 喀喇| 涞水县| 哈尔滨市| 祁东县| 平凉市| 葵青区| 萝北县|