JavaScript
十、DOM
针对HTML和XML文档的一个API,javascript对其实现。
10.1 节点层次
10.1.1 Node类型
- DOM1 级定义了一个Node接口,所有节点类型都实现该接口
- 每个节点类型都有nodeType属性
并不是所有节点类型都支持- Node.ELEMENT_NODE——1
- Node.ATTRIBBUTE_NODE——2
- Node.TEXT_NODE——3
- Node.CDATA_SECTION_NODE——4
- Node.ENTITY_REFERENCE_NODE——5
- Node.ENTITY_NODE——6
- Node.PROCESSING_INSTRUCTION_NODE——7
- Node.COMMENT_NODE——8
- Node.DOCUMENT_NODE——9
- Node.DOCUMENT_TYPE_NODE——10
- Node.DOCUMENT_FRAGMENT_NODE——11
- Node.NOTATION_NODE——12
10.1.1.1 nodeName和nodeValue属性
- 属性值取决于节点类型
- 元素节点的nodeName为标签名,nodeValue为null
10.1.1.2 节点关系
- childNodes
保存NodeList对象,有序的,不是Array的实例,动态的- 两种访问方式
- 方括号 childNodes[index]
- item()方法 childNodes.item(index)
- length属性
- 使用Array.prototype.slice(someNode.childNodes,0)可以将NodeList对象转化为数组
- 包含在childNodes列表中的所有节点都具有相同的父节点
- 两种访问方式
- parentNode
- previousSibling和nextSibling
子节点列表中的上一个和下一个节点 - firstChild和lastChild
- hasChildNodes()
- ownerDocument
指向最顶端的文档节点
10.1.1.3 操纵节点
- appendChild(newNode)
将新节点插入子节点列表的最后位置 - insertBefore(newNode, accordingNode)
将新节点插入某个节点之前 - replaceChild(newNode, initialNode)
- removeChild(initialNode)
10.1.1.4 其他方法
- cloneNode(bool)
- true
深复制,包括子节点树、特性 - false
浅复制
- true
- normalize()
将子节点的空文本节点删除或合并两个相邻的文本节点。
10.1.2 Document类型
- Document类型表示整个文档
- document对象是window对象的一个属性
- Document节点的特征
- 子节点可能是一个documentType(最多一个)、element(最多一个)、processingInstruction或Comment
10.1.2.1 document子节点
- 指向<html>元素
- document.documentElement
- 指向<body>元素
- document.body
- 指向<!DOCTYPE>元素
- document.doctype
- Document类型是只读的,在document上调用appendChild()等方法操纵节点不起作用且不需要,因为只能有一个元素节点且一般都已存在
10.1.2.2 文档信息
- document.title
指向<title>元素 - 网页请求
HTTP请求头中的信息- document.URL
- document.domain
域名- 不同子域之间不能通讯
- www.wrox.com和其内嵌框架的页面为p2p.wrox.com,可以将domain设置为wrox.com,则可以相互通信
- 设置为wrox.com(松散)之后就无法再修改为p2p.wrox.com(紧绷)
- document.referrer
来源页面
10.1.2.3 查找元素
- getElementById()
- getElementsByTagName()
- 返回值为HTMLCollection实例
- item()
- namedItem()
- 方括号
- number 内部调用item()
- string 内部调用namedItem()
- 返回所有元素 getElementsByTagName(" * ")
- 返回值为HTMLCollection实例
- getElementsByName()
10.1.2.4 特殊集合
HTMLCollection对象
- document.anchors 所有带name特性的<a>元素
- document.applets
- document.forms
- document.images
- document.links 所有带href特性的<a>元素
10.1.2.5 DOM一致性检测
检测浏览器对于DOM的实现
- document.implementation属性
- hasFeature(string feature, string version)
浏览器支持给定名称和版本的功能,则返回true。- 浏览器可能在没有实现某些功能的情况下返回true,最好同时进行能力检测
- hasFeature(string feature, string version)
10.1.2.6 文档写入
- document.write() 和document.writeln()
- 字符串中的html标记也将被正确解析为html
- 在页面加载过程中写入则是添加
- 在页面加载完毕后写入则是重写页面,window.onload
<html>
<head>
<script>
window.onload=function(){
document.write("<p>重写页面</p>");
}
</script>
</head>
<body>
<p>test</p>
<script>
document.write("<p>添加内容</p>");
</script>
</body>
</html>
- document.open()和document.close()
- 打开和关闭网页输出流
10.1.3 Element类型
- tagName和nodeName
HTML中以全部大写表示,XML中与源码一致
10.1.3.1 HTML元素
- 每个HTML元素都存在的标准特性
- id
- title
- lang
- dir
语言的方向,ltr 为从左到右 - className
10.1.3.2 取得特性
- getAttribute(name)
- 接收的特性名称参数不区分大小写
- 返回字符串表示的特性值
- 任何元素的公认特性会以属性的形式添加到DOM对象中,可以不调用getAttribute()方法直接获得特性值
- div.id
- style和onclick等,用特性获取到的是相应的字符串表示,而用属性则获取到的是对象
10.1.3.3 设置特性
- setAttribute(name, value)
- 若特性名称不存在,则创建它
- 也可以通过给DOM对象的相应属性赋值的方式设置特性值
- removeAttribute(name)
10.1.3.4 attributes属性
返回一个NamedNodeMap对象,元素的每一个特性都由一个节点表示。主要用于遍历元素特性
- getNamedItem(name)
- removeNamedItem(name)
- setNamedItem(node)
- item(pos)
- specified
如果对元素的某个特性进行了设置,则返回true
10.1.3.5 创建元素
- document.createElement(tagName)
只创建元素,未将元素添加进文档树中
10.1.3.6 元素子节点
- 元素也支持getElementsByTagName() 方法,但只返回当前元素的后代
10.1.4 Text类型
- 访问文本
- nodeValue和data
- 修改文本
会对输入文本进行HTML编码,默认一个元素只有一个文本节点。- appendData(text)
- deleteData(offset, count)
- insertData(offset, text)
- replaceData(offset, count, text)
- splitText(offset)
按指定位置将文本节点分割为两个文本节点,该方法返回一个新文本节点。0~offset为原文本节点 - substringData(offset, count)
- 文本长度
- 文本节点的length属性
- nodeValue及data的length属性
- 默认情况下,每个可以包含内容的元素最多只能有一个文本节点,且必须确实有内容存在
10.1.4.1 创建文本节点
- document.createTextNode(text)
- 多次调用可以创建多个文本节点并添加到父节点中,这种情况只出现在DOM操作中
10.1.4.2 规范化文本节点
- element.normalize()
10.1.4.3 分割文本节点
- element.splitText(offset)
10.1.5 Comment类型
- 注释节点,与文本节点类似,除了没有与splitText()对应的方法之外
没有子节点 - 注释节点必须是<html>元素的后代才能保证访问得到
- document.createComment()
10.1.6 CDATASection类型
- 只针对XML文档,表示CDATA(Unparsed Character Data)区域,类似文本节点,除了没有与splitText()对应的方法之外
10.1.7 DocumentType类型
- 不能动态创建,只能通过解析文档代码的方式创建
- name
文档类型的名称,例如HTML或XML - entities
HTML下为空的NamedNodeMap对象 - notations
HTML下为空的NamedNodeMap对象
10.1.8 DocumentFragment类型
- 在文档中没有对应的标记
- 父节点为null
- 可作为仓库使用,在里面保存可能会添加到文档中的节点
- document.createDocumentFragment()
- 用于一次性添加多个节点,避免多次渲染
10.1.9 Attr类型
- 存在于元素的attributes属性中的节点
- 父节点为null
- 不是DOM文档树中的一部分
- name
- value
- specified
- bool值,表示特性是否设置
- document.createAttribute()
10.2 DOM操作技术
10.2.1 动态脚本
通过DOM操作添加<script>元素插入javascript代码
- 外部代码
- 元素的src属性指定外部文件
- 添加进DOM文档树后才会执行代码
- 内部代码
- 添加文本节点的方式设置内部代码
- 元素的text属性设置内部代码
- 类似eval()
10.2.2 动态样式
通过DOM操作嵌入CSS样式
- 外部样式
- 通过<link>元素引入样式文件
- rel stylesheet
- type text/css
- href
- 通过<link>元素引入样式文件
- 内部样式
- 添加文本节点的方式设置内部样式代码
- 元素的styleSheet属性的cssText属性设置内部样式
10.2.3 操作表格
- <table>
- caption
表格标题 - tBodies
- tFoot
- tHead
- rows
- createTHead()
- createTFoot()
- createCaption()
- deleteTHead()
- deleteTFoot()
- deleteCaption()
- deleteRow(pos)
- insertRow(pos)
- caption
- <tbody>
- deleteRow(pos)
- insertRow(pos)
- <tr>
- cells
- deleteCell(pos)
- insertCell(pos)
10.2.4 使用NodeList
- 遍历NodeList、NamedNodeMap和HTMLCollection
- 都是动态的
- 在循环中进行改变NodeList长度的操作会造成无限循环
- 用第二个变量将length的值获取并固定下来可以避免死循环
- 每次访问NodeList都会运行一次基于文档的查询