目录

DOM概述

DOM分层

在文档对象模型中,每一个对象都可以称为一个节点(node) ,下面将介绍几种节点的概念。

在了解节点后,下面将介绍文档模型中节点的3种类型。

DOM级别

DOM对象节点属性

访问指定节点

(1) nodeName属性

(2)nodeType属性

(3)nodeValue属性

节点

创建节点

1.创建新节点

2.创建多个节点

插入节点

复制节点

删除和替换节点

1.删除节点使用removChild()方法可以实现删除节点。该方法用来删除一个子节点。

2.替换节点

与DHTML想对应的DOM

innerHTML 和innerText属性

outerHTML 和outerText属性


文档对象模型也可以叫作DOM,能够以编程方式访问和操作Web页面(也可以称为文档)的接口。通过对文档对象模型的学习,能够掌握页面中元素的层次关系,有助于对JavaScript程序的开发和理解。
通过阅读本篇文章,您可以:

  • 了解DOM文档对象
  • 掌握DOM对象的级别
  • 掌握DOM对象的节点属性
  • 掌握如何获取文档中的指定元素
  • 了解与DHTML相对应的DOM对象

DOM概述

DOM是Document Object Model (文档对象模型)的缩写,是由w3c (World Wide Web)委员会)定义的。 下面分别介绍各单词的含义。
Document (文档):
创建一个网页并将该网页添加到Web中,DOM就会根据这个网页创建一个文档对象。 如果没有document (文档),DOM也就无从谈起。
Object (对象):
对象是一种独立的数据集合。如文档对象,即是文档中元素与内容的数据集合。与某个特定对象相关联的变量被称为这个对象的属性。可以通过某个特定对象调用的函数被称为这个对象的方法。
Model (模型):
模型代表将文档对象表示为树状模型。在这个树状模型中,网页中的各个元素与内容表现为一个个相互连接的节点。
DOM是访问和操作Web页面的接口,使用该接口可以访问页面中的其他标准组件。DOM解决了JavaScript和JScript之间的冲突,给开发者定义了一个标准的方法,使他们来访问站点中的数据、脚本和表现层对象。

DOM分层

文档对象模型采用的分层结构为树状结构,以树节点的方式表示文档中的各种内容。

在文档对象模型中,每一个对象都可以称为一个节点(node) ,下面将介绍几种节点的概念。

1.根节点:
在最顶层的<html>节点,称为根节点。

2.父节点:
一个 节点之上的节点是该节点的父节点(parent)。例如,<html>就是<head>和<body>的父节点,<head>就是<title>的父节点。
3.子节点:
位于一个节点之下的节点就是该节点的子节点。例如,<head>和<body> 就是<html>的子节点,<title>就是<head>的子节点。
4.兄弟节点:
如果多个节点在同一个层次,并拥有相同的父节点,这几个节点就是兄弟节点(sibling) 。例如,<head>和<body>是兄弟节点。
5.后代:
一个节点的子节点的]结合可以称为是该节点的后代(descendant)。例如,<head>和<body>就是<html>的后代。
6.叶子节点:
在树形结构最底部的节点称为叶子节点。例如,“标题内容” “3 号标题”“ 加粗内容”都是叶子节点。

在了解节点后,下面将介绍文档模型中节点的3种类型。

元素节点:在HTML中,<body>、 <p>、<a>等一系列标记是这个文档的元素节点。元素节点组成了文档模型的语义逻辑结构。
文本节点: 包含在元素节点中的内容部分,如<p>标记中的文本等。 一般情况下, 不为空的文本节点都是可见并呈现于浏览器中的。
属性节点:元素节点的属性,如<a>标记的href属性与title 属性等。一般情况下, 大部分属性节点都是隐藏在浏览器背后,并且是不可见的。属性节点总是被包含于元素节点当中。

DOM级别

W3C在1998年10月标准化了DOM第一级,不仅定义了基本的接口,还包含了所有HTML接口。在2000年11月标准化了DOM第二级,在第二级中不但对核心的接口升级,还定义了使用文档事件和CSS样式表的标准的API。Netscape 的Navigator 6.0浏览器和Microsoft的Internet Explorer 5.0浏览器,都支持了W3C的DOM第一级的标准。 目前,Netscape、 Firefox (FF火狐浏览器)等浏览器已经支持DOM第二级的标准,但Internet Explorer (IE) 还不完全支持DOM第二级的标准。

DOM对象节点属性

在DOM中通过使用节点属性可以查询出各节点的名称、类型、节点值、子节点和兄弟节点等。DOM常用的节点属性如表所示。

