简而言之,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. Python中 filter | map | reduce | lambda的用法

      1.filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tupl ...

  2. CentOS7下ifconfig command not found

    执行命令 yum install net-tools

  3. Flume使用小结

    本文介绍初次使用Flume传输数据到MongoDB的过程,内容涉及环境部署和注意事项. 1 环境搭建 需要jdk.flume-ng.mongodb java driver.flume-ng-mongo ...

  4. PDF 补丁丁 0.4.2.1023 测试版发布:新增旋转页面功能

    新的测试版发布啦.此版本增加了旋转页面的功能. 在“PDF文档选项”对话框的“页面设置”选项卡中,可设置需要旋转的页面(输入页码范围),以及旋转角度. 此外,还修复了统一页面尺寸功能的小问题.

  5. [最近公共祖先] POJ 1330 Nearest Common Ancestors

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 27316   Accept ...

  6. Population-based metagenomics analysis reveals markers for gut microbiome composition and diversity

    读paper的时候觉得自己就是个24K纯学渣(=.=)一大堆问题等着我去解决...所以在这里写一个Q&A好了,先列问题,逐步填充答案- ××××××××××××××××××我是分割线么么哒×× ...

  7. 【转】使用Sublime + PlantUML高效地画图

    project: blog status: publish target: how-to-use-sublime-and-plant-uml-draw-diagram.md date: 2015-12 ...

  8. Unparsed aapt error(s)! Check the console for output解决方法

    在Eclipse平台进行Android 应用开发时,编辑,修改或增删 res/下资源文件时有时会遇到如下错误提示:“Unparsed  aapt error(s)! Check the console ...

  9. js 上传文件预览

    1. FILE API html5提供了FIle和FileReader两个方法,可以读取文件信息并读取文件. 2. example <html> <body> <div ...

  10. UE4 - C++ 射线捕捉

    #include "Runtime/Engine/Classes/Kismet/KismetMathLibrary.h" //省略大部分代码 void AMyFPS_Charact ...