离弦之Ray

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  55 Posts :: 0 Stories :: 33 Comments :: 0 Trackbacks

Chapter 6 DOM 基础

       书的这章主要是围绕document这个对象的使用来讲的。Document对象既是BOM的一部分, 也是Html DOMHTMLDocument对象的一种表现形式,它也是XML DOM Document对象。JavaScript中的大部分处理DOM的过程都是用到了document对象。

Document对象实现Node接口的主要的特性和方法:

 

特性/方法

类型/返回类型

说明

nodeName

String

节点的名字

nodeType

Number

节点的类型常量

nodeValue

String

节点的值

ownerDocument

Document

指向这个节点所属的文档

firstChild

Node

指向childNodes列表中的第一个节点

lastChild

Node

指向childNodes列表中的最后一个节点

childNodes

NodeList

所有子节点的列表

previousSibling

Node

指向前一个兄弟节点

nextSibling

Node

指向后一个兄弟节点

attributes

NamedNodeMap

包含了代表一个元素Attr对象, 仅用于Element

appendChild  (node)

Node

node添加到childNodes

remmoveChild (node)

Node

childNodes中除去

replaceChildnewNodeoldNode

Node

childNodes中的oldNode替换成newNode

insertBeforenewNoderefNode

Node

childNodes中的refNode前插入newNode

 

 

1:检测节点类型

       Node接口定义了对应12种不同节点类型的常量

       Node.ELEMENT_NODE       1

       Node.ATTRIBUTE_NODE    2

       Node.TEXT_NODE      3

       Node.CDATA_SECTION_NODE  4

       Node.ENTITY_REFERENCE_NODE   5

       Node.ENTITY_NODE   6

       Node.PROCESSING_INSTRUCTION_NODE    7

       Node.COMMENT_NODE     8

       Node.DOCUMENT_NODE   9

       Node.DOCUMENT_TYPE_NODE       10

       Node.DOCUMENT_FRAGMENT_NODE    11

       Node.NOTATION_NODE     12

       注意:在IE中不支持这些常量, 但是可以自己定义:

       if(typeof Node == "undefined"){

    var Node = {

        ELEMENT_NODE:1,

        ATTRIBUTE_NODE:2,

        TEXT_NODE:3,

        CDATA_SECTION_NODE:4,

        ENTITY_REFERENCE_NODE:5,

        ENTITY_NODE:6,

        PROCESSING_INSTRUCTION_NODE:7,

        COMMENT_NODE:8,

        DOCUMENT_NODE:9,

        DOCUMENT_TYPE_NODE:10,

        DOCUMENT_FRAGMENT_NODE:11,

        NOTATION_NODE:12

        }

    }

    alert(document.nodeType == Node.DOCUMENT_NODE);//output true

    alert(document.documentElement.nodeType == Node.ELEMENT_NODE);

 

 

2:处理特性

    getNamedItemname:

    removeNamedItem (name):
    setNamedItem (node):

    item(pos):

  这些方法返回的都是Attr节点

    DOM又定义了3个元素访问方法来帮助访问特性

    getAttributename):

    setAttributenamenewValue):

    removeAttributename):

 

    getAttribute(name) 等同 attributes.getNamedItem(name).nodeValue;

    setAttribute(name, newValue) 等同 attributes.getNamedItem(name).nodevalue = newValue;

    removeAttribute(name) 等同 attributes.removeNamedItem(name);

 

 

3:访问指定节点

getElementsByTagName

       获取某个页面第一个段落的所有图象:
      
var oPs = document.getElementsByTagName("p");

    var oImgsInP = oPs[0].getelmentsByTagName("img");

 

       可以使用一个星号的方法来获取document中的所有元素

       var oAllElements = document.getElementsByTagName("*");

    但是据说在IE6.0并不是返回所有的元素, 所以无论怎么样还是用document.all最好了。

 

getElementsByName

示例:

       html片段:

       ……

       <input type="radio" name="radColor" value="red"/> Red

    <input type="radio" name="radColor" value="green"/> Green

    <input type="radio" name="radColor" value="blue"/> Blue

    ……

 

    var oRadios = document.getElementsByName("radColor");

    alert(oRadios[0].getAttribute("value")); //output “red”

 

       这个方法在IE中只能适用于</input>,<img/>

       另外会返回ID等于给定名称的元素

 

getElmentById

       id特性是唯一的, 因此这种方法是提取单个指定元素的最好的方法

      

4:创建和操作节点

 

       createComment(text)

       createAttribute(name)

       createElement(tagName)

       createTextNode(text)

      

       appendChild(node)

       removeChild(node)

       replaceChild(newNode, oldNode)

       insertBeforenewNoderefNode

 

       createDocumentFragment  document添加大量的数据

    var oFragment = document.createAttribute();

    var oP = document.createElement("p");

    var oText = document.createTextNode("Hello");

    oP.appendChild(oText);

    oFragment.append(oP);

    document.body.appendChild(oFragment);

 

 