属性 说明
nodeName 节点名称
nodeValue 节点的值,通常只应用于文本节点
nodeType 节点的类型
parentNode 返回当前节点的父节点
childNodes 子节点列表
firstChild 返回当前节点的第一个字节点
lastChild 返回当前节点的最后一个字节点
previousSibling 返回当前节点的前一个兄弟节点
nextSibling 返回当前节点的后一个兄弟节点
attributes 元素的属性列表

访问指定节点

使用getElementById()方法来访问指定id的节点,并用nodeName属性、nodeType属性和nodeValue属性来分别显示出该节点的名称、节点类型和节点的值。

(1) nodeName属性

nodeName属性用来获取某一个节点的名称。

语法:
[sName=]obj.nodeName

参数说明:sName:字符串变量,用来存储节点的名称

(2)nodeType属性

nodeType属性用来获取某个节点的类型。

语法:[sType=]obj.nodeType

参数说明:
sType:字符串变量,用来存储节点的类型,该类型值为数值型。该参数的类型如下表

类型 数值 节点名 说明
元素(element) 1 标记 任何HTML或XML的标记
属性(attribute) 2 属性 标记中的属性
文本(text) 3 #text 包含标记中的文本
注释(comment) 8 #comment HTML的注释
文档(document) 9 #document 文档对象
文档类型(documentType) 10 DOCTYPE DTD规范

(3)nodeValue属性

nodeValue属性将返回节点的值

语法:

[txt=]obj.nodeValue

例子:访问指定节点

在页面弹出的提示框中,显示了指定节点的名称、节点类型和节点的值

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body id="b1">
        <h3>三号标题</h3>
        <b>加粗内容</b>
        <script>
            var by=document.getElementById("b1"); //访问id为“b1”的节点
            var str;
            str="节点名称:"+by.nodeName+"\n";  //获取节点名称
            str+="节点类型:"+by.nodeType+"\n"; //获取节点类型
            str+=""+by.nodeValue+"\n";     //获取节点值
            alert(str);   //弹出显示对话框
        </script>    
    </body>
</html>

节点

创建节点

1.创建新节点

创建新的节点先通过使用文档对象中的createElement()方法和createTextNode()方法, 生成一个新元素,并生成文本节点,再通过使用appendChild()方法将创建的新节点添加到当前节点的末尾处。
appendChild()方法将新的子节点添加到当前节点的末尾。

语法:

obj.appendChild(newChild)
参数说明:newChild:表示新的子节点

例子:创建新的节点

本实例在页面回载后自动显示“创建新节点”文本内容,并通过使用<b>标记将该文本加粗

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body onload="createchild()">
        <script>
            function createchild(){
                var b=document.createElement("b");  //创建新生成的节点元素
                var txt=document.createTextNode("创建新节点!"); //创建节点文本
                //将新的节点b添加到页面上
                b.appendChild(txt);
                document.body.appendChild(b);
            }
        </script>
    </body>
</html>

2.创建多个节点

创建多个节点时,先通过使用循环语句,利用createElement()方法和 createTextNode()元素,并生成文本节点,再通过使用appendChild()方法将创建的新节点添加到页面上。
例子:创建多个节点(1)。
本实例在页面加载后,自动创建多个<p>节点,并且每个节点中显示不同的文本内容。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body onload="c()">
        <script>
            function c(){
                var text=["第一个节点","第二个节点","第三个节点","第四个节点","第五个节点","第六个节点"];
                for(var i=0;i<text.length;i++){  //遍历节点
                    var ce=document.createElement("p");  //创建节点元素
                    var ctxt=document.createTextNode(text[i]); //创建节点文本
                    ce.appendChild(ctxt);
                    document.body.appendChild(ce);
                }            
            }
        </script>
    </body>
</html>

使用循环语句,通过使用appendChild()方法,将节点添加到页面中。由于appendChild()方法在每一次添加新的节点时都会刷新页面,会使浏览器显得十分缓慢。这里可以通过使用createDocumentFragment()方法来解决这个问题。该方法用来创建文件碎片节点。

插入节点

插入节点通过使用insertBefore()方法来实现。该方法将新的子节点添加到当前节点的末尾。

语法:

obj.insertBefore(new,ref)

参数说明:

new:表示新的子节点

ref:指定一个节点

例子:插入节点

