概念扫盲

DOM

DOM是 Document Object Model(文档对象模型)的缩写,是W3C(万维网联盟)的标准。
DOM 定义了访问 HTML 和 XML 文档的标准:
“W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。”
W3C DOM 标准被分为 3 个不同的部分:

  • 核心 DOM - 针对任何结构化文档的标准模型
  • XML DOM - 针对 XML 文档的标准模型
  • HTML DOM - 针对 HTML 文档的标准模型

这篇文章主要讲HTML DOM

HTML DOM

HTML DOM 是:

  • HTML 的标准对象模型
  • HTML 的标准编程接口
  • W3C 标准

HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。
换言之,HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准。

JavaScript DOM

前面讲过,DOM定义了访问HTML和XML文档的标准:“W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。”
注意粗体字部分,DOM是中立于平台和语言的接口,也就是任意平台、任意语言中,都有相应的DOM接口。但在我们这篇文章中,我们主要的还是采用浏览器平台、JavaScript语言中的DOM接口来做阐述,这也是目前使用最频繁的接口了。
只是想提醒大家,不要以偏概全,认为只有JavaScript中的DOM才是真正的DOM。下文中,我们说的DOM接口也全部是JavaScript DOM和HTML DOM中的内容。
学习这部分需要大家对HTML、CSS、JS有基础的认识和了解。
 

DOM树

简单的DOM树

我们之前说过一句话,也希望大家记住这句话:“有嵌套的地方就有父子关系。”
HTML中允许嵌套,并且允许多重嵌套,多种父子关系就形成了一棵树,我们叫它DOM树。
我们先来看一份简单的HTML代码:
<html>
<head>
<title>文档标题</title>
</head>
<body>
<a href="#">我的链接</a>
<h1>我的标题</h1>
</body>
</html>
它的DOM树是这样的:

节点关系

基本的节点关系有父子、同胞,衍生出来的有祖先—后代。父节点我们用parent表示,子节点用child,同胞用sibling。
  • 在节点树中,顶端节点被称为根(root)
  • 每个节点都有父节点、除了根(它没有父节点)
  • 一个节点可拥有任意数量的子
  • 同胞是拥有相同父节点的节点

我们将刚才的DOM树截取掉一部分,

这样就比较清楚了。

节点类型

文档的不同组成部分有不同的节点类型,共有12种,具体如下:
节点类型值 节点类型 描述 子节点
1 Element 代表元素 Element, Text, Comment, ProcessingInstruction, CDATASection, EntityReference
2 Attr 代表属性 Text, EntityReference
3 Text 代表元素或属性中的文本内容。 None
4 CDATASection 代表文档中的 CDATA 部分(不会由解析器解析的文本)。 None
5 EntityReference 代表实体引用。 Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference
6 Entity 代表实体。 Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference
7 ProcessingInstruction 代表处理指令。 None
8 Comment 代表注释。 None
9 Document 代表整个文档(DOM 树的根节点)。 Element, ProcessingInstruction, Comment, DocumentType
10 DocumentType 向为文档定义的实体提供接口 None
11 DocumentFragment 代表轻量级的 Document 对象,能够容纳文档的某个部分 Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference
12 Notation 代表 DTD 中声明的符号。 None
其中,常用的是类型有Element,Attr,Text,Document等几种。节点类型可以通过以下语句来获得:
node.nodeType

获取到的将是对应的节点类型值,注意这个值以字符串形式返回。

不同的节点类型的nodeName 和nodeValue返回值如下:
节点类型 nodeName 返回 nodeValue 返回
1 Element 元素名 null
2 Attr 属性名称 属性值
3 Text #text 节点的内容
4 CDATASection #cdata-section 节点的内容
5 EntityReference 实体引用名称 null
6 Entity 实体名称 null
7 ProcessingInstruction target 节点的内容
8 Comment #comment 注释文本
9 Document #document null
10 DocumentType 文档类型名称 null
11 DocumentFragment #document 片段 null
12 Notation 符号名称 null

JavaScript DOM接口

获取DOM node

传统方法

获取DOM节点的传统方法有三种,分别是getElementById, getElementsByTagName, getElementsByName。
getElementById属于document对象的方法,传入参数为节点的id值,返回该id对应的节点。由于id是独一无二的,所以返回值只有一个节点。如果文档中有多个同名id,不同浏览器处理结果可能不同,例如谷歌浏览器是以最后一个为准。例如:
<html>
    <head>
        <title>文档标题</title>
    </head>
    <body>
        <form action="get" id="target-form">
            <input type="text" name="target-input" value="123" />      
        </form>
    </body>
    <script type="text/javascript">
        var a = document.getElementById("target-form"); // form对应的节点
    </script>
</html>

切记不要丢了前面的document,否则会报错。

getElementsByName和getElementById很相似,都是document对象里的方法,不同的是传入的参数为节点的name。由于文档中允许存在同个name值的节点,例如<input type="radio" />,又例如多个表单中的同名表单项。所以返回对象是一个nodelist,你也可以把它当成一个数组。
我们还是用上面的例子,把js部分修改一下:
var a = document.getElementsByName("target-input")[0]; // input对应的节点

getElementsByTagName和前面两个分别有相同之处,又有不同之处。它不仅仅是document对象的方法,还是所有元素节点的方法。它传入的参数是标签名,返回的是nodelist,因为明显同个文档中可以有多个相同标签。

<html>
<head>
<title>文档标题</title>
</head>
<body>
<form action="get" id="target-form">
<input type="text" name="target-input" value="123" />
</form>
</body>
<script type="text/javascript">
var a = document.getElementById("target-form").getElementsByTagName("input")[0]; // input对应的节点
</script>
</html>

可能有些人会问,我还看到了getElementsByClassName方法啊。其实,这方法只是部分浏览器产商定下的方法,很实用,但并非W3C标准里的方法,至少IE8及以下是不能用的。

新的方法

HTML5中,新支持了两个节点获取方法,那就是querySelector和querySelectorAll方法,两者都是document或元素节点的方法。它们的参数一样,都是字符串,且以CSS选择器的形式体现,不同的是,querySelector返回首次匹配的节点,而querySelectorAll返回nodeList,查找原则为深度优先和先序遍历。
<html>
    <head>
        <title>文档标题</title>
    </head>
    <body>
        <form action="get" id="target-form">
            <input type="text" name="target-input" value="123" />
            <input type="text" name="target-input2" value="123" />
        </form>
    </body>
    <script type="text/javascript">
        var a = document.querySelector("#target-form").querySelectorAll("input"); // 包含两个input的数组
    </script>
</html>

获取及操纵属性值

我们终究是要利用这些接口来做点什么的,例如,我们想获取上文那例子里面输入框的值。我们可以这么写:
var a = document.getElementById("target-form").getElementsByTagName("input")[0].value;

如果我们要设定输入框的值,也类似:

 document.getElementById("target-form").getElementsByTagName("input")[0].value = “12345”;

但这样好像没什么用,我们换种用法,更使用一点。我们经常看到有一种效果,点击按钮,某个东西消失了,再点击,又出现了。我们来模拟一下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>文档标题</title>
</head>
<body>
<p>点击按钮此句消失</p>
<button id="btn">消失</button>
</body>
<script type="text/javascript">
var btn = document.getElementById("btn"),
p = document.getElementsByTagName("p")[0];
btn.onclick = function() {
if(p.style.display == "none") {
p.style.display = "";
this.innerText = "消失";
} else {
p.style.display = "none";
this.innerText = "显示";
}
}
</script>
</html>

在这里,我们操作的是元素节点p里面的属性节点style,修改其display属性,从而达到修改CSS的目的。

DOM 事件

在上例中我们看到了一个点击事件,这就是事件中的一种。关于DOM事件我们在另一篇文章中有详细讲到,详情请点击观看JavaScript事件

