简而言之,DOM(即文档对象模型)是一种将XML或HTML文档解析成树形节点的方法。通过DOM的方法与属性,我们就可以访问到页面中的任何元素,并进行元素的修改、删除以及添加的操作。同时,DOM也是一套语言独立的API体系。

在浏览器中,document对象就是我们当前所访问的文档。DOM中的所有节点(包括文档类节点、文本类节点、元素类节点以及属性类节点)都拥有属于自己的nodeType、nodeName和nodeValue等属性。

在DOM中,节点类型有12种,每种类型分别用一个整数来表示,最常用的节点类型有1(元素)、2(属性)、3(文本)。下面的演示是在百度首页中,通过chrome控制台进行调试的。

documentElement

通常来说,每个XML文档都会有一个用于封装文档中其他内容的根节点。具体到HTML文档上,这个根节点就是<html>标签,我们可以通过document对象的documentElement属性来访问它。

子节点

如果要检查一个节点是否存在子节点,我们可以调用该节点的hasChildNodes()方法:

HTML元素有两个子节点:即head元素和body元素。我们可以通过该元素中的childNodes数组类集合来访问它们。

任何子节点都可以通过其自身的parentNode来访问它的父节点:

属性

先找到第一个div,这个div是带有属性的:

我们可以通过该元素的hasAttributes()方法来检查该元素中是否存在属性:

bd.childNodes[0].hasAttributes();
true

下面对元素的属性进行访问,hasAttributes()、getAttribute():

访问标签中的文本

<p><em>second</em> paragraph</p>

我们可以通过元素的textContent属性来获取段落中的文本内容。如果我们使用的是不支持textContent属性的IE浏览器,则通过另一个叫innerText的属性来返回相同的值。

bd.childNodes[].textContent;

另外,我们也可以通过innerHTML属性来解决上述问题。该属性会返回指定节点中所有的HTML代码,返回的只是标签字符串而已。

bd.childNodes[].innerHTML

如果某个节点中只有文本,那么它的innerHTML值和textContent完全相同。如果节点中还包含标签,两者的不同就会显现出来:

除此之外,获得段落p的文本内容还有一种方式,即访问p节点内容的文本节点,读取它的nodeValue属性。

DOM访问的快捷方法

<html>
<head>
<title>My page</title>
</head>
<body>
<p class="opener">first paragraph</p>
<p><em>second</em> paragraph</p>
<p id="closer">final</p>
<!-- and that's about it -->
</body>
</html>

通过childNodes、parentNode、nodeName、nodeValue以及attributes这些集合,我们可以在树结构的上下层之间实现自由导航,并处理相关的文档操作。但空白处也可能会成为一个文本类节点,这件事会给这种DOM工作方式带来一些不稳定性。

另外,如果我们访问的树节点深度更深一些,我们或许就要为此写更多的代码。这就是为什么我们需要一些便捷的方法来解决问题。这些方法分别是getElementsByTagName()、getElementsByName()和getElementById()。

下面我们来获取第一个p元素的内容:

document.getElementsByTagName('p')[0].innerHTML;

对于这些元素的属性,我们可以通过attributes集合,或者getAttribute()方法来进行访问。但我们还可以使用一种更为简单的方法,即在运行时直接将属性名当做元素对象的属性来访问。例如,如果想获取其id属性的值,我们就可以直接向id当做一个属性。

当然,这种方法对于第一个段落中的class属性不起作用。这种异常情况的原因在于“class”这个词在ECMAScript中别设置成了保留子。对此我们只需要改用className即可:

兄弟节点、body元素及首位子节点

关于DOM树的导航操作,nextSibling与previousSibling这两属性也提供了一些便利。对于body元素来说,以下是一些常用的快捷方式:

另外,firstChild/lastChild这两个属性也是非常有用的。其中firstChild等价于childNodes[0],而lastChild则等价于childNodes[childNodes.length-1]。

遍历DOM

function walkDOM(n){
do{
console.log(n);
if(n.hasChildNodes()){
walkDOM(n.firstChild);
}
}while(n=n.nextSibling)
}