5Html DOM

       Html DOM 是对核心 DOM的扩展,是专门针对html,让一些DOM的操作更加的方便。

    http://www.w3schools.com/htmldom/dom_reference.asp

 

 

 

6:遍历

       NodeIterator

       TreeWalker

       可惜IE不支持, 先不写了

 

 

=======================================

我写的遍历html页面, 构造出一棵XML 的示例代码

 

File xmlTree.js

//遍历整个html文档, 构造出xml

//generate an XML tree for the whole html document.

 

 

var sTree = new Array;

var index = 0;

var nodeTypes = ["ELEMENT_NODE",

              "ATTRIBUTE_NODE",

              "TEXT_NODE",

              "CDATA_SECTION_NODE",

              "ENTITY_REFERENCE_NODE",

              "ENTITY_NODE",

              "PROCESSING_INSTRUCTION_NODE",

              "COMMENT_NODE",

              "DOCUMENT_NODE",

              "DOCUMENT_TYPE_NODE",

              "DOCUMENT_FRAGMENT_NODE",

              "NOTATION_NODE"];

var sTag = "\t";

 

if(typeof Node == "undefined"){

    var Node = {

    ELEMENT_NODE:1,

    ATTRIBUTE_NODE:2,

    TEXT_NODE:3,

    CDATA_SECTION_NODE:4,

    ENTITY_REFERENCE_NODE:5,

    ENTITY_NODE:6,

    PROCESSING_INSTRUCTION_NODE:7,

    COMMENT_NODE:8,

    DOCUMENT_NODE:9,

    DOCUMENT_TYPE_NODE:10,

    DOCUMENT_FRAGMENT_NODE:11,

    NOTATION_NODE:12

    }

}

 

//打印出缩进符号, 为了显示出层次关系

function showTag(offset){

    var i =0;

    for(; i < offset; i++)

       sTree[index++] = sTag;

}

 

 

//根据节点的不同类型,打印出节点内容, offset为缩进值

function displayNode(node,offset){

    if(node == null || node == "undefined")

       return;

    switch(node.nodeType){//根据节点类型, 做不同处理

       case Node.ELEMENT_NODE:

           showTag(offset);

           sTree[index++] = nodeTypes[node.nodeType-1]+":"+node.nodeName+node.childNodes.length+"\n";

           //如果该节点有属性,则显示出所有的属性值

           if(node.attributes.length>0){

              var ii = 0;

              for(;ii<node.attributes.length;ii++){

                  showTag(offset+1);

                  sTree[index++] = nodeTypes[node.nodeType-1]+": "+

                                 node.attributes.item(ii).nodeName+": "+

                                 node.attributes.item(ii).nodeValue+"\n";

              }

           }

           break;

       case Node.TEXT_NODE:

           if(node.data !=null && node.data.length>=1){//除去空文本的值

              showTag(offset);           

              sTree[index++] = nodeTypes[node.nodeType-1]+":"+node.data+"\n";      

           }         

           break;    

       default://这边省去了很多其它节点类型的处理,就直接显示了下nodeName

           showTag(offset);

           sTree[index++] = nodeTypes[node.nodeType-1]+":"+node.nodeName+"\n";         

    }  

}

 

//递归构造出XML

function createTree(current,offset){

    displayNode(current,offset);

    var childs = current.childNodes;

    if(childs != null && childs.length > 0){

       var ii = 0;   //定义ii很重要,如果for(ii=0;ii<childs.length;ii++)的话,ii会被当成全局变量!!!

       for(; ii < childs.length; ii++){      

           createTree(childs[ii],offset+1);

       }  

    }     

}

 

function testCreateTree(){ 

    /**新打开一个窗口,执行

    var oNewWindow = window.open("about:blank","newwindow");

    oNewWindow.document.open();

    oNewWindow.document.write("<html><head><title></title></head>" +

                           "<body>Hello" +

                           "<p style=\"color:red\" id=\"p1\">Hello,p</p>" +

                           "</body></html>");

    oNewWindow.document.close();

    var oHtml = oNewWindow.document.documentElement;

    */

   

    //在原窗口执行

    var oHtml = document.documentElement; 

    if(oHtml == null)

       alert("No Html docuemtn!!!");  

    createTree(oHtml,0);

    alert(sTree.join('').toString());

}

 

testCreateTree();

 

 

 

 

posted on 2008-01-04 20:29 离弦之ray的技术天空 阅读(415) 评论(2)  编辑  收藏 所属分类: JavaScript

Feedback

# re: Professional JavaScript For Web Developers(Chapter 6)[未登录] 2008-01-05 21:08 ray
test 回复通知  回复  更多评论
  

# re: Professional JavaScript For Web Developers(Chapter 6) 2008-01-05 21:13 建建
辛苦拉~~  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: