前面说过一个完整的js实现,包括ECMAScript,BOM,DOM三部分,现在就来讲讲DOM的有关知识。

DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序接口)。DOM描绘来一个层次化的节点树,允许开发人员添加,移除和修改页面的某一部分。

Node类型

DOM1级定义了一个Node接口,该接口将由DOM中的所有节点类型实现。每一个节点都会有一个nodeType属性,用于表明节点的类型。节点类型由在Node类型中定义的下列12个数值常量表示,任何节点类型必居其一:

1.Node.ELEMENT_NODE(1)

2.Node.ATTRIBUTE_NODE(2)

3.Node.TEXT_NODE(3)

4.Node.CDATA_SECTION_NODE(4)

5.Node.ENTITY_REFERENCR_NODE(5)

6.Node.ENTITY_NODE(6)

7.Node.PROCESSING_INSTRUCTION_NODE(7)

8.Node.COMMENT_NODE(8)

9.Node.DOCUEMNT_NDOE(9)

10.Node.DOCUMENT_TYPE_NODE(10)

11.Node.DOCUMENT_FRAGMENT_NODE(11)

12.Node.NOTATION_NODE(12)

下面给出适用于所有浏览器中节点类型判断的方法:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title> </head>
<body>
<ul id="ydb">
<li>item1</li>
<li>item2</li>
<li>item3</li>
</ul>
<script src="./create.js"></script>
</body>
</html>
var oUl = document.getElementById("ydb");
console.log(oUl);
if (oUl.nodeType == 1) {
console.log("该节点是元素节点");
var tagName = oUl.nodeName;
var tagValue = oUl.nodeValue;
console.log('nodeName:' + tagName);
console.log('nodeValue:'+ tagValue);
}

上面所示:我们实现了在所有浏览器中的节点类型的检测,因为IE中没有公开Node类型的构造函数,所以直接使用节点类型常量会出错,而且在节点为元素节点的时候,我们获取了元素节点的具体信息,有两个属性,一个是nodeName,另一个是nodeValue。nodeName始终都是保存着元素的标签名,而nodeValue的值始终为null。

下面介绍在DOM1中节点常用的属性和方法:

1.childNodes

每一个节点都一个一个childNodes属性,其中保存一个NodeList对象。NodeList是一种类数组,用于保存一组有序的节点,可以通过位置来访问这些节点。注意:NodeList是实时更新的,并不是某一个时刻的快照。

可以通过方括号,也可以使用item()方法访问保存在NodeList中的节点。

下面给出在所有浏览器中把类数组NodeList转化为数组的操纵:

function convertToArray(nodes) {
var array = null;
try {
array = Array.prototype.slice(nodes, 0)
} catch{
// IE8及更早版本将NodeList实现为一个COM对象,而导致不能像JScript对象那样使用这种对象
// 向后兼容
array = [];
for (var i = 0, len = nodes.length; i < len; i++) {
array.push(nodes[i]);
}
}
return array;
}

2.parentNode(每个节点都有一个parentNode属性,该属性指向文档树中的父节点)

3.previousSibling  (指向该节点的上一个同胞节点,没有找到返回null)

4.nextSibling(指向该节点的下一个同胞节点,没有找到返回null)

5.firstChild (父节点的firstChild指向childNodes中的第一个节点)

6.lastChild (父节点的lastChild指向childNodes中的最后一个节点)

7.hasChildNodes() (该方法是一个非常有用的方法,在节点包含一个或多个子节点的情况下返回true,比查询childNodes列表的length属性更简单)

8.ownerDocument (该属性指向表示整个文档的文档节点。这种关系表示的是任何节点都属于它所在的文档,任何节点都不能同时存在于两个及其以上的文档中)

9.appendChild() (用于向使用该方法的节点中添加新的节点,如果新增的节点已经是文档的一部分了,那么就是将该节点从原来的位置转移到新位置,新增节点始终是放在末尾的,返回新增的节点)

10.insertBefore() (该方法接受两个参数:1.要插入的节点和作为参照的节点,新增的节点可以随意在任何位置,返回新增的节点)

11.replaceChild() (接受两个参数:1.要插入的节点 2.要替换的节点)

12.removeChild() (接受一个参数:1.要删除的节点,返回删除的节点)

上面所表述的属性和方法一般只适用于元素节点即nodeType为1的节点,下面介绍两个所有节点都适用的方法:

1.cloneNode() 用于创建调用该函数节点的一个副本,接受一个布尔值为参数,表示是否执行深复制。参数为true的时候,会复制节点及其整个子节点树,参数为false的时候,只复制节点本身。注意:复制的节点实际上是一个孤儿,没有存在当前文档中,除非用appendChild(),之类的方法,将其添加到文档中去。

cloneNode()不会复制添加到DOM节点中的JavaScript属性,例如事件处理程序等。但是在IE中它会复制事件处理程序,所以在复制之前最好先移除事件处理程序。

2.normalize() 处理文档树中的文本节点。由于解析器的实现或DOM操作等原因,可能会出现文本节点不包含文本,或者接连出现两个文本节点的情况。当在某个节点上调用这个方法的时候,就在该节点的后在节点中查找上述两种情况。如果找到了空文本节点,则删除它;如果找到相邻的文本节点,则将它们合并为一个文本节点。

Document类型

JavaScript通过Document类型表示文档。在浏览器中,document对象是HTMLDocument(继承自Docuemnt类型)的一个实例,表示整个HTML页面。而且,document对象是window对象的一个属性,因此可以作为全局对象来访问。该节点具有以下特征:

1.nodeType为9

2.nodeName为"#document"

3.nodeValue为null

4.parentNode为null

5.ownerDocument为null

6.其子节点可能是一个DocumentType(最多一个),Element(最多一个),ProcessingInstruction或Comment。

Document类型可以表示HTML页面或者其他XML文档。不过,最常见的应用还是作为HTMLDocument实例的document对象。通过这个文档对象,不仅可以取得与页面有关的信息,而且还能操作页面的外观及其底层结构。

1.文档的子节点

1.document.docuemntElement 取得对html的引用

2.docuemnt.body 取得对body的引用

3.docuemnt.doctype 取得对<!DOCTYPE>的引用

多数情况下,我们用不着在document对象上调用appendChild(),removeChild()和replaceChild()方法,因为文档类型(如果存在的话)是只读的,而且它只有一个元素子节点(该节点通常早就存在了)。

2.文档信息  

1.document.title 取得文档标题可以进行修改。

2.doument.URL 取得完整的URL。

3.document.domain 取得域名

4.document.referrer 取得来源页面的URL

2,3,4所表示的信息都存在于请求的HTTP头部,只不过是通过这些属性让我们能够在JavaScript中访问它们而已。

只有domain是可以设置的,由于跨域安全限制,来自不同子域页面无法通过JavaScript通信。而将每个页面的document.domain设置为相同的值,这些页面就可以互相方法对方包含的JavaScript的对象了。

3.查找元素

说到最常见的DOM应用,恐怕就要数取得特定的某个元素或者某组元素的引用,然后再执行一些操作。

1.getElementById() 接受一个参数:要取得元素的ID。如果找到相应的元素则返回该元素,如果不存在带有相应ID的元素,则返回null。注意,这里的ID必须与页面中元素的id特性严格匹配,包括大小写。

2.getElementsByTagName() 接受一个参数,即要取得元素的标签名,而返回的是包含领个或多个元素的NodeList。

3.getElementsByName() 接受一个参数,元素name特性的名称,这个方法返回带有给定name特性的所有元素。

4.特殊集合

除了属性和方法,document对象还有一些特殊的集合。这些集合都是HTMLCollection对象,为访问文档常用的部分提供了快捷方式,包括:

1.document.anchors 包含文档中所有带name特性的a元素。

2.document.applets 包含文档所有的applet元素,因为不再推荐使用applet元素,所以这个集合不建议在使用了。

3.document.forms 包含文档中所有的form元素。

4.document.images 包含文档中的img元素。

5.document.links 包含文档中所有带href特性的a元素。

5.文档写入

有一个document对象的功能已经存在多年了,那就是将输入流写入到网页中的能力。

1.document.write() 会原样写入。

2.document.writeln() 会在字符串的末尾添加一个换行符。

3.document.open()

4.docuemnt.close()

方法open()和close() 分别用于打开和关闭网页额输出流。如果是在页面加载期间使用write()或writeln()方法,则用不到这两个方法。

Element类型

除了Document类型之外,Element类型就要算是Web编程中最常用额类型了。Element类型用于表现XML或HTML元素,提供了对元素标签名,子节点以及特性的访问。Element节点具有以下特征:

1.nodeType为1

2.nodeName为元素的标签名

3.nodeValue为null

4.parentNode可能是Document或Element

5.其子节点可能是Element,Text,Comment,ProcessingInstruction,CDATASection或EntityReference

6.tagName为元素的标签名

1.HTML元素

所有HTML元素都由HTMLElement类型表示,不是直接通过这个类型,也是通过它的子类型来表示。HTMLLElement类型直接继承自Element并添加了一些属性。添加的这些属性分别对应于每个HTML元素中都存在的下列标准特性。