DOM节点访问的更多相关文章

  1. Javascript进阶篇——(DOM—节点---属性、访问节点)—笔记整理

    节点属性在文档对象模型 (DOM) 中,每个节点都是一个对象.DOM 节点有三个重要的属性 : 1. nodeName : 节点的名称 2. nodeValue :节点的值 3. nodeType : ...

  2. 深入理解DOM节点类型第五篇——元素节点Element

    × 目录 [1]特征 [2]子节点 [3]特性操作[4]attributes 前面的话 元素节点Element非常常用,是DOM文档树的主要节点:元素节点是html标签元素的DOM化结果.元素节点主要 ...

  3. DOM节点属性

    节点属性 在文档对象模型 (DOM) 中,每个节点都是一个对象.DOM 节点有三个重要的属性 : 1. nodeName : 节点的名称 2. nodeValue :节点的值 3. nodeType ...

  4. DOM节点关系,节点关系

    DOM节点关系 定义 节点中的各种关系可以用传统的家族关系来描述,相当于把文档树比喻成家谱. 属性 [nodeType.nodeName.nodeValue] 每个节点都有这三个属性,且节点类型不同, ...

  5. HTML DOM节点

    在 DOM 树中,基本上一切都是节点.每个元素在最底层上都是 DOM 树中的节点.每个属性都是节点.每段文本都是节点.甚至注释.特殊字符(如版权符号 ©).DOCTYPE 声明(如果 HTML 或者 ...

  6. JS 操作Dom节点之CURD

    许多优秀的Javascript库,已经封装好了丰富的Dom操作函数,这可以加快项目开发效率.但是对于非常注重网页性能的项目来说,使用Dom的原生操作方法还是必要的. 1. 查找节点 document. ...

  7. (转载)html dom节点操作(获取/修改/添加或删除)

    DOM 是关于如何获取.修改.添加或删除 HTML 元素的标准,下面为大家介绍下html dom节点操作,感兴趣的朋友可以参考下   HTML DOM 是关于如何获取.修改.添加或删除 HTML 元素 ...

  8. JavaScript操作DOM节点

    DOM (文档对象模型(Document Object Model)) 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.在网 ...

  9. JavaScript函数使用和DOM节点

    一.函数的声明与调用 1.函数声明的格式: function 函数名(参数1, 参数2,....){ 函数体代码 return 返回值:} 2.函数的调用:①直接调用:函数名(参数1的值,参数2的值, ...

随机推荐

  1. post multipart data boundary问题 使用curl 向jersey post文件

    原以为curl 模拟post file跟post string类似,-d参数一加 ,header一加就完了,这次遇到个问题,却怎么都搞不定. curl模拟post提交 与客户端定的协议是: Heade ...

  2. JDE Client开发端 左侧边栏设置

  3. iOS开发UI篇—Quartz2D使用(图片剪切)

    iOS开发UI篇—Quartz2D使用(图片剪切) 一.使用Quartz2D完成图片剪切 1.把图片显示在自定义的view中 先把图片绘制到view上.按照原始大小,把图片绘制到一个点上. 代码: - ...

  4. Java中的异常处理

    描述: 如果Java中的函数有可能抛出异常,则该异常要么被catch住,要么在声明函数时必须声明该函数体会throws exception. 处理的时候的流程是,当发生异常时,首先结束当前函数后续语句 ...

  5. SoapUI API + Groovy API + Difference with Java

    用soapUI进行webservice测试过程中,必不可少的要用到soapUI封装的代码.我们一起学习吧:) SoapUI 5.1.2 API:http://www.soapui.org/apidoc ...

  6. 大公司的Java面试题集

    找工作要面试,有面试就有对付面试的办法.以下一些题目来自我和我朋友痛苦的面试经历,提这些问题的公司包括IBM, E*Trade, Siebel, Motorola, SUN, 以及其它大小公司. 面试 ...

  7. 对hbase的学习

    HBase,是Hadoop DataBase. 面向列的分布式数据库, 思想来源于Google的BigTable思想,它的目标是在廉价硬件构成的集群上管理超大规模的稀疏表. Hbase的物理结构 HB ...

  8. php大力力 [044节] PHP的POST语句一定要大写!!if(!empty($_POST['id'])) {

    早上花了几个小时,寻找错误!!! 不应该这样写 if(!empty($_Post['id'])) { 应该这样写 if(!empty($_POST['id'])) { 万万不能小谢!

  9. POJ 2155 2维线段树 || 2维BIT

    #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> ...

  10. B - 搬寝室

    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Pract ...