简而言之,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. investopedia level 2

    Mispricing can be explained by the sum of the two components: true mispricing and estimation errorVe ...

  2. 通用的web系统数据导出功能设计实现(导出excel2003/2007 word pdf zip等)

    前言 我们在做web系统中,导出也是很常用的一个功能,如果每一个数据列表都要对应写一个导出的方法不太现实.现在就想设计一个共通的功能来实现这个导出. 需求分析 在开始之前我们先要明白我们要实现怎样一个 ...

  3. iOS开发UI篇—Date Picker和UITool Bar控件简单介绍

    iOS开发UI篇—Date Picker和UITool Bar控件简单介绍 一.Date Picker控件 1.简单介绍: Date Picker显示时间的控件 有默认宽高,不用设置数据源和代理 如何 ...

  4. 在 Ubuntu 14.04 中配置 PXE 服务器

    PXE(预启动执行环境Preboot Execution Environment)服务器允许用户从网络中启动 Linux 发行版并且可以不需要 Linux ISO 镜像就能同时在数百台 PC 中安装. ...

  5. css盒子模型层级3D图

    作为前端开发工程师,大家都应该知道盒子模型.下面用一张图来表达3D盒子模型的层级关系 大家可以看到background-color 在background-image的下一层.这个希望对大家有帮助

  6. Tri-Training: Exploiting Unlabeled Data Using Three Classifiers

    Abstract – In many practical data mining applications such as web page classification, unlabeled tra ...

  7. LeetCode 笔记系列 20 Interleaving String [动态规划的抽象]

    题目: Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given: ...

  8. swiper中提供的动画效果

    目前就只有这些,大家也可以尝试自己写一些想要的效果.动手试试,才能清楚每个效果具体是怎么回事~ bounce:弹跳两下出来flash:闪烁两下pulse:脉冲形式出来rubberBand:橡皮圈形式弹 ...

  9. Git 一次性 pull push 所有的分支

    /********************************************************************************* * Git 一次性 pull pu ...

  10. Linux下部署solrCloud

    1. 准备工作 这里我只是把我的师兄教我的关于Solrcloud搭建的过程,以及需要注意的地方文档化了.感谢他教会了我很多. 1.机子IP 三台安装linux系统的机子的IP地址为: 172.24.1 ...