1.id 元素在文档中的唯一标识符

2.title 有关元素的附加说明信息,一般通过提示条显示出来

3.lang 元素内容的语言代码,很少使用

4.dir 语言的方向,值为“ltr”或“rtl”

5.className 与元素的class特性对应,即为元素指定的CSS类。

2.特性操作

操作特性的DOM方法主要有三个:

1.getAttribute()

2.setAttribute()

3.removeAttribute()

这三个方法可以针对任何特性使用,包括那些以HTMLElement类型属性的形式定义的特性。

有两类的特性,它们虽然有对应的属性名,但属性的值与通过getAttribute()返回的值并不相同。

第一类特性就是style,用于通过CSS为元素指定样式。在通过getAttribute()访问时,返回的style特性值中包含的是CSS文本,而通过属性来访问它则会返回一个对象。由于style属性是用于以编程方式访问元素样式的,因此并没有映射到style属性。

第二类与众不同的特性是onclick这样的事件处理程序。当在元素上使用时,onclick特性中包含的是JavaScript代码,如果通过getAttribute()访问,则会返回相应代码的字符串。而在访问onclick属性时,则会返回一个JavaScript函数(如果未在元素中指定相应特性,则返回null)。这是因为onclick及其其他事件处理程序属性本身就应该被赋予函数值。

由于存在这些差别,再通过JavaScript以编程方式操作DOM时,开发人员,经常不使用getAttribute(),而是只使用对象的属性。只有在取得自定义特性值的情况下,才会使用getAttribute()方法。

3.attributes属性

Element类型是使用attributes属性的唯一一个DOM节点类型。attributes属性中包含一个NamedNodeMap,与NodeList类似,也是一个动态集合。元素的每一个特性都由一个Attr节点 标示,每个节点都保存在NamedNodeMap对象中。NamedNodeMap对象拥有下列方法。

1.getNamedItem(name) 返回nodeName属性等于name的节点;

2.removeNamedItem(name) 从列表中删除nodeName属性等于name的节点;

3.setNamedItem(node) 向列表中添加节点,以节点的nodeName属性为索引。

4.item(pos) 返回位于数字pos位置处的节点

注意:每个特性节点都有一个名为specified的属性,这个属性如果为true,则意味着要么是在HTML中指定相应特性,要么是通过setAttribute()方法设置了特性。

4.创建元素

1.document.createElement() 接受一个参数,即要创建元素的标签名。返回一个DOM元素的引用。

Text类型

文本节点由Text类型表示,包含的是可以照字面解释的纯文本内容。纯文本内容可以包含转义后的HTML字符,但不能包含HTML代码。Text节点具有以下特征:

1.nodeType为3

2.nodeName为“#text”

3.nodeValue的值为节点所包含的文本

4.parentNode是一个Element

5.没有子节点

6.可以通过nodeValue属性或data属性访问text节点中所包含的文本,这两个属性中包含的值相同。对nodeValue的修改也会通过data反映出来,反之亦然。

7.appendData(text) 将text添加到节点的末尾

8.deleteData(offset,count) 从offset指定的位置开始删除count个字符

9.insertData(offset,text) 在offset指定的位置插入text

10.replaceData(offset,count,text) 用text替换从offset指定的位置开始到offset+count为为止处的文本

11.splitText(offset) 从offset指定的位置将当前文本节点分成两个文本节点

12.substringData(offset,count) 提取从offset指定的位置开始到offset+count为止的字符串。

13.length属性,保存着节点中字符的数目。

1.创建文本节点

document.createTextNode() 创建新文本节点,接受一个参数:要插入节点中的文本。

Comment类型

注释是在DOM中通过Comment类型来表示的。Comment节点具有以下特征:

1.nodeType为8

2.nodeName为“#comment”

3.nodeValue为注释的内容

4.parentNode为Document或Element

