`
风雪涟漪
  • 浏览: 508533 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
博客专栏
952ab666-b589-3ca9-8be6-3772bb8d36d4
搜索引擎基础(Search...
浏览量:9066
Ae468720-c1b2-3218-bad0-65e2f3d5477e
SEO策略
浏览量:18475
社区版块
存档分类
最新评论

Javascript 在浏览器环境中 (三) DOM节点的访问

阅读更多

DOM

DOM就是Document object Model的缩写。文档对象模型是把XML或HTML以树节点为表现形式的文档。用DOM方法和属性,你可以访问,修改,删除页面上任意一个元素,也是可以添加一个元素。DOM是独立于语言的API,可以被任意语言所实现,当然也包括了Javascript

看看下面的一个文本。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<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>
  </body>
</html>

 

我们来看看第二段

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

可以看到这是个p标签。它被包含在body标签中。所以说body是p的父节点,p是子节点。第一段和第三段也是body的子节点。它们都是第二段的兄弟节点。这个em标签是第二段p的子节点。因此p就是它的父节点。父子节点关系能描绘出像树一样的关系。所以叫做DOM结构树(DOM tree).

 

Core DOM 和 HTML DOM

我们已经知道DOM可以描绘出HTML和XML文档。事实上HTML文档就是XML文档,只不过更为规范些。因此作为DOM Level 1的一部分,Core DOM规范适用于所有XML文档以及HTML DOM规范扩展了Core DOM.当然HTML DOM不能适用于所有的XML文档,仅仅适用于HTML文档。让我们来看看Core DOM和HTML DOM的构造器。

 

构造器关系
构造器 继承自 Core /HTML 说明
Node Core 任意的节点
Document Node Core document对象,任意XML文档的入口。
HTMLDocument Document HTML 这个是window.document对象,扩展于前一个Document对象
Element Node Core 在源码的标签。p element的意思就是<p></p>标签
HTMLElement Element HTML 抽象的构造器,所有的HTML元素的构造器都继承它
HTMLBodyElement HTMLElement HTML body标签
。。。 。。。 。。 等等的HTML标签
CharacterData Node Core 抽象的构造器,处理文本的。
Text CharacterData Core 在标签内的文本节点。如em标签内的second.
Comment CharacterData Core <!-- 注释 -->
Attr Node Core 一个标签内的属性。如<p id="closer"> id就是用Attr创建的。
NodeList Core 一个Node的列表。有length属性。
NamedNodeMap Core 可以通过名称访问节点。
HTMLCollection HTML 和上面两个差不多,只不过是HTML规范

 

有兴趣的详情看官方规范把。http://www.w3.org/TR/REC-DOM-Level-1/

 

接下来要讲到

  • 访问DOM节点
  • 修改节点
  • 创建新的节点
  • 删除旧的节点

访问DOM节点

当要验证表单或者更换图片之前,我们要知道怎么样访问元素(element.)。有很多方法获取元素。

 

Document节点

通过document我们可以访问当前的文档。我们可以通过firebugs(火狐插件),来查看document的属性和方法。

 

所有的节点都有nodeType,nodeName,nodeValue的属性。我们来看看document的nodeType是什么

document.nodeType;//9

 一共有12节点类型。document是9。常用的是元素(element:1),属性(attribute:2),文本(text:3)。

节点还有名称。对于HTML标签。节点名称就是标签名称。文本节点(text)的名字是#text.文档节点(document)的名字是#document.

 

节点也有值。对于文本节点,值就是文本。document的值为null

 

documentElement

XML都会有个ROOT节点来包文档包含起来。对于HTML文档。ROOT节点就是html标签。访问root节点。可以用documentElement的属性。

document.documentElement;//<html>
document.documentElement.nodeType;//1
document.documentElement.nodeName;//HTML
document.documentElement.tagName;//对于element,nodeName和tagName相同

 Child Nodes

为了确定是否包含子节点我们可以用如下方法

document.documentElement.hasChildNodes();//true

 HTML有两个子节点。

document.documentElement.childNodes.length;//2

document.documentElement.childNodes[0];//<head>

document.documentElement.childNodes[1];//<body>

  也可以通过子节点访问父节点

document.documentElement.childNodes[1].parentNode;//<html>

 我们把body的引用赋值变量

var bd = document.documentElement.childNodes[1];
bd.childNodes.length;//9

 让我们看看body的结构

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

 为什么子节点个数为9个呢。

 首先是4个P还有一个注释一共4个。

 4个节点包含了3个空白的节点。这就7个。

 第8个在body和第一个p之间的空白节点。

 第9个就是在注释与</body>之间的空白节点。

 一共9个节点。

 

属性

因为第一节点是空白节点,所以第二个节点才是第一个p标签。

bd.childNodes[1];//    <p class="opener">

可以查看它是否有属性

 bd.childNodes[1].hasAttributes();//true

也可以查看attributes的个数

bd.childNodes[1].attributes.length;//1

//可以用index和名字来访问属性,也可以用getAttribute方法。
bd.childNodes[1].attributes[0].nodeName;//class

bd.childNodes[1].attributes[0].nodeValue;//opener

bd.childNodes[1].attributes['class'].nodeValue;//opener

bd.childNodes[1].getAttribute('class');//opener

 访问标签里的内容

让我们看看第一个标签p

你可以用textContent属性来访问。要注意的是,在IE浏览器中并不存在textContent,请用innerText来替换,结果都是一样的。

bg.childNodes[1].textContent;// "first paragraph"

还有一个属性是innerHTML.这并不是DOM的规范。但是主流浏览器都支持这个属性。它返回的是HTML代码。

 

bg.childNodes[1].innerHTML;// "first paragraph"

第一段没有html代码,所以结果和textContent(IE里是innerText)是一样的。来看下第二段包含HTML代码的标签

bd.childNodes[3].innerHTML;//"<em>second</em> paragraph"

bd.childNodes[3].textContent;//second paragraph

 

另一种方法可以获取文本节点,然后再取nodeValue属性,代码如下

bd.childNodes[1].childNodes.length;//1 子节点个数

bd.childNodes[1].childNodes[0].nodeName;// 节点名称 #text

bd.childNodes[1].childNodes[0].nodeValue;//节点值 first paragraph

 

快速访问DOM

通过childNodes,parentNode,nodeName,nodeValue以及attributes,可以访问文档任意的节点了。但是在实际运用过程中,文本节点是比较讨厌的。如果文本改变了,有可能就影响脚本了。还有如果DOM树足够的深入,那么访问起来的确有些不方便。幸好我们可以用更为方便的方法来访问节点。这些方法是

  • getElementsByTagName()
  • getElementsByName()
  • getElementById()

首先说下getElementsByTagName()

通过一个标签名称(tag name)来获取一个html元素的集合。例子如下

document.getElementsByTagName('p').length;//3

因为返回的是个集合,我们可以用过数组下标的形式来访问或者通过item方法。比较一下还是推荐用数组的访问方法。更简单一些。

document.getElementsByTagName('p')[0];//  <p class="opener">
document.getElementsByTagName('p').item(0);//和上面的结果一样

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

 

访问元素的属性,可以用attributes集合。但是更简单的方法是直接作为一个属性来访问就行。看个例子

document.getElementsByTagName('p')[2].id;//closer

要注意的是,class属性不能正常的使用。。要用className。因为class在javascript规范中是保留字。

document.getElementsByTagName('p')[0].className;//opener

我们可以用如下方法访问页面所有元素

document.getElementsByTagName('*').length;//9

注意:在IE早期的版本不支持上述方法。可以用document.all来取代。IE7已经支持了,但是返回的是所有节点(node),而不仅仅是元素节点(element nodes)。

 

 

Siblings, Body, First, Last Child

nextSibling和previousSibling是两个比较方便访问DOM的方法。用来访问相邻的节点的。例子如下

var para = document.getElementById('closer')
para.nextSibling;//"\n"
para.previousSibling;//"\n"
para.previousSibling.previousSibling;//<p>
para.previousSibling.previousSibling.previousSibling;//"\n"
para.previousSibling.previousSibling.nextSibling.nextSibling;// <p id="closer">

 

body 用来访问body元素的。

document.body;//<body>

firstChildlastChild 。firstChild是和childNodes[0]一样.lastChild和 childNodes[childNodes.length - 1]一样。

 

遍历DOM

通过以上的学习,我们可以写个函数,用来遍历DOM

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

walkDOM(document.body);//测试

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    JavaScript获取HTML DOM节点元素的方法的总结

    需要注意的是,在不同浏览器中,此属性的行为可能有所不同,例如IE7仅返回元素节点,而Firefox 2.0.0.11则包括所有类型的子节点。 #### 4. `parentObj.children` 返回一个仅包含元素子节点的HTMLCollection。这在...

    谷歌获取网页dom的插件

    6. 脚本编辑:可能支持直接在浏览器环境中编写和运行JavaScript代码,进行更复杂的DOM操作。 由于文件列表中只有一个名为"Plug-in unit"的条目,这可能是插件的主要代码单元或组件。它可能包含了实现上述功能的...

    第06章 DOM节点操作(上)

    在本章“第06章 DOM节点操作(上)”中,我们将深入探讨Document Object Model(DOM)在JavaScript中的应用,以及如何通过DOM接口来操纵HTML或XML文档的结构、内容和样式。DOM是一种标准,它允许编程语言与网页内容...

    domtoimage使用HTML5canvas从DOM节点生成图像

    "domtoimage使用HTML5canvas从DOM节点生成图像" 这个标题提到了一个名为 "domtoimage" 的工具,它利用HTML5的Canvas API将DOM(文档对象模型)中的节点转换为图像。这个过程通常用于网页截图或者在网页中保存和分享...

    JavaScript实现获取dom中class的方法

    在讲解的过程中,涉及到JavaScript操作DOM节点的一些基本技巧和方法,如使用`getElementsByClassName`和`getElementsByTagName`等。 知识点详细说明如下: 1. `getElementsByClassName` 方法: `...

    JavaScript_DOM编程艺术第二版(中文)

    跨浏览器兼容性是JavaScript DOM编程中的一个挑战,本书可能会讲解如何处理不同浏览器对DOM API的实现差异,以确保代码在各种环境下都能正常运行。了解这些技巧对于开发健壮的Web应用至关重要。 最后,本书可能还会...

    JavaScript DOM编程艺术【第2版&高清】.pdf

    1. JavaScript基础知识:JavaScript是一种在浏览器中运行的脚本语言,它是实现网页动态效果和交云的核心技术之一。要精通DOM编程,首先要对JavaScript语言本身有足够的理解,包括变量、数据类型、运算符、函数、对象...

    javascript中的BOM与DOM、JS核心.pdf

    JavaScript的核心是基于ECMAScript的,ECMAScript是与运行环境无关的语言,浏览器是ECMAScript的一个众所周知的运行环境,出了浏览器,js还可以运行在PS等等中。 BOM(Browser Object Model)对象是JavaScript访问...

    javascriptDom节点API个人总结.docx

    本文档旨在总结JavaScript中DOM(Document Object Model)节点API的基本用法及其在实际开发中的应用。通过深入理解这些API,开发者能够更加灵活地操控网页文档结构,实现动态内容更新、用户交互等功能。 #### 文档...

    JavaScript DOM编程艺术(中文第2版)

    第1章 JavaScript简史 1.1 JavaScript的起源 1.2 DOM 1.3 浏览器战争 1.3.1 DHTML 1.3.2 浏览器之间的冲突 1.4 制定标准 1.4.1 浏览器以外的考虑 1.4.2 浏览器战争的结局 1.4.3 崭新的起点 1.5 小结 第2章 ...

    JavaScript中的DOM

    在JavaScript中,DOM(Document Object Model)是一种用于表示HTML或XML文档的标准模型,它将文档解析为一个可操作...通过深入理解DOM节点及其关系,以及如何操作这些节点,开发者能够构建交互性强、响应式的Web应用。

    DOM和BOM的使用

    查找节点是指通过 JavaScript 查找 DOM 中的节点。DOM 提供了许多方法和属性,开发者可以通过这些方法和属性来查找节点。 元素树 元素树是指 DOM 中的元素树,它将 HTML 元素抽象为一个树形结构,每个节点都是一个...

    JavaScript & DOM Enlightenment

    DOM Enlightenment可能涵盖了如何通过JavaScript访问和修改DOM节点,包括元素选择(如querySelector和querySelectorAll)、遍历DOM树、添加和删除元素、以及事件处理。此外,还可能涉及到性能优化技巧,如使用文档...

    JavaScript DOM编程艺术 第2版+代码

    这本书全面覆盖了利用JavaScript来操纵和改变网页内容的方法,帮助开发者提升在浏览器环境中编写交互式网页的能力。 书中首先介绍了DOM的基本概念,包括DOM的层次结构、节点类型以及如何通过JavaScript访问和操作...

    随书光盘+PDF JavaScript DOM编程艺术(第2版)-源代码2.5MB PDF114MB .zip

    JavaScript DOM编程艺术(第2版)是一本深受开发者欢迎的书籍,主要涵盖了JavaScript语言在Web前端开发中的应用,特别是关于DOM(Document Object Model)的深入理解和实践。这本书的随书光盘包含了源代码和PDF电子版...

    开源Tree树状菜单HTML+Javascript兼容各浏览器

    在JavaScript中,可能采用了异步加载策略来优化性能,避免一次性加载所有节点导致页面卡顿。这可能涉及到递归函数、回调或现代的Promise和async/await语法。同时,为了提高用户体验,可能还实现了缓动效果,如平滑...

    DOM 节点操作 【微重点】【案例】.pdf

    在DOM节点操作中,children属性可以用来获取某个元素的所有子元素节点(不包括文本节点和注释节点),parentNode属性则用来获取某个节点的父节点。这些属性提供了对文档结构的直接访问和操作能力,极大地提升了Web...

    【JavaScript源代码】vue 虚拟DOM快速入门.docx

    Vue.js中的虚拟DOM技术是现代前端开发中一个关键的概念,尤其在使用JavaScript框架如Vue时。虚拟DOM(Virtual DOM)是一种优化DOM操作的技术,通过在内存中构建一棵数据结构(JavaScript对象),模拟真实DOM树,以此...

Global site tag (gtag.js) - Google Analytics