DOM总结

DOM知识点

作者 Trekerz 日期 2017-11-12
DOM总结

一、节点

DOM1中的Node接口在JavaScript中是作为Node类型实现的。每个节点都有一个nodeType属性,拥有表明节点的类型。

注意:Node类型一共有12种,任何节点必居其一:

Node.ELEMENT_NODE(1) Node.PROCESSING_INSTRUCTION_NODE(7)
Node.ATTRIBUTE_NODE(2) Node.COMMENT_NODE(8)
Node.TEXT_NODE(3) Node.DOCUMENT_NODE(9)
Node.CDATA_SECTION_NODE(4) Node.DOCUMENT_TYPE_NODE(10)
Node.ENTITY_REFERENCE_NODE(5) Node.DOCUMENT_FRAGMENT_NODE(11)
Node.ENTITY_NODE(6) Node.NOTATION_NODE(12)

1. Node总类

(1) nodeType
(2) nodeName、nodeValue

对于元素节点,name始终是标签名,value始终为null。

(3) childNodes

保存着一个NodeList对象(一种类数组),有length属性,用以保存一组有序节点。

注意:可以使用方括号或item()来访问各个子节点,例如:childNodes.item(0)。

(4) parentNode
(5) nextSibling、previousSibling
(6) lastChild、firstChild
(7) ownerDocument

该属性指向表示整个文档的文档节点。

(8) hasChildNodes()
(9) appendChild()、insertBefore()

appendChild():接收1个参数:节点。返回该插入的节点。

insertBefore():接收2个参数:节点、参照节点。返回该插入的节点。

(10) replaceChild()

接收2个参数:要插入的节点、要替换的节点。返回要替换的节点。

(11) removeChild()

接收1个参数:节点。返回该删除的节点。

(12) cloneNode()

接收1个参数:布尔,表示是否深复制。返回复制的节点(树)。

(13) normalize()

处理子节点中的文本节点,空文本节点则删除,相连文本节点则合并。

2. Document类型

通过Document类型可以取得与页面有关的信息,还能操作页面的外观及其底层结构。

  • document对象是HTMLDocument(继承自Document类型)的一个实例,表示整个HTML页面。
  • document对象是window对象的一个属性,可以全局访问。
特点
nodeType = 9
nodeName = ‘#document’
nodeValue = null
parentNode = null
ownerDocument = null
子节点可以是DocumentType、Element、ProcessingInstrument、Comment
(1) documentElement

始终指向页面中的<html>元素。

(2) body、title(可设置)

指向页面中的<body>元素、<title>元素,修改title属性可以改变title元素里的内容。

(3) doctype

指向<!DOCTYPE>。(浏览器对doctype的支持差别很大)

(4) URL、domain(可设置)、referrer

页面完整的URL、页面的域名、链接到当前页面的那个页面的URL(若无则为空字符串)。

注意1:由于跨域限制,domain只可设为同域下的域名。如果页面有内嵌框架,内外框架的domain不同,其对象之间也不能通信。

注意2:如果domain一开始是松散的(wrox.com),则不能再设为紧绷的(p2p.wrox.com)。

(5) getElementById()、getElementsByTagName()

注意:可以通过方括号、item()、namedItem()来访问各个节点。

(6) getElementsByName()

注意:与getElementsByTagName()一样返回一个NodeList对象。

(7) 特殊集合
document.anchors 文档中所有带name特性的<a>元素
document.applets 文档中所有<applet>元素
document.forms 文档中所有<form>元素
document.images 文档中所有<img>元素
document.links 文档中所有带href特性的<a>元素
(8) document.implementation.hasFeature()

这个属性可以检测文档实现了哪些级别的DOM(1级2级3级)。属性中的hasFeature()方法接收2个参数:要检测的DOM功能名称、版本号。返回true或false。

(9) write()、writeln()、open()、close()

前两个方法用来将输出流写入到网页中。(writeln()会在字符串尾添加一个\n)

后两个方法用来打开或关闭输出流(若在页面加载期则不必用)。

注意:如果在页面加载结束后使用write(),则会重写整个页面。

3. Element类型

所有HTML元素都由HTMLElement类型表示(继承自Element类型),更细分来说,HTMLElement类型下面还有一些子类型,用来表示不同的标签类型。

特点
nodeType = 1
nodeName的值为元素的标签名
nodeValue = null
parentNode可能是Document或Element
子节点可以是Element、Text、Comment、ProcessingInstruction、CDATASection或EntityReference
(1) tagName

和nodeName一样。在HTML中返回的标签名是大写的。

(2) 每个HTML元素都有的属性
id 同CSS的id值
title 有关元素的附加说明信息,一般通过工具提示条显示出来
lang 元素内容的语言代码,很少使用
dir 语言的方向,有ltr和rtl
className 同CSS的class值
(3) getAttribute()、setAttribute()、removeAttribute()

用来操作元素特性。(一般比如id、title、className、style、onclick等)

注意:如果要创建自定义特性并赋值,则必须使用setAttribute(),不能直接div.mycolor=’red’。其它的原有特性则可以,比如div.id=’zjf’是可以的。

(4) attributes

attributes属性包含一个NamedNodeMap,与NodeList相似,也是动态集合。元素的每一个特性都由一个Attr节点表示,每个节点都保存在NamedNodeMap对象中。

(5) getNamedItem(name)、removeNamedItem(name)、setNamedItem(node)、item(pos)

attributes属性中包含一系列节点,每个节点的nodeName属性就是特性名称、nodeValue就是特性的值。以上这些方法主要用来获得、删除、设置元素的属性,也可以用来遍历(返回的顺序因浏览器而不同)。

注意:一般这几个方法没有(3)中的方法好用。

(6) document.createElement()
(7) childNodes

4. Text类型

文本节点由Text类型表示,包含的是可以照字面理解的纯文本内容。

注意1:如果标签中没有内容,则不存在文本节点,比如<div></div>

注意2:被修改的文本节点会立即反映在页面上。

注意3:向文本节点中添加的文本会被自动转化为HTML编码(例如<会被转化为&lt;)。

特点
nodeType = 3
nodeName = ‘#text’
nodeValue为节点所包含文本
parentNode是一个Element
不支持子节点
(1) appendData(text)

将text添加到节点的末尾。

(2) deleteData(offset, count)、insertData(offset, text)、replaceData(offset, count, text)

从offset位置开始删除/插入/替换count个字符。

(3) splitText(offset)

从offset开始将文本分成两个文本节点,返回分割后的第二个节点。

(4) substringData(offset, count)

提取从offset开始的count个字符。

(5) length

节点中字符数目。

(6) document.createTextNode()

接收1个参数:要插入的节点字符串。

(7) normalize()

在一个包含两个及以上的文本节点的父节点上调用此方法,会将所有文本节点合并成一个节点。

5. Comment类型

特点
nodeType = 8
nodeName = ‘#comment’
nodeValue值为注释的内容
parentNode可能是Document或Element
不支持子节点

Comment类型与Text类型继承自相同基类,因此它具有除splitText(offset)之外的所有字符串操作方法

(1) document.createComment(text)

创建注释节点并传递注释文本。

6. CDATASection类型

特点
nodeType = 4
nodeName = ‘#cdata-section’
nodeValue值为CDATA区域中的内容
parentNode可能是Document或Element
不支持子节点

CDATA区域只会出现在XML文档中,大多数浏览器会把CDATA区域错误地解析为Comment或Element

(1) document.createCDataSection(text)

创建CDATA区域。

7. DocumentType类型

特点
nodeType = 10
nodeName为doctype的名称
nodeValue = null
parentNode是Document
不支持子节点

DocumentType对象保存在document.doctype中。

(1) name

文档类型名称,也就是出现在<!DOCTYPE之后的文本。

(2) entities(无用)

由文档类型描述的实体的NamedNodeMap对象。

(3) notations(无用)

由文档类型描述的符号的NamedNodeMap对象。

8. DocumentFragment类型

特点
nodeType = 11
nodeName = ‘#document-fragment’
nodeValue = null
parentNode = null
子节点可以是Element、Text、Comment、ProcessingInstruction、CDATASection或EntityReference

所有节点类型中,只有这个没有对应的标记

DocumentFragment继承了Node的所有方法,可以用于暂时存放想要插入的文档片段(之后可以一举插入真实文档中)。它不会像完整的文档那样占用额外的资源。

(1) document.createDocumentFragment()

9. Attr类型

特点
nodeType = 2
nodeName为特性的名称
nodeValue为特性的值
parentNode = null
在HTML中不支持子节点,在XML中子节点可以是Text或EntityReference
(1) name、value、specified

特性名称、特性值、用于表示特性是否已指定的布尔值。

(2) document.createAttribute()

接收1个参数:特性名称。创建新的特性节点。

(3) 将新特性添加到元素节点的方法

即元素的element.setAttributeNode()方法。

二、DOM操作技术

1. 动态脚本

静态脚本:script标签里面或script标签src引用。

动态脚本:在页面加载完毕后的某个时间加载的脚本。

(1) 方法

img

注意:实际上这样执行代码与在全局作用域中把相同的字符串传递给eval()是一样的。

2. 动态样式

静态样式:link标签或style标签。

动态脚本:在页面加载完毕后的某个时间加载的样式。

(1) 使用link的方法(异步的)

img

(2) 使用style的方法

img

注意:这种方式可以实时地看到页面变化。

3. 操作表格

可以使用<table>元素的属性和方法,通过DOM技术向页面中插入表格。

4. 使用NodeList

NodeList、NamedNodeMap、HTMLCollection,三者都是动态的。所有的NodeList对象都是在访问DOM文档时实时运行的查询,其内部的元素集合会随文档结构改变而更新。

所以,会存在下面的bug:

img

解决此bug的方法就是用一个变量存储原始的length。


end -