在页面的文本框中输入需要插入的文本,如df,然后通过单击“插入”按钮将文本插入到页面中。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script>
            function cnode(str){  //创建节点
                var newp=document.createElement("p");
                var newtxt=document.createTextNode(str);
                newp.appendChild(newtxt);
                return newp;
            }
            function innode(nodeid,str){  //插入节点
                var node=document.getElementById(nodeid);
                var newnode=cnode(str);
                if(node.parentNode)
                node.parentNode.insertBefore(newnode,node);
            }
        </script>
    </head>
    <body >
        <h2 id="h">在上面插入节点</h2>
        <form id="frm" name="frm">
            输入文本:<input type="text" name="txt" />
            <input type="button" value="插入" onclick="innode('h',document.frm.txt.value);"/>
        </form>
    </body>
</html>

复制节点

使用cloneNode()方法实现复制节点。

语法:

obj. cloneNode(deep)参数说明:

deep:该参数是一个 Boolean值,表示是否为深度复制。深度复制是将当前节点的所有子节点全部复制,当值为true时表示深度复制:当值为false时表示简单复制,简单复制只复制当前节点,不复制其子节点。

删除和替换节点

1.删除节点
使用removChild()方法可以实现删除节点。该方法用来删除一个子节点。

语法:
obj removeChild(oldChild)
参数说明:
oldChild:表示需要删除的节点。

2.替换节点

使用replaceChild0方法实现替换节点。该方法用来将旧的节点替换成新的节点。

语法:
obj. replaceChild(new,old)

参数说明:
new: 替换后的新节点。old:需要被 替换的旧节点。

例子:替换节点

<head>

<title> </title>

<script language="javascript">

      function repN(str,bj){
          var rep=document.getElementByld('b1');
          if(rep)
          {
              var newNode=document.createElement(bj);  
              newNode.id="b1";
              var newText=document.createTextNode(str) 
              newNode.appendChild(newText);
              rep.parentNode.replaceChild(newNode.rep);  
          }
      }
</script>
</head>
<body>

<b id="b1">可以替换文本内容</b>
<br/>

输入标记: <іnрut id="bj" tyре="tехt" ѕіzе="15" />
输入文本: <input id="txt" type=":"text" size="15" /><br/>
<input type="button" value="替换" onclick="repN(txt.value.bj.value)" />

</body>

与DHTML想对应的DOM

通过DOM技术可以获取网页对象。本节将介绍另外一种获取网页对象的方法,那就是通过DHTML对象模型的方法。使用这种方法可以不必了解文档对象模型的具体层次结构,而直接得到网页中所需的对象。通过innerHTML、innerText、 outerHTML 和outerText属性可以很方便地读取和修改HTML元素内容。

说明
innerHTML属性被多数浏览器所支持,而innerText、 outerHTML 和outerText属性只有IE浏览器才支持。

innerHTML 和innerText属性

innerHTML属性声明了元素含有的HTML文本,不包括元素本身的开始标记和结束标记。设置该属性可以用于为指定的HTML文本替换元素的内容。

例子:通过innerHTML属性修改<div>标记的内容的代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>

    </head>
    <body >
        <div id="clock"></div>
        <script type="text/javascript"> 
            document.getElementById("clock").innerHTML="2011-<b>07</b>-22";
        </script>
    </body>
</html>

InnerText属性与innerHTML属性的功能类似,只是该属性只能声明元素包含的文本内容,即使指定的是HTML文本,它也会认为是普通文本,而原样输出。
使用innerHTML属性和innerText属性还可以获取元素的内容。如果元素只包含文本,那么innerHTML和innerText属性的返回值相同。如果元素既包含文本,又包含其他元素,那么这两个属性的返回值不同。

HTML代码 innerHTML属性 InnerText属性
<div>明日科技</div> "明日科技" "明日科技"
<div><b>明日科技</b></div> "<B>明日科技</B>" "明日科技"
<div><font color="red"></font></div> "<FONT COLOR=red></FONT>" ""

outerHTML 和outerText属性

outerHTML和outerText属性与innerHTML和innerText属性类似,只是outerHTML和outerText属性替换的是整个目标节点,也就是这两个属性还对元素本身进行修改。
下面以列表的形式给出对于特定代码通过outerHTML和outerText 属性获取的返回值,如表所示。

HTML代码 outerHTML属性 outerText属性
<div>明日科技</div> <DIV>明日科技</DIV> "明日科技"
<div>2011-<b>07</b>-22</div> <DIV id=clock>2017-<B>07</B>-22</DIV> "2017-07-22"
<div id="clock"><font color="red"></font></div> <DIV id=clock><FONT color=red></FONT></DIV> ""