JavaScript快速入门(六)——DOM的更多相关文章

  1. JavaScript快速入门(四)——JavaScript函数

    函数声明 之前说的三种函数声明中(参见JavaScript快速入门(二)——JavaScript变量),使用Function构造函数的声明方法比较少见,我们暂时不提.function func() { ...

  2. JavaScript快速入门-DOM对象

    一.概述 1.什么是 DOM? DOM 是 W3C(万维网联盟)的标准.DOM 定义了访问 HTML 和 XML 文档的标准: "W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允 ...

  3. Javascript快速入门(上篇)

    Javascript的熟练之路,小弟来了. JavaScript简介:JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript ...

  4. JavaScript快速入门-BOM对象

    一.什么是BOM      概念 BOM(Browser Object Model)即浏览器对象模型.BOM提供了独立于内容,而与浏览器窗口进行交互的对象:      核心 由于BOM主要用于管理窗口 ...

  5. javascript快速入门21--DOM总结

    跨浏览器开发 市场上的浏览器种类多的不计其数,它们的解释引擎各不相同,期待所有浏览器都一致的支持JavaScript,CSS,DOM,那要等到不知什么时候,然而开发者不能干等着那天.历史上已经有不少方 ...

  6. Web开发初探之JavaScript 快速入门

    本文改编和学习自 A JavaScript Primer For Meteor 和 MDN Web教程 前文 Web开发初探 概述 本文以介绍 JavaScript 为主,初学者掌握本文的内容后,将能 ...

  7. javascript快速入门

    这个在w3school在线文档讲解的很详细,还能在线练习. 所以我只写一些入门的东西和最常用的总结以及注意事项: JavaScript 是脚本语言 一般被人们称为JS,Jquery就是对js语言的封装 ...

  8. Javascript快速入门(下篇)

    Javascript, cheer up. Ajax:其通过在Web页面与服务器之间建立一个额外的处理层,这个处理层就被称为Ajax引擎,它解释来自用户的请求,在后台以异步的方式处理服务器通信,其结构 ...

  9. JavaScript快速入门(一)——JavaScript概览

    JavaScript是什么? JavaScript的诞生 在1995年前后,当时世界上的主流带宽为28.8Kbps,现在世界平均下载带宽为21.9Mbps(数据来源于http://www.netind ...

随机推荐

  1. 06-C语言运算符2

    目录: 一.类型转换 二.条件运算符 三.逗号运算符 四.运算符优先级 回到顶部 一.类型转换 1.类型升级,浮点型高于整型,长整型高于整型,有符号与无符号取有符号. 2.在C语言中,类型转换没有提示 ...

  2. AddSelf

    今天看     C语言深度深度解剖  第58页 看到了这么一段代码,就敲进了dev 谁知居然出现了个死循环.但是我不知道为什么. 贴出来,等有空了再请教别人好好分析,或者是网络上的高人指点一下 //d ...

  3. 感觉Release有时比Debug要健壮

    评估文件夹大小的时候,直接跨线程操作UI界面,Debug崩溃,Release不崩溃. 更多的一种情况是,本机DEBUG下不崩溃,把RELEASE版本到别的机子上,立刻崩溃(登录框的进度条的对象为空,仍 ...

  4. U+00A0 (Non-breaking space)无法被正确压缩

    Code Glyph Decimal HTML Description #U+00A0     Non-breaking space 0096 https://zh.wikipedia.org/wik ...

  5. JDK1.6官方下载

    JDK1.6官方下载_JDK6官方下载地址:http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin- ...

  6. 编程算法 - 扑克牌的顺子 代码(C)

    扑克牌的顺子 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 从扑克牌中随机抽取5张牌, 推断是不是一个顺子, 即这5张牌是不是连续的. 2~1 ...

  7. CheckBox控件

    前台代码: <asp:CheckBox ID="CheckBox1" runat="server" Text ="苹果"/> & ...

  8. Vi/VIM键盘图, Vi/vim学习图

    Vi/vim学习图 引用: Vi键盘图片可视化教程 http://www.cnblogs.com/me115/archive/2010/11/16/1878295.html 网上的文章易流失.感谢分享 ...

  9. java--方法和成员的继承,访问

    //在调用方法的时候,不是看句柄是哪一个类,而应该看对象是属于哪一个类的,属于哪一个类的,就调用哪一个类的成员和方法. //子类可以添加自己的新方法,但是子类对象的引用赋值给父类句柄之后,不能使用父类 ...

  10. HTML 5与HTML 4的区别

    严重的拖延者患者,本来前天就打算写的,奈何拖到的今天才...(对拖延症有啥好的建议还望留言下,感激不尽...) 过完年了,跳槽蠢蠢欲动了,看些基础知识好应对面试,正好就整理整理... 正文开始 1.推 ...