从头认识js-DOM1的更多相关文章

  1. JS DOM1核心概要document

    Document类型: document对象表示整个html页面,而且,document对象是window对象的一个属性: 文档信息:document.title,表示当前页面的标题: documen ...

  2. JS DOM1核心概要1

    节点:XML和HTML文档都是有节点构成的结构,每段标记都可以通过节点来表示: 节点类型: 元素节点(常用) 属性节点(常用) 文本节点 注释节点 文档节点 进程节点 文档类型节点 等... 了解节点 ...

  3. 学习JS的心路历程-类型

    前言 之前学JS时候都是靠着谷狗一路跌跌撞撞的学过来,从来没有去翻过MDN的文件,导致留了许多技术债给自己. 最近有幸遇到一位前辈并开始从头学JS,前辈表示学程序不看文件是想作死自己?于是我的第一份功 ...

  4. 从头开始写框架(一):浅谈JS模块化发展

    博客申请下来已经过去一个月了,一直不知道写点什么,毕竟我的文笔不是很好orz. 不过既然申请下来了,不写点什么总是觉得很可惜.正好最近在自己写框架,就把自己的进程和一些心得体会分享出来吧. 写在前面: ...

  5. js倒计时,页面刷新时,不会从头计时

    最近不忙,瞎鼓捣...哈哈 这里利用了H5的本地存储 localStorage,取秒数直接用了php的time()方法,就懒得用js取了. 把第一次访问页面时的时间存在客户端,然后再刷新的时候,比较用 ...

  6. chosen.jquery.js 搜索框只能从头匹配的解决思路+方法

    chosen.jquery.js 搜索框只能从头匹配的解决思路+方法 心急者请直接看下方 总结 ,由于本问题未能找到直接答案,所以只能通过修改源码解决.故将修改源码思路贴出来供大家参考,在遇到其他改源 ...

  7. JS从头开始

    API:应用程序编程接口 HTML:超文本标记语言 XML:可扩展标记语言 HTML和XML的差别:设计目的不同:XML被设计用来传输和存储数据,其焦点在数据的内容:HTML被设计用来显示数据,其焦点 ...

  8. 【高德地图API】从头德国高中生JS API(三)覆盖物——大喊|折线|多边形|信息表|聚合marker|点蚀图|照片覆盖

    覆盖物,是一张地图的灵魂.有覆盖物的地图.才是完整的地图.在一张地图上,除了底层的底图(瓦片图,矢量图),控件(有功能可操作的工具).最重要最必不可少的就是覆盖物了.覆盖物有多种.包含.标注.折线.多 ...

  9. js随机数 从头开始系列

    js要常常写啊要不然就要从0开始 1 var num = Math.random(); //创建一个0-1随机数字 num*=10 //变为0-10随机数字 //有好几种取整方式 var i = Ma ...

  10. js自定义事件、DOM/伪DOM自定义事件

    一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...

随机推荐

  1. 2017NOIP模拟赛三 A酱的体育课

    据说改编自$CodeM 美团点评编程大赛初赛A 轮$ 简单的水题...考试的时候没想到,xjb打了暴力. 显然,第$x$个人排在第$y$个位置的情况总数为$(n-1)!$,在这些情况中,第$x$人对答 ...

  2. Android library 传入本地maven仓库

    在项目根目录gradle.properties 添加 #包信息 GROUP_ID = com.chao.myvideo # Licence信息 PROJ_LICENCE_NAME=The Apache ...

  3. freeswitch的internal的profile无法启动

    服务器断电重启后,导致freeswitch的internal的profile无法启动 在fs_cli执行 sofia profile internal restart 打印如下信息: [ERR] sw ...

  4. Python连接SQLServer2000

    http://www.pymssql.org/en/stable/pymssql_examples.html 实例 import pymssql # 获取连接 conn = pymssql.conne ...

  5. Spring Boot 学习笔记(六) 整合 RESTful 参数传递

    Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...

  6. getcwd() 和 os.path.realpath () 的区别

    http://lemfix.com/topics/7 getcwd()获取当前目录:其他文件调用时,会根据当前文件的位置获取目录,不同的文件调用,值是不一样的. os.path.realpath()获 ...

  7. iPhoneSE2要在印度独家生产真得没戏?

    现在,关于iPhone SE2的消息层出不穷,总的来说,它是一款真实存在的手机,整体性能和iPhone5X/SE相似,大概可能差不多会加上一些"无线充电"之类的无聊功能.普通消费者 ...

  8. FastJson的学习之JSON互相转Map集合,List集合,JavaBean

    https://blog.csdn.net/weixin_36910300/article/details/79182120 创建两个实体类 一个是部门类,一个是部门员工类 部门员工类 public ...

  9. 吴裕雄--python学习笔记:sqlite3 模块

    1 sqlite3.connect(database [,timeout ,other optional arguments]) 该 API 打开一个到 SQLite 数据库文件 database 的 ...

  10. js弱类型转换的知识点

    本文属于转载知识点,以下是原博文作者:不死鸟哇的文章,文章链接:原文JavaScript里什么情况下a==!a为true呢? 今天群里有位同学问了这样一个问题,JavaScript在什么情况下会出现变 ...